From 13cb1a7a4ddf017a4d603a874e074770005fd81d Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 9 Jun 2014 01:27:03 -0700 Subject: [PATCH 001/222] prototype for RPC iterable --- pythonjs/python_to_pythonjs.py | 21 ++++++++++++++++- pythonjs/pythonjs.js | 15 ++++++++++++- pythonjs/pythonjs.py | 12 ++++++++-- pythonjs/runtime/builtins.py | 6 +++++ regtests/rpc/async_iter.py | 16 +++++++++++++ regtests/rpc/hello_server_as.py | 5 +++++ regtests/run.py | 40 ++++++++++++++++++++++++++------- 7 files changed, 103 insertions(+), 12 deletions(-) create mode 100644 regtests/rpc/async_iter.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 8818f75..efdd2ba 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2857,7 +2857,7 @@ def visit_Break(self, node): writer.write('break') def visit_For(self, node): - log('for loop:') + if self._cache_for_body_calls: ## TODO add option for this for n in node.body: calls = collect_calls(n) @@ -2871,6 +2871,25 @@ def visit_For(self, node): c.constant = True self._call_ids += 1 + if self._with_rpc_name and isinstance(node.iter, ast.Attribute) and isinstance(node.iter.value, ast.Name) and node.iter.value.id == self._with_rpc_name: + target = self.visit(node.target) + writer.write('def __rpc_loop__():') + writer.push() + writer.write( '%s = __rpc_iter__(%s, "%s")' %(target, self._with_rpc, node.iter.attr) ) + writer.write( 'if %s == "__STOP_ITERATION__": __continue__()' %target) + writer.write( 'else:') + writer.push() + map( self.visit, node.body ) + writer.write( '__rpc_loop__()') + writer.pull() + writer.pull() + writer.write('__rpc_loop__()') + + writer.write('def __continue__():') ## because this def comes after, it needs to be `hoisted` up by the javascript VM + writer.push() + return None + + iterid = self._iter_ids self._iter_ids += 1 diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 0cff487..7c28880 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -3853,4 +3853,17 @@ __rpc__ = function(url, func, args) { __rpc__.NAME = "__rpc__"; __rpc__.args_signature = ["url", "func", "args"]; __rpc__.kwargs_signature = { }; -__rpc__.types_signature = { }; \ No newline at end of file +__rpc__.types_signature = { }; +__rpc_iter__ = function(url, attr) { + var req; + req = new XMLHttpRequest(); + req.open("POST", url, false); + req.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + req.send(JSON.stringify(__jsdict([["iter", attr]]))); + return JSON.parse(req.responseText); +} + +__rpc_iter__.NAME = "__rpc_iter__"; +__rpc_iter__.args_signature = ["url", "attr"]; +__rpc_iter__.kwargs_signature = { }; +__rpc_iter__.types_signature = { }; \ No newline at end of file diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 94f41a4..c139a0c 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -22,6 +22,7 @@ class JSGenerator(NodeVisitor): #, inline_function.Inliner): def __init__(self, requirejs=True, insert_runtime=True, webworker=False): #writer = code_writer.Writer() #self.setup_inliner( writer ) + self._func_expressions = False self._indent = 0 self._global_functions = {} self._function_stack = [] @@ -169,14 +170,21 @@ def _visit_function(self, node): ## this style will not make function global to the eval context in NodeJS ## #buffer = self.indent() + 'function %s(%s) {\n' % (node.name, ', '.join(args)) ## this is required for eval to be able to work in NodeJS, note there is no var keyword. - buffer = self.indent() + '%s = function(%s) {\n' % (node.name, ', '.join(args)) + + if self._func_expressions: + buffer = self.indent() + '%s = function(%s) {\n' % (node.name, ', '.join(args)) + else: + buffer = self.indent() + 'function %s(%s) {\n' % (node.name, ', '.join(args)) if self._requirejs and node.name not in self._exports: self._exports.add( node.name ) else: - buffer = self.indent() + 'var %s = function(%s) {\n' % (node.name, ', '.join(args)) + if self._func_expressions: + buffer = self.indent() + 'var %s = function(%s) {\n' % (node.name, ', '.join(args)) + else: + buffer = self.indent() + 'function %s(%s) {\n' % (node.name, ', '.join(args)) self.push() body = list() diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 81014c4..2aa9031 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -1487,3 +1487,9 @@ def __rpc__( url, func, args): req.send( JSON.stringify({'call':func, 'args':args}) ) return JSON.parse( req.responseText ) + def __rpc_iter__( url, attr): + req = new( XMLHttpRequest() ) + req.open('POST', url, False) ## false is sync + req.setRequestHeader("Content-Type", "application/json;charset=UTF-8") + req.send( JSON.stringify({'iter':attr}) ) + return JSON.parse( req.responseText ) diff --git a/regtests/rpc/async_iter.py b/regtests/rpc/async_iter.py new file mode 100644 index 0000000..3cc9243 --- /dev/null +++ b/regtests/rpc/async_iter.py @@ -0,0 +1,16 @@ +"""iteration""" +## note mycollection is hard coded in run.py as `range(10)` + +def main(): + a = [] + with rpc('http://localhost:8080') as server: + for ob in server.mycollection: + a.append( ob ) + + print(a) + TestError( len(a)==10 ) + TestError( a[0]==0 ) + TestError( a[1]==1 ) + TestError( a[2]==2 ) + + \ No newline at end of file diff --git a/regtests/rpc/hello_server_as.py b/regtests/rpc/hello_server_as.py index 52c7021..722f7e2 100644 --- a/regtests/rpc/hello_server_as.py +++ b/regtests/rpc/hello_server_as.py @@ -1,5 +1,8 @@ """simple rpc call""" +def f(v): + return v * 2 + def main(): a = 'hello' b = 'server' @@ -8,8 +11,10 @@ def main(): with rpc('http://localhost:8080') as server: c = server.concat( a, b ) z = server.add( x, y ) + w = f(z) TestError( c == 'helloserver' ) TestError( z == 300 ) + TestError( w == 600 ) \ No newline at end of file diff --git a/regtests/run.py b/regtests/run.py index 7c25392..dfa64db 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -36,11 +36,19 @@ ] +mycollection = range(10) +__clients = {} ## keeps track of iterator indices + def httpd_reply( env, start_response ): + path = env['PATH_INFO'] host = env['HTTP_HOST'] client = env['REMOTE_ADDR'] arg = env['QUERY_STRING'] + + if client not in __clients: + __clients[ client ] = {} + length = 0 if 'CONTENT_LENGTH' in env: length = int(env['CONTENT_LENGTH']) @@ -49,12 +57,29 @@ def httpd_reply( env, start_response ): print('http_reply ->', path, host, client, arg, data) msg = json.loads( data ) - assert 'call' in msg - assert 'args' in msg - if msg['call'] == 'concat': - res = ''.join( msg['args'] ) - elif msg['call'] == 'add': - res = msg['args'][0] + msg['args'][1] + if 'call' in msg: + assert 'args' in msg + if msg['call'] == 'concat': + res = ''.join( msg['args'] ) + elif msg['call'] == 'add': + res = msg['args'][0] + msg['args'][1] + else: + raise NotImplementedError( msg ) + elif 'iter' in msg: + name = msg['iter'] + assert name in globals() + if name not in __clients[ client ]: + __clients[ client ][name] = 0 + index = __clients[ client ][name] + iterable = globals()[name] + if index == len(iterable): + index = 0 + res = '__STOP_ITERATION__' + else: + res = iterable[ index ] + index += 1 + __clients[ client ][name] = index + else: raise NotImplementedError( msg ) @@ -64,8 +89,7 @@ def httpd_reply( env, start_response ): httpd = wsgiref.simple_server.make_server( 'localhost', 8080, httpd_reply ) import threading -httpd = threading._start_new_thread( httpd.serve_forever, ()) -print(httpd) +thread_id = threading._start_new_thread( httpd.serve_forever, ()) def runnable(command): From 0c9f80865dbf14cf9cc8834b889cc67dd79b272d Mon Sep 17 00:00:00 2001 From: Shekhar Gulati Date: Mon, 9 Jun 2014 14:15:43 +0530 Subject: [PATCH 002/222] Added support for address in listen method I was trying to deploy the example PythonJS application on OpenShift(a Platform as a Service) but faced an issue where I need to specify the ipaddress in addition to port. In environments like OpenShift you can't bind to localhost as that is restricted. With the current implementation, a user can't specify the ip or address. Tornado API supports address https://github.com/tornadoweb/tornado/blob/master/tornado/web.py#L1707. After making this change I can run the sample app on OpenShift http://pythonjs-sgdemo.rhcloud.com/helloworld.html --- pythonjs/fakelibs/tornado.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pythonjs/fakelibs/tornado.py b/pythonjs/fakelibs/tornado.py index 83b8272..0aa02ec 100644 --- a/pythonjs/fakelibs/tornado.py +++ b/pythonjs/fakelibs/tornado.py @@ -70,7 +70,7 @@ def on_request(self, request, response): response.writeHead(404) response.end() - def listen(self, port): + def listen(self, port, address=""): print 'listening on:', port server = self[...] @@ -86,7 +86,7 @@ def listen(self, port): self.wss = wss self.wss.on('connection', self.on_ws_connection) - server.listen( port ) + server.listen( port , address) def on_ws_connection(self, ws): ## ws is a websocket client print 'new ws connection' @@ -153,4 +153,4 @@ def __init__(self): } } -tornado = _fake_tornado() \ No newline at end of file +tornado = _fake_tornado() From 2a4db2a9a05ba374bacc4dfe028cc73414328456 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 9 Jun 2014 01:50:47 -0700 Subject: [PATCH 003/222] merged Foxboron's fix for bad string encoding. --- pythonjs/pythonjs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index c139a0c..beff5b0 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -83,7 +83,9 @@ def visit_Module(self, node): lines.append( 'return __module__') lines.append('}) //end requirejs define') - return '\n'.join(lines) + #return '\n'.join(lines) + ## fixed by Foxboron + return '\n'.join(l if isinstance(l,str) else l.encode("utf-8") for l in lines) def visit_Expr(self, node): # XXX: this is UGLY From 1f64d84772d3ee92f1c9b059e8d5db147681bc62 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 9 Jun 2014 06:07:33 -0700 Subject: [PATCH 004/222] prototype for getting and setting remote attributes --- pythonjs/python_to_pythonjs.py | 8 + pythonjs/pythonjs.js | 369 ++++++++++++++++++--------------- pythonjs/runtime/builtins.py | 14 ++ regtests/rpc/attr.py | 15 ++ regtests/run.py | 24 ++- 5 files changed, 250 insertions(+), 180 deletions(-) create mode 100644 regtests/rpc/attr.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index efdd2ba..bcdd376 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1511,6 +1511,14 @@ def visit_Assign(self, node): else: raise SyntaxError(targets) + elif self._with_rpc_name and isinstance(target, Attribute) and isinstance(target.value, Name) and target.value.id == self._with_rpc_name: + writer.write('__rpc_set__(%s, "%s", %s)' %(self._with_rpc, target.attr, self.visit(node.value))) + return None + elif self._with_rpc_name and isinstance(node.value, Attribute) and isinstance(node.value.value, Name) and node.value.value.id == self._with_rpc_name: + writer.write('%s = __rpc_get__(%s, "%s")' %(self.visit(target), self._with_rpc, node.value.attr)) + return None + + ############################################# for target in targets: self._visit_assign_helper( node, target ) node = ast.Expr( value=target ) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 7c28880..ab79f14 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -11,7 +11,7 @@ if (( typeof(window) ) != "undefined") { if (( typeof(importScripts) ) == "function") { __WEBWORKER__ = true; } -__create_array__ = function() { +function __create_array__() { "Used to fix a bug/feature of Javascript where new Array(number)\n created a array with number of undefined elements which is not\n what we want"; var i, array; array = []; @@ -23,7 +23,7 @@ __create_array__ = function() { return array; } -__get__ = function(object, attribute, error_message) { +function __get__(object, attribute, error_message) { "Retrieve an attribute, method, property, or wrapper function.\n\n method are actually functions which are converted to methods by\n prepending their arguments with the current object. Properties are\n not functions!\n\n DOM support:\n http://stackoverflow.com/questions/14202699/document-createelement-not-working\n https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof\n\n Direct JavaScript Calls:\n if an external javascript function is found, and it was not a wrapper that was generated here,\n check the function for a 'cached_wrapper' attribute, if none is found then generate a new\n wrapper, cache it on the function, and return the wrapper.\n "; if (( object ) === null) { if (error_message) { @@ -48,7 +48,7 @@ __get__ = function(object, attribute, error_message) { return object.cached_wrapper; } else { if ({}.toString.call(object) === '[object Function]') { - var wrapper = function(args, kwargs) { + function wrapper(args, kwargs) { var i, arg, keys; if (( args ) != null) { i = 0; @@ -96,7 +96,7 @@ __get__ = function(object, attribute, error_message) { if (( __NODEJS__ ) === false && ( __WEBWORKER__ ) === false) { if (object instanceof HTMLDocument) { if (typeof(attr) === 'function') { - var wrapper = function(args, kwargs) { + function wrapper(args, kwargs) { return attr.apply(object, args); } @@ -108,7 +108,7 @@ __get__ = function(object, attribute, error_message) { } else { if (object instanceof HTMLElement) { if (typeof(attr) === 'function') { - var wrapper = function(args, kwargs) { + function wrapper(args, kwargs) { return attr.apply(object, args); } @@ -126,7 +126,7 @@ __get__ = function(object, attribute, error_message) { if (attr.prototype instanceof Object && ( Object.keys(attr.prototype).length ) > 0) { return attr; } - var wrapper = function(args, kwargs) { + function wrapper(args, kwargs) { var i, arg, keys; if (( args ) != null) { i = 0; @@ -164,7 +164,7 @@ __get__ = function(object, attribute, error_message) { return wrapper; } else { if (attr.is_classmethod) { - var method = function() { + function method() { var args; args = Array.prototype.slice.call(arguments); if (args[0] instanceof Array && {}.toString.call(args[1]) === '[object Object]' && ( args.length ) == 2) { @@ -200,7 +200,7 @@ __get__ = function(object, attribute, error_message) { if (( attribute ) in __class__.__unbound_methods__) { attr = __class__.__unbound_methods__[attribute]; if (attr.fastdef) { - var method = function(args, kwargs) { + function method(args, kwargs) { if (arguments && arguments[0]) { arguments[0].splice(0, 0, object); return attr.apply(this, arguments); @@ -210,7 +210,7 @@ __get__ = function(object, attribute, error_message) { } } else { - var method = function(args, kwargs) { + function method(args, kwargs) { if (( arguments.length ) == 0) { return attr([object], __NULL_OBJECT__); } else { @@ -242,7 +242,7 @@ __get__ = function(object, attribute, error_message) { return attr; } else { if (attr.fastdef) { - var method = function(args, kwargs) { + function method(args, kwargs) { if (arguments && arguments[0]) { arguments[0].splice(0, 0, object); return attr.apply(this, arguments); @@ -252,7 +252,7 @@ __get__ = function(object, attribute, error_message) { } } else { - var method = function(args, kwargs) { + function method(args, kwargs) { if (( arguments.length ) == 0) { return attr([object], __NULL_OBJECT__); } else { @@ -290,7 +290,7 @@ __get__ = function(object, attribute, error_message) { if (( attr ) !== undefined) { if ({}.toString.call(attr) === '[object Function]') { if (attr.fastdef) { - var method = function(args, kwargs) { + function method(args, kwargs) { if (arguments && arguments[0]) { arguments[0].splice(0, 0, object); return attr.apply(this, arguments); @@ -300,7 +300,7 @@ __get__ = function(object, attribute, error_message) { } } else { - var method = function(args, kwargs) { + function method(args, kwargs) { if (( arguments.length ) == 0) { return attr([object], __NULL_OBJECT__); } else { @@ -354,7 +354,7 @@ __get__ = function(object, attribute, error_message) { } } if (( attribute ) == "__getitem__") { - var wrapper = function(args, kwargs) { + function wrapper(args, kwargs) { return object[args[0]]; } @@ -362,7 +362,7 @@ __get__ = function(object, attribute, error_message) { return wrapper; } else { if (( attribute ) == "__setitem__") { - var wrapper = function(args, kwargs) { + function wrapper(args, kwargs) { object[args[0]] = args[1]; } @@ -374,7 +374,7 @@ __get__ = function(object, attribute, error_message) { return object.wrapped[attribute]; } if (( attribute ) == "__iter__" && object instanceof Object) { - var wrapper = function(args, kwargs) { + function wrapper(args, kwargs) { return new __ArrayIterator(Object.keys(object), 0); } @@ -382,7 +382,7 @@ __get__ = function(object, attribute, error_message) { return wrapper; } if (( attribute ) == "__contains__" && object instanceof Object) { - var wrapper = function(args, kwargs) { + function wrapper(args, kwargs) { return ( Object.keys(object).indexOf(args[0]) ) != -1; } @@ -400,7 +400,7 @@ __get__ = function(object, attribute, error_message) { } } -_get_upstream_attribute = function(base, attr) { +function _get_upstream_attribute(base, attr) { if (( attr ) in base) { return base[attr]; } @@ -412,7 +412,7 @@ _get_upstream_attribute = function(base, attr) { } } -_get_upstream_property = function(base, attr) { +function _get_upstream_property(base, attr) { if (( attr ) in base.__properties__) { return base.__properties__[attr]; } @@ -424,7 +424,7 @@ _get_upstream_property = function(base, attr) { } } -__set__ = function(object, attribute, value) { +function __set__(object, attribute, value) { "\n __setattr__ is always called when an attribute is set,\n unlike __getattr__ that only triggers when an attribute is not found,\n this asymmetry is in fact part of the Python spec.\n note there is no __setattribute__\n\n In normal Python a property setter is not called before __setattr__,\n this is bad language design because the user has been more explicit\n in having the property setter.\n\n In PythonJS, property setters are called instead of __setattr__.\n "; if (( "__class__" ) in object && ( object.__class__.__setters__.indexOf(attribute) ) != -1) { object[attribute] = value; @@ -437,7 +437,7 @@ __set__ = function(object, attribute, value) { } } -__getargs__ = function(func_name, signature, args, kwargs) { +function __getargs__(func_name, signature, args, kwargs) { "Based on ``signature`` and ``args``, ``kwargs`` parameters retrieve\n the actual parameters.\n\n This will set default keyword arguments and retrieve positional arguments\n in kwargs if their called as such"; if (( args ) === null) { args = []; @@ -496,7 +496,7 @@ KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Obj ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError"; AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError"; RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError"; -__getattr__ = function(ob, a) { +function __getattr__(ob, a) { if (ob.__getattr__) { return ob.__getattr__(a); } @@ -507,7 +507,7 @@ __getattr__.args_signature = ["ob", "a"]; __getattr__.kwargs_signature = { }; __getattr__.types_signature = { }; __getattr__.pythonscript_function = true; -__test_if_true__ = function(ob) { +function __test_if_true__(ob) { if (( ob ) === true) { return true; } else { @@ -548,7 +548,7 @@ __test_if_true__.args_signature = ["ob"]; __test_if_true__.kwargs_signature = { }; __test_if_true__.types_signature = { }; __test_if_true__.pythonscript_function = true; -__replace_method = function(ob, a, b) { +function __replace_method(ob, a, b) { if (( typeof(ob) ) == "string") { return ob.split(a).join(b); } else { @@ -561,7 +561,7 @@ __replace_method.args_signature = ["ob", "a", "b"]; __replace_method.kwargs_signature = { }; __replace_method.types_signature = { }; __replace_method.pythonscript_function = true; -__split_method = function(ob, delim) { +function __split_method(ob, delim) { if (( typeof(ob) ) == "string") { if (( delim ) === undefined) { return ob.split(" "); @@ -582,7 +582,7 @@ __split_method.args_signature = ["ob", "delim"]; __split_method.kwargs_signature = { }; __split_method.types_signature = { }; __split_method.pythonscript_function = true; -__is_typed_array = function(ob) { +function __is_typed_array(ob) { if (__test_if_true__(ob instanceof Int8Array || ob instanceof Uint8Array)) { return true; } else { @@ -606,7 +606,7 @@ __is_typed_array.NAME = "__is_typed_array"; __is_typed_array.args_signature = ["ob"]; __is_typed_array.kwargs_signature = { }; __is_typed_array.types_signature = { }; -__js_typed_array = function(t, a) { +function __js_typed_array(t, a) { var arr; if (( t ) == "i") { arr = new Int32Array(a.length); @@ -619,7 +619,7 @@ __js_typed_array.NAME = "__js_typed_array"; __js_typed_array.args_signature = ["t", "a"]; __js_typed_array.kwargs_signature = { }; __js_typed_array.types_signature = { }; -__contains__ = function(ob, a) { +function __contains__(ob, a) { var t; t = typeof(ob); if (( t ) == "string") { @@ -661,7 +661,7 @@ __contains__.NAME = "__contains__"; __contains__.args_signature = ["ob", "a"]; __contains__.kwargs_signature = { }; __contains__.types_signature = { }; -__add_op = function(a, b) { +function __add_op(a, b) { var c, t; t = typeof(a); if (__test_if_true__(( t ) == "string" || ( t ) == "number")) { @@ -686,7 +686,7 @@ __add_op.NAME = "__add_op"; __add_op.args_signature = ["a", "b"]; __add_op.kwargs_signature = { }; __add_op.types_signature = { }; -__jsdict = function(items) { +function __jsdict(items) { var d, key; d = {}; var __iter2 = items; @@ -706,7 +706,7 @@ __jsdict.NAME = "__jsdict"; __jsdict.args_signature = ["items"]; __jsdict.kwargs_signature = { }; __jsdict.types_signature = { }; -__jsdict_get = function(ob, key, default_value) { +function __jsdict_get(ob, key, default_value) { if (__test_if_true__(ob instanceof Object)) { if (__test_if_true__(key in ob)) { return ob[((key.__uid__) ? key.__uid__ : key)]; @@ -725,7 +725,7 @@ __jsdict_get.NAME = "__jsdict_get"; __jsdict_get.args_signature = ["ob", "key", "default_value"]; __jsdict_get.kwargs_signature = { }; __jsdict_get.types_signature = { }; -__jsdict_set = function(ob, key, value) { +function __jsdict_set(ob, key, value) { if (__test_if_true__(ob instanceof Object)) { ob[((key.__uid__) ? key.__uid__ : key)] = value; } else { @@ -737,7 +737,7 @@ __jsdict_set.NAME = "__jsdict_set"; __jsdict_set.args_signature = ["ob", "key", "value"]; __jsdict_set.kwargs_signature = { }; __jsdict_set.types_signature = { }; -__jsdict_keys = function(ob) { +function __jsdict_keys(ob) { if (__test_if_true__(ob instanceof Object)) { return Object.keys( ob ); } else { @@ -749,7 +749,7 @@ __jsdict_keys.NAME = "__jsdict_keys"; __jsdict_keys.args_signature = ["ob"]; __jsdict_keys.kwargs_signature = { }; __jsdict_keys.types_signature = { }; -__jsdict_values = function(ob) { +function __jsdict_values(ob) { var arr, value; if (__test_if_true__(ob instanceof Object)) { arr = []; @@ -772,7 +772,7 @@ __jsdict_values.NAME = "__jsdict_values"; __jsdict_values.args_signature = ["ob"]; __jsdict_values.kwargs_signature = { }; __jsdict_values.types_signature = { }; -__jsdict_items = function(ob) { +function __jsdict_items(ob) { var arr, value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; @@ -795,7 +795,7 @@ __jsdict_items.NAME = "__jsdict_items"; __jsdict_items.args_signature = ["ob"]; __jsdict_items.kwargs_signature = { }; __jsdict_items.types_signature = { }; -__jsdict_pop = function(ob, key, _kwargs_) { +function __jsdict_pop(ob, key, _kwargs_) { var v; if (!( _kwargs_ instanceof Object )) {; var _kwargs_ = {ob: arguments[0],key: arguments[1],_default: arguments[2]}; @@ -830,7 +830,7 @@ __jsdict_pop.NAME = "__jsdict_pop"; __jsdict_pop.args_signature = ["ob", "key", "_default"]; __jsdict_pop.kwargs_signature = { _default:null }; __jsdict_pop.types_signature = { _default:"None" }; -__object_keys__ = function(ob) { +function __object_keys__(ob) { var arr; "\n notes:\n . Object.keys(ob) will not work because we create PythonJS objects using `Object.create(null)`\n . this is different from Object.keys because it traverses the prototype chain.\n "; arr = []; @@ -842,7 +842,7 @@ __object_keys__.NAME = "__object_keys__"; __object_keys__.args_signature = ["ob"]; __object_keys__.kwargs_signature = { }; __object_keys__.types_signature = { }; -__bind_property_descriptors__ = function(o, klass) { +function __bind_property_descriptors__(o, klass) { var prop, desc; var __iter5 = klass.__properties__; if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } @@ -870,8 +870,8 @@ __bind_property_descriptors__.NAME = "__bind_property_descriptors__"; __bind_property_descriptors__.args_signature = ["o", "klass"]; __bind_property_descriptors__.kwargs_signature = { }; __bind_property_descriptors__.types_signature = { }; -__generate_getter__ = function(klass, o, n) { - var __lambda__ = function() { +function __generate_getter__(klass, o, n) { + function __lambda__() { return klass.__properties__[((n.__uid__) ? n.__uid__ : n)][(("get".__uid__) ? "get".__uid__ : "get")]([o], __jsdict([])); } @@ -886,8 +886,8 @@ __generate_getter__.NAME = "__generate_getter__"; __generate_getter__.args_signature = ["klass", "o", "n"]; __generate_getter__.kwargs_signature = { }; __generate_getter__.types_signature = { }; -__generate_setter__ = function(klass, o, n) { - var __lambda__ = function(v) { +function __generate_setter__(klass, o, n) { + function __lambda__(v) { return klass.__properties__[((n.__uid__) ? n.__uid__ : n)][(("set".__uid__) ? "set".__uid__ : "set")]([o, v], __jsdict([])); } @@ -902,7 +902,7 @@ __generate_setter__.NAME = "__generate_setter__"; __generate_setter__.args_signature = ["klass", "o", "n"]; __generate_setter__.kwargs_signature = { }; __generate_setter__.types_signature = { }; -__sprintf = function(fmt, args) { +function __sprintf(fmt, args) { var chunks, item, arr; if (__test_if_true__(args instanceof Array)) { chunks = fmt.split("%s"); @@ -942,7 +942,7 @@ __sprintf.NAME = "__sprintf"; __sprintf.args_signature = ["fmt", "args"]; __sprintf.kwargs_signature = { }; __sprintf.types_signature = { }; -__create_class__ = function(class_name, parents, attrs, props) { +function __create_class__(class_name, parents, attrs, props) { var f, klass, prop; "Create a PythonScript class"; klass = Object.create(null); @@ -994,7 +994,7 @@ __create_class__ = function(class_name, parents, attrs, props) { Array.prototype.push.apply(klass.__setters__, base.__setters__); Array.prototype.push.apply(klass.__all_method_names__, base.__all_method_names__); } - var __call__ = function() { + function __call__() { var has_getattr, wrapper, object, has_getattribute; "Create a PythonJS object"; object = Object.create(null); @@ -1045,7 +1045,7 @@ __create_class__.NAME = "__create_class__"; __create_class__.args_signature = ["class_name", "parents", "attrs", "props"]; __create_class__.kwargs_signature = { }; __create_class__.types_signature = { }; -type = function(args, kwargs) { +function type(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{"bases": null, "class_dict": null},args:["ob_or_class_name", "bases", "class_dict"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1071,7 +1071,7 @@ type.args_signature = ["ob_or_class_name", "bases", "class_dict"]; type.kwargs_signature = { bases:null,class_dict:null }; type.types_signature = { bases:"None",class_dict:"None" }; type.pythonscript_function = true; -hasattr = function(args, kwargs) { +function hasattr(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["ob", "attr"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1091,7 +1091,7 @@ hasattr.args_signature = ["ob", "attr"]; hasattr.kwargs_signature = { }; hasattr.types_signature = { }; hasattr.pythonscript_function = true; -getattr = function(args, kwargs) { +function getattr(args, kwargs) { var prop; var __sig__, __args__; __sig__ = { kwargs:{"property": false},args:["ob", "attr", "property"] }; @@ -1122,7 +1122,7 @@ getattr.args_signature = ["ob", "attr", "property"]; getattr.kwargs_signature = { property:false }; getattr.types_signature = { property:"False" }; getattr.pythonscript_function = true; -setattr = function(args, kwargs) { +function setattr(args, kwargs) { var prop; var __sig__, __args__; __sig__ = { kwargs:{"property": false},args:["ob", "attr", "value", "property"] }; @@ -1154,7 +1154,7 @@ setattr.args_signature = ["ob", "attr", "value", "property"]; setattr.kwargs_signature = { property:false }; setattr.types_signature = { property:"False" }; setattr.pythonscript_function = true; -issubclass = function(args, kwargs) { +function issubclass(args, kwargs) { var i, bases; var __sig__, __args__; __sig__ = { kwargs:{},args:["C", "B"] }; @@ -1186,7 +1186,7 @@ issubclass.args_signature = ["C", "B"]; issubclass.kwargs_signature = { }; issubclass.types_signature = { }; issubclass.pythonscript_function = true; -isinstance = function(args, kwargs) { +function isinstance(args, kwargs) { var ob_class; var __sig__, __args__; __sig__ = { kwargs:{},args:["ob", "klass"] }; @@ -1223,7 +1223,7 @@ isinstance.args_signature = ["ob", "klass"]; isinstance.kwargs_signature = { }; isinstance.types_signature = { }; isinstance.pythonscript_function = true; -int = function(args, kwargs) { +function int(args, kwargs) { ; var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; @@ -1247,7 +1247,7 @@ int.args_signature = ["a"]; int.kwargs_signature = { }; int.types_signature = { }; int.pythonscript_function = true; -float = function(args, kwargs) { +function float(args, kwargs) { ; var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; @@ -1271,7 +1271,7 @@ float.args_signature = ["a"]; float.kwargs_signature = { }; float.types_signature = { }; float.pythonscript_function = true; -round = function(args, kwargs) { +function round(args, kwargs) { var y, x, c, b; var __sig__, __args__; __sig__ = { kwargs:{},args:["a", "places"] }; @@ -1309,7 +1309,7 @@ round.args_signature = ["a", "places"]; round.kwargs_signature = { }; round.types_signature = { }; round.pythonscript_function = true; -str = function(args, kwargs) { +function str(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["s"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1331,9 +1331,9 @@ str.args_signature = ["s"]; str.kwargs_signature = { }; str.types_signature = { }; str.pythonscript_function = true; -_setup_str_prototype = function(args, kwargs) { +function _setup_str_prototype(args, kwargs) { "\n Extend JavaScript String.prototype with methods that implement the Python str API.\n The decorator @String.prototype.[name] assigns the function to the prototype,\n and ensures that the special 'this' variable will work.\n "; - var func = function(a) { + function func(a) { if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1346,7 +1346,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(index) { + function func(index) { if (( index ) < 0) { var __left10, __right11; __left10 = this.length; @@ -1362,7 +1362,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(self) { + function func(self) { return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } @@ -1371,7 +1371,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(idx) { + function func(idx) { if (( idx ) < 0) { var __left12, __right13; __left12 = this.length; @@ -1387,7 +1387,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "__getitem__", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function() { + function func() { return this.length; } @@ -1396,7 +1396,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(start, stop, step) { + function func(start, stop, step) { ; if (__test_if_true__(( start ) === undefined && ( stop ) === undefined && ( step ) == -1)) { return this.split("").reverse().join(""); @@ -1416,7 +1416,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "__getslice__", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function() { + function func() { return this.split("\n"); } @@ -1425,7 +1425,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "splitlines", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function() { + function func() { return this.trim(); } @@ -1434,7 +1434,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "strip", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(a) { + function func(a) { if (( this.substring(0, a.length) ) == a) { return true; } else { @@ -1447,7 +1447,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "startswith", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(a) { + function func(a) { if (( this.substring((this.length - a.length), this.length) ) == a) { return true; } else { @@ -1460,7 +1460,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "endswith", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(a) { + function func(a) { var i, arr, out; out = ""; if (__test_if_true__(a instanceof Array)) { @@ -1487,7 +1487,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "join", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function() { + function func() { return this.toUpperCase(); } @@ -1496,7 +1496,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "upper", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function() { + function func() { return this.toLowerCase(); } @@ -1505,7 +1505,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "lower", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(a) { + function func(a) { var i; i = this.indexOf(a); if (( i ) == -1) { @@ -1522,7 +1522,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "index", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(a) { + function func(a) { return this.indexOf(a); } @@ -1531,7 +1531,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "find", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function() { + function func() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; var __iter13 = this; @@ -1552,7 +1552,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "isdigit", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(encoding) { + function func(encoding) { return this; } @@ -1561,7 +1561,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "decode", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(encoding) { + function func(encoding) { return this; } @@ -1570,7 +1570,7 @@ _setup_str_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "encode", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(fmt) { + function func(fmt) { var keys, r; r = this; keys = Object.keys(fmt); @@ -1597,8 +1597,8 @@ _setup_str_prototype.kwargs_signature = { }; _setup_str_prototype.types_signature = { }; _setup_str_prototype.pythonscript_function = true; _setup_str_prototype(); -_setup_array_prototype = function(args, kwargs) { - var func = function() { +function _setup_array_prototype(args, kwargs) { + function func() { var i, item; i = 0; while (( i ) < this.length) { @@ -1618,7 +1618,7 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "jsify", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(a) { + function func(a) { if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1631,7 +1631,7 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function() { + function func() { return this.length; } @@ -1640,7 +1640,7 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(index) { + function func(index) { return this[((index.__uid__) ? index.__uid__ : index)]; } @@ -1649,7 +1649,7 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); - var __getitem__ = function(index) { + function __getitem__(index) { ; if (( index ) < 0) { var __left18, __right19; @@ -1665,7 +1665,7 @@ _setup_array_prototype = function(args, kwargs) { __getitem__.kwargs_signature = { }; __getitem__.types_signature = { }; Object.defineProperty(Array.prototype, "__getitem__", { enumerable:false,value:__getitem__,writeable:true,configurable:true }); - var __setitem__ = function(index, value) { + function __setitem__(index, value) { ; if (( index ) < 0) { var __left20, __right21; @@ -1681,7 +1681,7 @@ _setup_array_prototype = function(args, kwargs) { __setitem__.kwargs_signature = { }; __setitem__.types_signature = { }; Object.defineProperty(Array.prototype, "__setitem__", { enumerable:false,value:__setitem__,writeable:true,configurable:true }); - var func = function() { + function func() { return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } @@ -1690,7 +1690,7 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(start, stop, step) { + function func(start, stop, step) { var i, arr; if (__test_if_true__(( start ) === undefined && ( stop ) === undefined)) { arr = []; @@ -1716,7 +1716,7 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "__getslice__", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(item) { + function func(item) { this.push(item); return this; } @@ -1726,7 +1726,7 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); - var extend = function(other) { + function extend(other) { var __iter15 = other; if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { @@ -1741,7 +1741,7 @@ _setup_array_prototype = function(args, kwargs) { extend.kwargs_signature = { }; extend.types_signature = { }; Object.defineProperty(Array.prototype, "extend", { enumerable:false,value:extend,writeable:true,configurable:true }); - var func = function(item) { + function func(item) { var index; index = this.indexOf(item); this.splice(index, 1); @@ -1752,7 +1752,7 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "remove", { enumerable:false,value:func,writeable:true,configurable:true }); - var insert = function(index, obj) { + function insert(index, obj) { ; if (( index ) < 0) { var __left24, __right25; @@ -1768,7 +1768,7 @@ _setup_array_prototype = function(args, kwargs) { insert.kwargs_signature = { }; insert.types_signature = { }; Object.defineProperty(Array.prototype, "insert", { enumerable:false,value:insert,writeable:true,configurable:true }); - var index = function(obj) { + function index(obj) { return this.indexOf(obj); } @@ -1777,7 +1777,7 @@ _setup_array_prototype = function(args, kwargs) { index.kwargs_signature = { }; index.types_signature = { }; Object.defineProperty(Array.prototype, "index", { enumerable:false,value:index,writeable:true,configurable:true }); - var count = function(obj) { + function count(obj) { var a; a = 0; var __iter16 = this; @@ -1796,7 +1796,7 @@ _setup_array_prototype = function(args, kwargs) { count.kwargs_signature = { }; count.types_signature = { }; Object.defineProperty(Array.prototype, "count", { enumerable:false,value:count,writeable:true,configurable:true }); - var func = function(x, low, high) { + function func(x, low, high) { var a, mid; if (( low ) === undefined) { low = 0; @@ -1827,9 +1827,9 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "bisect", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(other) { + function func(other) { var f; - var __lambda__ = function(i) { + function __lambda__(i) { return ( other.indexOf(i) ) == -1; } @@ -1846,9 +1846,9 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "difference", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(other) { + function func(other) { var f; - var __lambda__ = function(i) { + function __lambda__(i) { return ( other.indexOf(i) ) != -1; } @@ -1865,7 +1865,7 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(other) { + function func(other) { var __iter17 = this; if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { @@ -1890,8 +1890,8 @@ _setup_array_prototype.kwargs_signature = { }; _setup_array_prototype.types_signature = { }; _setup_array_prototype.pythonscript_function = true; _setup_array_prototype(); -_setup_nodelist_prototype = function(args, kwargs) { - var func = function(a) { +function _setup_nodelist_prototype(args, kwargs) { + function func(a) { if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1904,7 +1904,7 @@ _setup_nodelist_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(NodeList.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function() { + function func() { return this.length; } @@ -1913,7 +1913,7 @@ _setup_nodelist_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(NodeList.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); - var func = function(index) { + function func(index) { return this[((index.__uid__) ? index.__uid__ : index)]; } @@ -1922,7 +1922,7 @@ _setup_nodelist_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(NodeList.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); - var __getitem__ = function(index) { + function __getitem__(index) { ; if (( index ) < 0) { var __left30, __right31; @@ -1938,7 +1938,7 @@ _setup_nodelist_prototype = function(args, kwargs) { __getitem__.kwargs_signature = { }; __getitem__.types_signature = { }; Object.defineProperty(NodeList.prototype, "__getitem__", { enumerable:false,value:__getitem__,writeable:true,configurable:true }); - var __setitem__ = function(index, value) { + function __setitem__(index, value) { ; if (( index ) < 0) { var __left32, __right33; @@ -1954,7 +1954,7 @@ _setup_nodelist_prototype = function(args, kwargs) { __setitem__.kwargs_signature = { }; __setitem__.types_signature = { }; Object.defineProperty(NodeList.prototype, "__setitem__", { enumerable:false,value:__setitem__,writeable:true,configurable:true }); - var func = function() { + function func() { return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } @@ -1963,7 +1963,7 @@ _setup_nodelist_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(NodeList.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); - var index = function(obj) { + function index(obj) { return this.indexOf(obj); } @@ -1982,7 +1982,7 @@ _setup_nodelist_prototype.pythonscript_function = true; if (__test_if_true__(( __NODEJS__ ) == false && ( __WEBWORKER__ ) == false)) { _setup_nodelist_prototype(); } -bisect = function(args, kwargs) { +function bisect(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{"low": null, "high": null},args:["a", "x", "low", "high"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2004,7 +2004,7 @@ bisect.args_signature = ["a", "x", "low", "high"]; bisect.kwargs_signature = { low:null,high:null }; bisect.types_signature = { low:"None",high:"None" }; bisect.pythonscript_function = true; -range = function(args, kwargs) { +function range(args, kwargs) { var i, arr; var __sig__, __args__; __sig__ = { kwargs:{},args:["num", "stop", "step"] }; @@ -2041,7 +2041,7 @@ range.args_signature = ["num", "stop", "step"]; range.kwargs_signature = { }; range.types_signature = { }; range.pythonscript_function = true; -xrange = function(args, kwargs) { +function xrange(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["num", "stop", "step"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2062,7 +2062,7 @@ xrange.args_signature = ["num", "stop", "step"]; xrange.kwargs_signature = { }; xrange.types_signature = { }; xrange.pythonscript_function = true; -sum = function(args, kwargs) { +function sum(args, kwargs) { var a; var __sig__, __args__; __sig__ = { kwargs:{},args:["arr"] }; @@ -2096,7 +2096,7 @@ __StopIteration_attrs = {}; __StopIteration_parents = []; __StopIteration_properties = {}; StopIteration = __create_class__("StopIteration", __StopIteration_parents, __StopIteration_attrs, __StopIteration_properties); -len = function(args, kwargs) { +function len(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["ob"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2131,7 +2131,7 @@ len.args_signature = ["ob"]; len.kwargs_signature = { }; len.types_signature = { }; len.pythonscript_function = true; -next = function(args, kwargs) { +function next(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["obj"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2150,7 +2150,7 @@ next.args_signature = ["obj"]; next.kwargs_signature = { }; next.types_signature = { }; next.pythonscript_function = true; -map = function(args, kwargs) { +function map(args, kwargs) { var arr, v; var __sig__, __args__; __sig__ = { kwargs:{},args:["func", "objs"] }; @@ -2181,7 +2181,7 @@ map.args_signature = ["func", "objs"]; map.kwargs_signature = { }; map.types_signature = { }; map.pythonscript_function = true; -filter = function(args, kwargs) { +function filter(args, kwargs) { var arr; var __sig__, __args__; __sig__ = { kwargs:{},args:["func", "objs"] }; @@ -2213,7 +2213,7 @@ filter.args_signature = ["func", "objs"]; filter.kwargs_signature = { }; filter.types_signature = { }; filter.pythonscript_function = true; -min = function(args, kwargs) { +function min(args, kwargs) { var a; var __sig__, __args__; __sig__ = { kwargs:{},args:["lst"] }; @@ -2248,7 +2248,7 @@ min.args_signature = ["lst"]; min.kwargs_signature = { }; min.types_signature = { }; min.pythonscript_function = true; -max = function(args, kwargs) { +function max(args, kwargs) { var a; var __sig__, __args__; __sig__ = { kwargs:{},args:["lst"] }; @@ -2283,7 +2283,7 @@ max.args_signature = ["lst"]; max.kwargs_signature = { }; max.types_signature = { }; max.pythonscript_function = true; -abs = function(args, kwargs) { +function abs(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["num"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2302,7 +2302,7 @@ abs.args_signature = ["num"]; abs.kwargs_signature = { }; abs.types_signature = { }; abs.pythonscript_function = true; -ord = function(args, kwargs) { +function ord(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["char"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2321,7 +2321,7 @@ ord.args_signature = ["char"]; ord.kwargs_signature = { }; ord.types_signature = { }; ord.pythonscript_function = true; -chr = function(args, kwargs) { +function chr(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["num"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2340,7 +2340,7 @@ chr.args_signature = ["num"]; chr.kwargs_signature = { }; chr.types_signature = { }; chr.pythonscript_function = true; -__ArrayIterator = function(arr, index) { +function __ArrayIterator(arr, index) { __ArrayIterator.__init__(this, arr, index); this.__class__ = __ArrayIterator; this.__uid__ = ("" + _PythonJS_UID); @@ -2371,7 +2371,7 @@ var Iterator, __Iterator_attrs, __Iterator_parents; __Iterator_attrs = {}; __Iterator_parents = []; __Iterator_properties = {}; -__Iterator___init__ = function(args, kwargs) { +function __Iterator___init__(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "obj", "index"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2396,7 +2396,7 @@ __Iterator___init__.kwargs_signature = { }; __Iterator___init__.types_signature = { }; __Iterator___init__.pythonscript_function = true; __Iterator_attrs.__init__ = __Iterator___init__; -__Iterator_next = function(args, kwargs) { +function __Iterator_next(args, kwargs) { var index; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2420,7 +2420,7 @@ __Iterator_next.types_signature = { }; __Iterator_next.pythonscript_function = true; __Iterator_attrs.next = __Iterator_next; Iterator = __create_class__("Iterator", __Iterator_parents, __Iterator_attrs, __Iterator_properties); -tuple = function(args, kwargs) { +function tuple(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2453,7 +2453,7 @@ tuple.args_signature = ["a"]; tuple.kwargs_signature = { }; tuple.types_signature = { }; tuple.pythonscript_function = true; -list = function(args, kwargs) { +function list(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2490,7 +2490,7 @@ var dict, __dict_attrs, __dict_parents; __dict_attrs = {}; __dict_parents = []; __dict_properties = {}; -__dict___init__ = function(args, kwargs) { +function __dict___init__(args, kwargs) { var ob, value; var __sig__, __args__; __sig__ = { kwargs:{"js_object": null, "pointer": null},args:["self", "js_object", "pointer"] }; @@ -2549,7 +2549,7 @@ __dict___init__.kwargs_signature = { js_object:null,pointer:null }; __dict___init__.types_signature = { js_object:"None",pointer:"None" }; __dict___init__.pythonscript_function = true; __dict_attrs.__init__ = __dict___init__; -__dict_jsify = function(args, kwargs) { +function __dict_jsify(args, kwargs) { var keys, value; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2588,7 +2588,7 @@ __dict_jsify.kwargs_signature = { }; __dict_jsify.types_signature = { }; __dict_jsify.pythonscript_function = true; __dict_attrs.jsify = __dict_jsify; -__dict_copy = function(args, kwargs) { +function __dict_copy(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2609,7 +2609,7 @@ __dict_copy.types_signature = { }; __dict_copy.return_type = "dict"; __dict_copy.pythonscript_function = true; __dict_attrs.copy = __dict_copy; -__dict_clear = function(args, kwargs) { +function __dict_clear(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2629,7 +2629,7 @@ __dict_clear.kwargs_signature = { }; __dict_clear.types_signature = { }; __dict_clear.pythonscript_function = true; __dict_attrs.clear = __dict_clear; -__dict_has_key = function(args, kwargs) { +function __dict_has_key(args, kwargs) { var __dict; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "key"] }; @@ -2659,7 +2659,7 @@ __dict_has_key.kwargs_signature = { }; __dict_has_key.types_signature = { }; __dict_has_key.pythonscript_function = true; __dict_attrs.has_key = __dict_has_key; -__dict_update = function(args, kwargs) { +function __dict_update(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "other"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2687,7 +2687,7 @@ __dict_update.kwargs_signature = { }; __dict_update.types_signature = { }; __dict_update.pythonscript_function = true; __dict_attrs.update = __dict_update; -__dict_items = function(args, kwargs) { +function __dict_items(args, kwargs) { var arr; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2717,7 +2717,7 @@ __dict_items.kwargs_signature = { }; __dict_items.types_signature = { }; __dict_items.pythonscript_function = true; __dict_attrs.items = __dict_items; -__dict_get = function(args, kwargs) { +function __dict_get(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{"_default": null},args:["self", "key", "_default"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2744,7 +2744,7 @@ __dict_get.kwargs_signature = { _default:null }; __dict_get.types_signature = { _default:"None" }; __dict_get.pythonscript_function = true; __dict_attrs.get = __dict_get; -__dict_set = function(args, kwargs) { +function __dict_set(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "key", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2766,7 +2766,7 @@ __dict_set.kwargs_signature = { }; __dict_set.types_signature = { }; __dict_set.pythonscript_function = true; __dict_attrs.set = __dict_set; -__dict___len__ = function(args, kwargs) { +function __dict___len__(args, kwargs) { var __dict; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2788,7 +2788,7 @@ __dict___len__.kwargs_signature = { }; __dict___len__.types_signature = { }; __dict___len__.pythonscript_function = true; __dict_attrs.__len__ = __dict___len__; -__dict___getitem__ = function(args, kwargs) { +function __dict___getitem__(args, kwargs) { var __dict; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "key"] }; @@ -2821,7 +2821,7 @@ __dict___getitem__.kwargs_signature = { }; __dict___getitem__.types_signature = { }; __dict___getitem__.pythonscript_function = true; __dict_attrs.__getitem__ = __dict___getitem__; -__dict___setitem__ = function(args, kwargs) { +function __dict___setitem__(args, kwargs) { var __dict; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "key", "value"] }; @@ -2852,7 +2852,7 @@ __dict___setitem__.kwargs_signature = { }; __dict___setitem__.types_signature = { }; __dict___setitem__.pythonscript_function = true; __dict_attrs.__setitem__ = __dict___setitem__; -__dict_keys = function(args, kwargs) { +function __dict_keys(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2872,7 +2872,7 @@ __dict_keys.kwargs_signature = { }; __dict_keys.types_signature = { }; __dict_keys.pythonscript_function = true; __dict_attrs.keys = __dict_keys; -__dict_pop = function(args, kwargs) { +function __dict_pop(args, kwargs) { var js_object, v; var __sig__, __args__; __sig__ = { kwargs:{"d": null},args:["self", "key", "d"] }; @@ -2902,7 +2902,7 @@ __dict_pop.kwargs_signature = { d:null }; __dict_pop.types_signature = { d:"None" }; __dict_pop.pythonscript_function = true; __dict_attrs.pop = __dict_pop; -__dict_values = function(args, kwargs) { +function __dict_values(args, kwargs) { var keys, out; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2931,7 +2931,7 @@ __dict_values.kwargs_signature = { }; __dict_values.types_signature = { }; __dict_values.pythonscript_function = true; __dict_attrs.values = __dict_values; -__dict___contains__ = function(args, kwargs) { +function __dict___contains__(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2958,7 +2958,7 @@ __dict___contains__.kwargs_signature = { }; __dict___contains__.types_signature = { }; __dict___contains__.pythonscript_function = true; __dict_attrs.__contains__ = __dict___contains__; -__dict___iter__ = function(args, kwargs) { +function __dict___iter__(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2980,7 +2980,7 @@ __dict___iter__.return_type = "Iterator"; __dict___iter__.pythonscript_function = true; __dict_attrs.__iter__ = __dict___iter__; dict = __create_class__("dict", __dict_parents, __dict_attrs, __dict_properties); -set = function(args, kwargs) { +function set(args, kwargs) { var keys, mask, s, hashtable, key, fallback; var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; @@ -3063,7 +3063,7 @@ set.args_signature = ["a"]; set.kwargs_signature = { }; set.types_signature = { }; set.pythonscript_function = true; -frozenset = function(args, kwargs) { +function frozenset(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3090,7 +3090,7 @@ __array_typecodes = __jsdict([["c", 1], ["b", 1], ["B", 1], ["u", 2], ["h", 2], __array_attrs.typecodes = __array_typecodes; __array_typecode_names = __jsdict([["c", "Int8"], ["b", "Int8"], ["B", "Uint8"], ["u", "Uint16"], ["h", "Int16"], ["H", "Uint16"], ["i", "Int32"], ["I", "Uint32"], ["f", "Float32"], ["d", "Float64"], ["float32", "Float32"], ["float16", "Int16"], ["float8", "Int8"], ["int32", "Int32"], ["uint32", "Uint32"], ["int16", "Int16"], ["uint16", "Uint16"], ["int8", "Int8"], ["uint8", "Uint8"]]); __array_attrs.typecode_names = __array_typecode_names; -__array___init__ = function(args, kwargs) { +function __array___init__(args, kwargs) { var size, buff; var __sig__, __args__; __sig__ = { kwargs:{"initializer": null, "little_endian": false},args:["self", "typecode", "initializer", "little_endian"] }; @@ -3139,7 +3139,7 @@ __array___init__.kwargs_signature = { initializer:null,little_endian:false }; __array___init__.types_signature = { initializer:"None",little_endian:"False" }; __array___init__.pythonscript_function = true; __array_attrs.__init__ = __array___init__; -__array___len__ = function(args, kwargs) { +function __array___len__(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3159,7 +3159,7 @@ __array___len__.kwargs_signature = { }; __array___len__.types_signature = { }; __array___len__.pythonscript_function = true; __array_attrs.__len__ = __array___len__; -__array___contains__ = function(args, kwargs) { +function __array___contains__(args, kwargs) { var arr; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "value"] }; @@ -3186,7 +3186,7 @@ __array___contains__.kwargs_signature = { }; __array___contains__.types_signature = { }; __array___contains__.pythonscript_function = true; __array_attrs.__contains__ = __array___contains__; -__array___getitem__ = function(args, kwargs) { +function __array___getitem__(args, kwargs) { var func_name, dataview, value, step, func, offset; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "index"] }; @@ -3228,7 +3228,7 @@ __array___getitem__.kwargs_signature = { }; __array___getitem__.types_signature = { }; __array___getitem__.pythonscript_function = true; __array_attrs.__getitem__ = __array___getitem__; -__array___setitem__ = function(args, kwargs) { +function __array___setitem__(args, kwargs) { var func_name, dataview, step, func, offset; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "index", "value"] }; @@ -3276,7 +3276,7 @@ __array___setitem__.kwargs_signature = { }; __array___setitem__.types_signature = { }; __array___setitem__.pythonscript_function = true; __array_attrs.__setitem__ = __array___setitem__; -__array___iter__ = function(args, kwargs) { +function __array___iter__(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3297,7 +3297,7 @@ __array___iter__.types_signature = { }; __array___iter__.return_type = "Iterator"; __array___iter__.pythonscript_function = true; __array_attrs.__iter__ = __array___iter__; -__array_get = function(args, kwargs) { +function __array_get(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "index"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3318,7 +3318,7 @@ __array_get.kwargs_signature = { }; __array_get.types_signature = { }; __array_get.pythonscript_function = true; __array_attrs.get = __array_get; -__array_fromlist = function(args, kwargs) { +function __array_fromlist(args, kwargs) { var typecode, i, func_name, dataview, length, item, step, func, offset, size; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "lst"] }; @@ -3368,7 +3368,7 @@ __array_fromlist.kwargs_signature = { }; __array_fromlist.types_signature = { }; __array_fromlist.pythonscript_function = true; __array_attrs.fromlist = __array_fromlist; -__array_resize = function(args, kwargs) { +function __array_resize(args, kwargs) { var source, new_buff, target, new_size, buff; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "length"] }; @@ -3399,7 +3399,7 @@ __array_resize.kwargs_signature = { }; __array_resize.types_signature = { }; __array_resize.pythonscript_function = true; __array_attrs.resize = __array_resize; -__array_append = function(args, kwargs) { +function __array_append(args, kwargs) { var length; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "value"] }; @@ -3426,7 +3426,7 @@ __array_append.kwargs_signature = { }; __array_append.types_signature = { }; __array_append.pythonscript_function = true; __array_attrs.append = __array_append; -__array_extend = function(args, kwargs) { +function __array_extend(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "lst"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3454,7 +3454,7 @@ __array_extend.kwargs_signature = { }; __array_extend.types_signature = { }; __array_extend.pythonscript_function = true; __array_attrs.extend = __array_extend; -__array_to_array = function(args, kwargs) { +function __array_to_array(args, kwargs) { var i, item, arr; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3482,7 +3482,7 @@ __array_to_array.kwargs_signature = { }; __array_to_array.types_signature = { }; __array_to_array.pythonscript_function = true; __array_attrs.to_array = __array_to_array; -__array_to_list = function(args, kwargs) { +function __array_to_list(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3502,7 +3502,7 @@ __array_to_list.kwargs_signature = { }; __array_to_list.types_signature = { }; __array_to_list.pythonscript_function = true; __array_attrs.to_list = __array_to_list; -__array_to_ascii = function(args, kwargs) { +function __array_to_ascii(args, kwargs) { var i, length, arr, string; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3538,7 +3538,7 @@ var file, __file_attrs, __file_parents; __file_attrs = {}; __file_parents = []; __file_properties = {}; -__file___init__ = function(args, kwargs) { +function __file___init__(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "path", "flags"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3573,7 +3573,7 @@ __file___init__.kwargs_signature = { }; __file___init__.types_signature = { }; __file___init__.pythonscript_function = true; __file_attrs.__init__ = __file___init__; -__file_read = function(args, kwargs) { +function __file_read(args, kwargs) { var _fs, path; var __sig__, __args__; __sig__ = { kwargs:{"binary": false},args:["self", "binary"] }; @@ -3601,7 +3601,7 @@ __file_read.kwargs_signature = { binary:false }; __file_read.types_signature = { binary:"False" }; __file_read.pythonscript_function = true; __file_attrs.read = __file_read; -__file_write = function(args, kwargs) { +function __file_write(args, kwargs) { var _fs, path; var __sig__, __args__; __sig__ = { kwargs:{"binary": false},args:["self", "data", "binary"] }; @@ -3630,7 +3630,7 @@ __file_write.kwargs_signature = { binary:false }; __file_write.types_signature = { binary:"False" }; __file_write.pythonscript_function = true; __file_attrs.write = __file_write; -__file_close = function(args, kwargs) { +function __file_close(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3651,7 +3651,7 @@ __file_close.types_signature = { }; __file_close.pythonscript_function = true; __file_attrs.close = __file_close; file = __create_class__("file", __file_parents, __file_attrs, __file_properties); -__open__ = function(args, kwargs) { +function __open__(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{"mode": null},args:["path", "mode"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3673,7 +3673,7 @@ __open__.types_signature = { mode:"None" }; __open__.return_type = "file"; __open__.pythonscript_function = true; json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (function (o) {return JSON.stringify(o);})]]); -__get_other_workers_with_shared_arg = function(worker, ob) { +function __get_other_workers_with_shared_arg(worker, ob) { var a, other, args; a = []; var __iter22 = threading.workers; @@ -3703,12 +3703,12 @@ __get_other_workers_with_shared_arg.args_signature = ["worker", "ob"]; __get_other_workers_with_shared_arg.kwargs_signature = { }; __get_other_workers_with_shared_arg.types_signature = { }; threading = __jsdict([["workers", []], ["_blocking_callback", null]]); -__start_new_thread = function(f, args) { +function __start_new_thread(f, args) { var jsargs, worker; worker = new Worker(f); worker.__uid__ = len(threading.workers); threading.workers.append(__jsdict([["worker", worker], ["args", args]])); - var func = function(event) { + function func(event) { var a, res, value; if (( event.data.type ) == "terminate") { worker.terminate(); @@ -3781,8 +3781,8 @@ __start_new_thread.NAME = "__start_new_thread"; __start_new_thread.args_signature = ["f", "args"]; __start_new_thread.kwargs_signature = { }; __start_new_thread.types_signature = { }; -__gen_worker_append = function(worker, ob, index) { - var append = function(item) { +function __gen_worker_append(worker, ob, index) { + function append(item) { worker.postMessage(__jsdict([["type", "append"], ["argindex", index], ["value", item]])); ob.push(item); } @@ -3798,9 +3798,9 @@ __gen_worker_append.NAME = "__gen_worker_append"; __gen_worker_append.args_signature = ["worker", "ob", "index"]; __gen_worker_append.kwargs_signature = { }; __gen_worker_append.types_signature = { }; -__webworker_wrap = function(ob, argindex) { +function __webworker_wrap(ob, argindex) { if (__test_if_true__(ob instanceof Array)) { - var func = function(index, item) { + function func(index, item) { postMessage(__jsdict([["type", "__setitem__"], ["index", index], ["value", item], ["argindex", argindex]])); Array.prototype.__setitem__.call(ob, index, item); } @@ -3810,7 +3810,7 @@ __webworker_wrap = function(ob, argindex) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(ob, "__setitem__", __jsdict([["enumerable", false], ["value", func], ["writeable", true], ["configurable", true]])); - var func = function(item) { + function func(item) { postMessage(__jsdict([["type", "append"], ["value", item], ["argindex", argindex]])); Array.prototype.push.call(ob, item); } @@ -3822,7 +3822,7 @@ __webworker_wrap = function(ob, argindex) { Object.defineProperty(ob, "append", __jsdict([["enumerable", false], ["value", func], ["writeable", true], ["configurable", true]])); } else { if (( typeof(ob) ) == "object") { - var func = function(key, item) { + function func(key, item) { postMessage(__jsdict([["type", "__setitem__"], ["index", key], ["value", item], ["argindex", argindex]])); ob[((key.__uid__) ? key.__uid__ : key)] = item; } @@ -3841,7 +3841,7 @@ __webworker_wrap.NAME = "__webworker_wrap"; __webworker_wrap.args_signature = ["ob", "argindex"]; __webworker_wrap.kwargs_signature = { }; __webworker_wrap.types_signature = { }; -__rpc__ = function(url, func, args) { +function __rpc__(url, func, args) { var req; req = new XMLHttpRequest(); req.open("POST", url, false); @@ -3854,7 +3854,7 @@ __rpc__.NAME = "__rpc__"; __rpc__.args_signature = ["url", "func", "args"]; __rpc__.kwargs_signature = { }; __rpc__.types_signature = { }; -__rpc_iter__ = function(url, attr) { +function __rpc_iter__(url, attr) { var req; req = new XMLHttpRequest(); req.open("POST", url, false); @@ -3866,4 +3866,29 @@ __rpc_iter__ = function(url, attr) { __rpc_iter__.NAME = "__rpc_iter__"; __rpc_iter__.args_signature = ["url", "attr"]; __rpc_iter__.kwargs_signature = { }; -__rpc_iter__.types_signature = { }; \ No newline at end of file +__rpc_iter__.types_signature = { }; +function __rpc_set__(url, attr, value) { + var req; + req = new XMLHttpRequest(); + req.open("POST", url, false); + req.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + req.send(JSON.stringify(__jsdict([["set", attr], ["value", value]]))); +} + +__rpc_set__.NAME = "__rpc_set__"; +__rpc_set__.args_signature = ["url", "attr", "value"]; +__rpc_set__.kwargs_signature = { }; +__rpc_set__.types_signature = { }; +function __rpc_get__(url, attr) { + var req; + req = new XMLHttpRequest(); + req.open("POST", url, false); + req.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + req.send(JSON.stringify(__jsdict([["get", attr]]))); + return JSON.parse(req.responseText); +} + +__rpc_get__.NAME = "__rpc_get__"; +__rpc_get__.args_signature = ["url", "attr"]; +__rpc_get__.kwargs_signature = { }; +__rpc_get__.types_signature = { }; \ No newline at end of file diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 2aa9031..43d41a9 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -1493,3 +1493,17 @@ def __rpc_iter__( url, attr): req.setRequestHeader("Content-Type", "application/json;charset=UTF-8") req.send( JSON.stringify({'iter':attr}) ) return JSON.parse( req.responseText ) + + def __rpc_set__( url, attr, value): + req = new( XMLHttpRequest() ) + req.open('POST', url, False) ## false is sync + req.setRequestHeader("Content-Type", "application/json;charset=UTF-8") + req.send( JSON.stringify({'set':attr, 'value':value}) ) + + def __rpc_get__( url, attr): + req = new( XMLHttpRequest() ) + req.open('POST', url, False) ## false is sync + req.setRequestHeader("Content-Type", "application/json;charset=UTF-8") + req.send( JSON.stringify({'get':attr}) ) + return JSON.parse( req.responseText ) + diff --git a/regtests/rpc/attr.py b/regtests/rpc/attr.py new file mode 100644 index 0000000..be03b81 --- /dev/null +++ b/regtests/rpc/attr.py @@ -0,0 +1,15 @@ +"""get/set remote attributes""" + +def main(): + x = None + y = None + with rpc('http://localhost:8080') as server: + server.A = 'hi' + server.B = 100 + x = server.A + y = server.B + + TestError( x == 'hi' ) + TestError( y == 100 ) + + \ No newline at end of file diff --git a/regtests/run.py b/regtests/run.py index dfa64db..7e86b78 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -36,7 +36,9 @@ ] -mycollection = range(10) +__sandbox = { + 'mycollection' : range(10) +} __clients = {} ## keeps track of iterator indices def httpd_reply( env, start_response ): @@ -50,13 +52,13 @@ def httpd_reply( env, start_response ): __clients[ client ] = {} length = 0 - if 'CONTENT_LENGTH' in env: - length = int(env['CONTENT_LENGTH']) + if 'CONTENT_LENGTH' in env: length = int(env['CONTENT_LENGTH']) data = env['wsgi.input'].read( length ).decode('utf-8') - - print('http_reply ->', path, host, client, arg, data) + #print('http_reply ->', path, host, client, arg, data) msg = json.loads( data ) + res = '' + if 'call' in msg: assert 'args' in msg if msg['call'] == 'concat': @@ -65,13 +67,14 @@ def httpd_reply( env, start_response ): res = msg['args'][0] + msg['args'][1] else: raise NotImplementedError( msg ) + elif 'iter' in msg: name = msg['iter'] - assert name in globals() + assert name in __sandbox if name not in __clients[ client ]: __clients[ client ][name] = 0 index = __clients[ client ][name] - iterable = globals()[name] + iterable = __sandbox[name] if index == len(iterable): index = 0 res = '__STOP_ITERATION__' @@ -80,10 +83,15 @@ def httpd_reply( env, start_response ): index += 1 __clients[ client ][name] = index + elif 'set' in msg: + __sandbox[ msg['set'] ] = msg['value'] + + elif 'get' in msg: + res = __sandbox[ msg['get'] ] + else: raise NotImplementedError( msg ) - print( res ) start_response( '200 OK', [] ) return [ json.dumps(res).encode('utf-8') ] From c3dcb9ba05aaaf62e60398c18bbe500ea1421838 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 9 Jun 2014 07:06:14 -0700 Subject: [PATCH 005/222] fixed runtime, runtime must be generated with function-expressions --- pythonjs/pythonjs.js | 346 +++++++++++++++++++++---------------------- pythonjs/pythonjs.py | 12 +- 2 files changed, 179 insertions(+), 179 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index ab79f14..05b3ae3 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -11,7 +11,7 @@ if (( typeof(window) ) != "undefined") { if (( typeof(importScripts) ) == "function") { __WEBWORKER__ = true; } -function __create_array__() { +__create_array__ = function() { "Used to fix a bug/feature of Javascript where new Array(number)\n created a array with number of undefined elements which is not\n what we want"; var i, array; array = []; @@ -23,7 +23,7 @@ function __create_array__() { return array; } -function __get__(object, attribute, error_message) { +__get__ = function(object, attribute, error_message) { "Retrieve an attribute, method, property, or wrapper function.\n\n method are actually functions which are converted to methods by\n prepending their arguments with the current object. Properties are\n not functions!\n\n DOM support:\n http://stackoverflow.com/questions/14202699/document-createelement-not-working\n https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof\n\n Direct JavaScript Calls:\n if an external javascript function is found, and it was not a wrapper that was generated here,\n check the function for a 'cached_wrapper' attribute, if none is found then generate a new\n wrapper, cache it on the function, and return the wrapper.\n "; if (( object ) === null) { if (error_message) { @@ -48,7 +48,7 @@ function __get__(object, attribute, error_message) { return object.cached_wrapper; } else { if ({}.toString.call(object) === '[object Function]') { - function wrapper(args, kwargs) { + var wrapper = function(args, kwargs) { var i, arg, keys; if (( args ) != null) { i = 0; @@ -96,7 +96,7 @@ function __get__(object, attribute, error_message) { if (( __NODEJS__ ) === false && ( __WEBWORKER__ ) === false) { if (object instanceof HTMLDocument) { if (typeof(attr) === 'function') { - function wrapper(args, kwargs) { + var wrapper = function(args, kwargs) { return attr.apply(object, args); } @@ -108,7 +108,7 @@ function __get__(object, attribute, error_message) { } else { if (object instanceof HTMLElement) { if (typeof(attr) === 'function') { - function wrapper(args, kwargs) { + var wrapper = function(args, kwargs) { return attr.apply(object, args); } @@ -126,7 +126,7 @@ function __get__(object, attribute, error_message) { if (attr.prototype instanceof Object && ( Object.keys(attr.prototype).length ) > 0) { return attr; } - function wrapper(args, kwargs) { + var wrapper = function(args, kwargs) { var i, arg, keys; if (( args ) != null) { i = 0; @@ -164,7 +164,7 @@ function __get__(object, attribute, error_message) { return wrapper; } else { if (attr.is_classmethod) { - function method() { + var method = function() { var args; args = Array.prototype.slice.call(arguments); if (args[0] instanceof Array && {}.toString.call(args[1]) === '[object Object]' && ( args.length ) == 2) { @@ -200,7 +200,7 @@ function __get__(object, attribute, error_message) { if (( attribute ) in __class__.__unbound_methods__) { attr = __class__.__unbound_methods__[attribute]; if (attr.fastdef) { - function method(args, kwargs) { + var method = function(args, kwargs) { if (arguments && arguments[0]) { arguments[0].splice(0, 0, object); return attr.apply(this, arguments); @@ -210,7 +210,7 @@ function __get__(object, attribute, error_message) { } } else { - function method(args, kwargs) { + var method = function(args, kwargs) { if (( arguments.length ) == 0) { return attr([object], __NULL_OBJECT__); } else { @@ -242,7 +242,7 @@ function __get__(object, attribute, error_message) { return attr; } else { if (attr.fastdef) { - function method(args, kwargs) { + var method = function(args, kwargs) { if (arguments && arguments[0]) { arguments[0].splice(0, 0, object); return attr.apply(this, arguments); @@ -252,7 +252,7 @@ function __get__(object, attribute, error_message) { } } else { - function method(args, kwargs) { + var method = function(args, kwargs) { if (( arguments.length ) == 0) { return attr([object], __NULL_OBJECT__); } else { @@ -290,7 +290,7 @@ function __get__(object, attribute, error_message) { if (( attr ) !== undefined) { if ({}.toString.call(attr) === '[object Function]') { if (attr.fastdef) { - function method(args, kwargs) { + var method = function(args, kwargs) { if (arguments && arguments[0]) { arguments[0].splice(0, 0, object); return attr.apply(this, arguments); @@ -300,7 +300,7 @@ function __get__(object, attribute, error_message) { } } else { - function method(args, kwargs) { + var method = function(args, kwargs) { if (( arguments.length ) == 0) { return attr([object], __NULL_OBJECT__); } else { @@ -354,7 +354,7 @@ function __get__(object, attribute, error_message) { } } if (( attribute ) == "__getitem__") { - function wrapper(args, kwargs) { + var wrapper = function(args, kwargs) { return object[args[0]]; } @@ -362,7 +362,7 @@ function __get__(object, attribute, error_message) { return wrapper; } else { if (( attribute ) == "__setitem__") { - function wrapper(args, kwargs) { + var wrapper = function(args, kwargs) { object[args[0]] = args[1]; } @@ -374,7 +374,7 @@ function __get__(object, attribute, error_message) { return object.wrapped[attribute]; } if (( attribute ) == "__iter__" && object instanceof Object) { - function wrapper(args, kwargs) { + var wrapper = function(args, kwargs) { return new __ArrayIterator(Object.keys(object), 0); } @@ -382,7 +382,7 @@ function __get__(object, attribute, error_message) { return wrapper; } if (( attribute ) == "__contains__" && object instanceof Object) { - function wrapper(args, kwargs) { + var wrapper = function(args, kwargs) { return ( Object.keys(object).indexOf(args[0]) ) != -1; } @@ -400,7 +400,7 @@ function __get__(object, attribute, error_message) { } } -function _get_upstream_attribute(base, attr) { +_get_upstream_attribute = function(base, attr) { if (( attr ) in base) { return base[attr]; } @@ -412,7 +412,7 @@ function _get_upstream_attribute(base, attr) { } } -function _get_upstream_property(base, attr) { +_get_upstream_property = function(base, attr) { if (( attr ) in base.__properties__) { return base.__properties__[attr]; } @@ -424,7 +424,7 @@ function _get_upstream_property(base, attr) { } } -function __set__(object, attribute, value) { +__set__ = function(object, attribute, value) { "\n __setattr__ is always called when an attribute is set,\n unlike __getattr__ that only triggers when an attribute is not found,\n this asymmetry is in fact part of the Python spec.\n note there is no __setattribute__\n\n In normal Python a property setter is not called before __setattr__,\n this is bad language design because the user has been more explicit\n in having the property setter.\n\n In PythonJS, property setters are called instead of __setattr__.\n "; if (( "__class__" ) in object && ( object.__class__.__setters__.indexOf(attribute) ) != -1) { object[attribute] = value; @@ -437,7 +437,7 @@ function __set__(object, attribute, value) { } } -function __getargs__(func_name, signature, args, kwargs) { +__getargs__ = function(func_name, signature, args, kwargs) { "Based on ``signature`` and ``args``, ``kwargs`` parameters retrieve\n the actual parameters.\n\n This will set default keyword arguments and retrieve positional arguments\n in kwargs if their called as such"; if (( args ) === null) { args = []; @@ -496,7 +496,7 @@ KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Obj ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError"; AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError"; RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError"; -function __getattr__(ob, a) { +__getattr__ = function(ob, a) { if (ob.__getattr__) { return ob.__getattr__(a); } @@ -507,7 +507,7 @@ __getattr__.args_signature = ["ob", "a"]; __getattr__.kwargs_signature = { }; __getattr__.types_signature = { }; __getattr__.pythonscript_function = true; -function __test_if_true__(ob) { +__test_if_true__ = function(ob) { if (( ob ) === true) { return true; } else { @@ -548,7 +548,7 @@ __test_if_true__.args_signature = ["ob"]; __test_if_true__.kwargs_signature = { }; __test_if_true__.types_signature = { }; __test_if_true__.pythonscript_function = true; -function __replace_method(ob, a, b) { +__replace_method = function(ob, a, b) { if (( typeof(ob) ) == "string") { return ob.split(a).join(b); } else { @@ -561,7 +561,7 @@ __replace_method.args_signature = ["ob", "a", "b"]; __replace_method.kwargs_signature = { }; __replace_method.types_signature = { }; __replace_method.pythonscript_function = true; -function __split_method(ob, delim) { +__split_method = function(ob, delim) { if (( typeof(ob) ) == "string") { if (( delim ) === undefined) { return ob.split(" "); @@ -582,7 +582,7 @@ __split_method.args_signature = ["ob", "delim"]; __split_method.kwargs_signature = { }; __split_method.types_signature = { }; __split_method.pythonscript_function = true; -function __is_typed_array(ob) { +__is_typed_array = function(ob) { if (__test_if_true__(ob instanceof Int8Array || ob instanceof Uint8Array)) { return true; } else { @@ -606,7 +606,7 @@ __is_typed_array.NAME = "__is_typed_array"; __is_typed_array.args_signature = ["ob"]; __is_typed_array.kwargs_signature = { }; __is_typed_array.types_signature = { }; -function __js_typed_array(t, a) { +__js_typed_array = function(t, a) { var arr; if (( t ) == "i") { arr = new Int32Array(a.length); @@ -619,7 +619,7 @@ __js_typed_array.NAME = "__js_typed_array"; __js_typed_array.args_signature = ["t", "a"]; __js_typed_array.kwargs_signature = { }; __js_typed_array.types_signature = { }; -function __contains__(ob, a) { +__contains__ = function(ob, a) { var t; t = typeof(ob); if (( t ) == "string") { @@ -661,7 +661,7 @@ __contains__.NAME = "__contains__"; __contains__.args_signature = ["ob", "a"]; __contains__.kwargs_signature = { }; __contains__.types_signature = { }; -function __add_op(a, b) { +__add_op = function(a, b) { var c, t; t = typeof(a); if (__test_if_true__(( t ) == "string" || ( t ) == "number")) { @@ -686,7 +686,7 @@ __add_op.NAME = "__add_op"; __add_op.args_signature = ["a", "b"]; __add_op.kwargs_signature = { }; __add_op.types_signature = { }; -function __jsdict(items) { +__jsdict = function(items) { var d, key; d = {}; var __iter2 = items; @@ -706,7 +706,7 @@ __jsdict.NAME = "__jsdict"; __jsdict.args_signature = ["items"]; __jsdict.kwargs_signature = { }; __jsdict.types_signature = { }; -function __jsdict_get(ob, key, default_value) { +__jsdict_get = function(ob, key, default_value) { if (__test_if_true__(ob instanceof Object)) { if (__test_if_true__(key in ob)) { return ob[((key.__uid__) ? key.__uid__ : key)]; @@ -725,7 +725,7 @@ __jsdict_get.NAME = "__jsdict_get"; __jsdict_get.args_signature = ["ob", "key", "default_value"]; __jsdict_get.kwargs_signature = { }; __jsdict_get.types_signature = { }; -function __jsdict_set(ob, key, value) { +__jsdict_set = function(ob, key, value) { if (__test_if_true__(ob instanceof Object)) { ob[((key.__uid__) ? key.__uid__ : key)] = value; } else { @@ -737,7 +737,7 @@ __jsdict_set.NAME = "__jsdict_set"; __jsdict_set.args_signature = ["ob", "key", "value"]; __jsdict_set.kwargs_signature = { }; __jsdict_set.types_signature = { }; -function __jsdict_keys(ob) { +__jsdict_keys = function(ob) { if (__test_if_true__(ob instanceof Object)) { return Object.keys( ob ); } else { @@ -749,7 +749,7 @@ __jsdict_keys.NAME = "__jsdict_keys"; __jsdict_keys.args_signature = ["ob"]; __jsdict_keys.kwargs_signature = { }; __jsdict_keys.types_signature = { }; -function __jsdict_values(ob) { +__jsdict_values = function(ob) { var arr, value; if (__test_if_true__(ob instanceof Object)) { arr = []; @@ -772,7 +772,7 @@ __jsdict_values.NAME = "__jsdict_values"; __jsdict_values.args_signature = ["ob"]; __jsdict_values.kwargs_signature = { }; __jsdict_values.types_signature = { }; -function __jsdict_items(ob) { +__jsdict_items = function(ob) { var arr, value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; @@ -795,7 +795,7 @@ __jsdict_items.NAME = "__jsdict_items"; __jsdict_items.args_signature = ["ob"]; __jsdict_items.kwargs_signature = { }; __jsdict_items.types_signature = { }; -function __jsdict_pop(ob, key, _kwargs_) { +__jsdict_pop = function(ob, key, _kwargs_) { var v; if (!( _kwargs_ instanceof Object )) {; var _kwargs_ = {ob: arguments[0],key: arguments[1],_default: arguments[2]}; @@ -830,7 +830,7 @@ __jsdict_pop.NAME = "__jsdict_pop"; __jsdict_pop.args_signature = ["ob", "key", "_default"]; __jsdict_pop.kwargs_signature = { _default:null }; __jsdict_pop.types_signature = { _default:"None" }; -function __object_keys__(ob) { +__object_keys__ = function(ob) { var arr; "\n notes:\n . Object.keys(ob) will not work because we create PythonJS objects using `Object.create(null)`\n . this is different from Object.keys because it traverses the prototype chain.\n "; arr = []; @@ -842,7 +842,7 @@ __object_keys__.NAME = "__object_keys__"; __object_keys__.args_signature = ["ob"]; __object_keys__.kwargs_signature = { }; __object_keys__.types_signature = { }; -function __bind_property_descriptors__(o, klass) { +__bind_property_descriptors__ = function(o, klass) { var prop, desc; var __iter5 = klass.__properties__; if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } @@ -870,8 +870,8 @@ __bind_property_descriptors__.NAME = "__bind_property_descriptors__"; __bind_property_descriptors__.args_signature = ["o", "klass"]; __bind_property_descriptors__.kwargs_signature = { }; __bind_property_descriptors__.types_signature = { }; -function __generate_getter__(klass, o, n) { - function __lambda__() { +__generate_getter__ = function(klass, o, n) { + var __lambda__ = function() { return klass.__properties__[((n.__uid__) ? n.__uid__ : n)][(("get".__uid__) ? "get".__uid__ : "get")]([o], __jsdict([])); } @@ -886,8 +886,8 @@ __generate_getter__.NAME = "__generate_getter__"; __generate_getter__.args_signature = ["klass", "o", "n"]; __generate_getter__.kwargs_signature = { }; __generate_getter__.types_signature = { }; -function __generate_setter__(klass, o, n) { - function __lambda__(v) { +__generate_setter__ = function(klass, o, n) { + var __lambda__ = function(v) { return klass.__properties__[((n.__uid__) ? n.__uid__ : n)][(("set".__uid__) ? "set".__uid__ : "set")]([o, v], __jsdict([])); } @@ -902,7 +902,7 @@ __generate_setter__.NAME = "__generate_setter__"; __generate_setter__.args_signature = ["klass", "o", "n"]; __generate_setter__.kwargs_signature = { }; __generate_setter__.types_signature = { }; -function __sprintf(fmt, args) { +__sprintf = function(fmt, args) { var chunks, item, arr; if (__test_if_true__(args instanceof Array)) { chunks = fmt.split("%s"); @@ -942,7 +942,7 @@ __sprintf.NAME = "__sprintf"; __sprintf.args_signature = ["fmt", "args"]; __sprintf.kwargs_signature = { }; __sprintf.types_signature = { }; -function __create_class__(class_name, parents, attrs, props) { +__create_class__ = function(class_name, parents, attrs, props) { var f, klass, prop; "Create a PythonScript class"; klass = Object.create(null); @@ -994,7 +994,7 @@ function __create_class__(class_name, parents, attrs, props) { Array.prototype.push.apply(klass.__setters__, base.__setters__); Array.prototype.push.apply(klass.__all_method_names__, base.__all_method_names__); } - function __call__() { + var __call__ = function() { var has_getattr, wrapper, object, has_getattribute; "Create a PythonJS object"; object = Object.create(null); @@ -1045,7 +1045,7 @@ __create_class__.NAME = "__create_class__"; __create_class__.args_signature = ["class_name", "parents", "attrs", "props"]; __create_class__.kwargs_signature = { }; __create_class__.types_signature = { }; -function type(args, kwargs) { +type = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{"bases": null, "class_dict": null},args:["ob_or_class_name", "bases", "class_dict"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1071,7 +1071,7 @@ type.args_signature = ["ob_or_class_name", "bases", "class_dict"]; type.kwargs_signature = { bases:null,class_dict:null }; type.types_signature = { bases:"None",class_dict:"None" }; type.pythonscript_function = true; -function hasattr(args, kwargs) { +hasattr = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["ob", "attr"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1091,7 +1091,7 @@ hasattr.args_signature = ["ob", "attr"]; hasattr.kwargs_signature = { }; hasattr.types_signature = { }; hasattr.pythonscript_function = true; -function getattr(args, kwargs) { +getattr = function(args, kwargs) { var prop; var __sig__, __args__; __sig__ = { kwargs:{"property": false},args:["ob", "attr", "property"] }; @@ -1122,7 +1122,7 @@ getattr.args_signature = ["ob", "attr", "property"]; getattr.kwargs_signature = { property:false }; getattr.types_signature = { property:"False" }; getattr.pythonscript_function = true; -function setattr(args, kwargs) { +setattr = function(args, kwargs) { var prop; var __sig__, __args__; __sig__ = { kwargs:{"property": false},args:["ob", "attr", "value", "property"] }; @@ -1154,7 +1154,7 @@ setattr.args_signature = ["ob", "attr", "value", "property"]; setattr.kwargs_signature = { property:false }; setattr.types_signature = { property:"False" }; setattr.pythonscript_function = true; -function issubclass(args, kwargs) { +issubclass = function(args, kwargs) { var i, bases; var __sig__, __args__; __sig__ = { kwargs:{},args:["C", "B"] }; @@ -1186,7 +1186,7 @@ issubclass.args_signature = ["C", "B"]; issubclass.kwargs_signature = { }; issubclass.types_signature = { }; issubclass.pythonscript_function = true; -function isinstance(args, kwargs) { +isinstance = function(args, kwargs) { var ob_class; var __sig__, __args__; __sig__ = { kwargs:{},args:["ob", "klass"] }; @@ -1223,7 +1223,7 @@ isinstance.args_signature = ["ob", "klass"]; isinstance.kwargs_signature = { }; isinstance.types_signature = { }; isinstance.pythonscript_function = true; -function int(args, kwargs) { +int = function(args, kwargs) { ; var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; @@ -1247,7 +1247,7 @@ int.args_signature = ["a"]; int.kwargs_signature = { }; int.types_signature = { }; int.pythonscript_function = true; -function float(args, kwargs) { +float = function(args, kwargs) { ; var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; @@ -1271,7 +1271,7 @@ float.args_signature = ["a"]; float.kwargs_signature = { }; float.types_signature = { }; float.pythonscript_function = true; -function round(args, kwargs) { +round = function(args, kwargs) { var y, x, c, b; var __sig__, __args__; __sig__ = { kwargs:{},args:["a", "places"] }; @@ -1309,7 +1309,7 @@ round.args_signature = ["a", "places"]; round.kwargs_signature = { }; round.types_signature = { }; round.pythonscript_function = true; -function str(args, kwargs) { +str = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["s"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1331,9 +1331,9 @@ str.args_signature = ["s"]; str.kwargs_signature = { }; str.types_signature = { }; str.pythonscript_function = true; -function _setup_str_prototype(args, kwargs) { +_setup_str_prototype = function(args, kwargs) { "\n Extend JavaScript String.prototype with methods that implement the Python str API.\n The decorator @String.prototype.[name] assigns the function to the prototype,\n and ensures that the special 'this' variable will work.\n "; - function func(a) { + var func = function(a) { if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1346,7 +1346,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(index) { + var func = function(index) { if (( index ) < 0) { var __left10, __right11; __left10 = this.length; @@ -1362,7 +1362,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(self) { + var func = function(self) { return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } @@ -1371,7 +1371,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(idx) { + var func = function(idx) { if (( idx ) < 0) { var __left12, __right13; __left12 = this.length; @@ -1387,7 +1387,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "__getitem__", { enumerable:false,value:func,writeable:true,configurable:true }); - function func() { + var func = function() { return this.length; } @@ -1396,7 +1396,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(start, stop, step) { + var func = function(start, stop, step) { ; if (__test_if_true__(( start ) === undefined && ( stop ) === undefined && ( step ) == -1)) { return this.split("").reverse().join(""); @@ -1416,7 +1416,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "__getslice__", { enumerable:false,value:func,writeable:true,configurable:true }); - function func() { + var func = function() { return this.split("\n"); } @@ -1425,7 +1425,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "splitlines", { enumerable:false,value:func,writeable:true,configurable:true }); - function func() { + var func = function() { return this.trim(); } @@ -1434,7 +1434,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "strip", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(a) { + var func = function(a) { if (( this.substring(0, a.length) ) == a) { return true; } else { @@ -1447,7 +1447,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "startswith", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(a) { + var func = function(a) { if (( this.substring((this.length - a.length), this.length) ) == a) { return true; } else { @@ -1460,7 +1460,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "endswith", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(a) { + var func = function(a) { var i, arr, out; out = ""; if (__test_if_true__(a instanceof Array)) { @@ -1487,7 +1487,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "join", { enumerable:false,value:func,writeable:true,configurable:true }); - function func() { + var func = function() { return this.toUpperCase(); } @@ -1496,7 +1496,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "upper", { enumerable:false,value:func,writeable:true,configurable:true }); - function func() { + var func = function() { return this.toLowerCase(); } @@ -1505,7 +1505,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "lower", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(a) { + var func = function(a) { var i; i = this.indexOf(a); if (( i ) == -1) { @@ -1522,7 +1522,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "index", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(a) { + var func = function(a) { return this.indexOf(a); } @@ -1531,7 +1531,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "find", { enumerable:false,value:func,writeable:true,configurable:true }); - function func() { + var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; var __iter13 = this; @@ -1552,7 +1552,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "isdigit", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(encoding) { + var func = function(encoding) { return this; } @@ -1561,7 +1561,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "decode", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(encoding) { + var func = function(encoding) { return this; } @@ -1570,7 +1570,7 @@ function _setup_str_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(String.prototype, "encode", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(fmt) { + var func = function(fmt) { var keys, r; r = this; keys = Object.keys(fmt); @@ -1597,8 +1597,8 @@ _setup_str_prototype.kwargs_signature = { }; _setup_str_prototype.types_signature = { }; _setup_str_prototype.pythonscript_function = true; _setup_str_prototype(); -function _setup_array_prototype(args, kwargs) { - function func() { +_setup_array_prototype = function(args, kwargs) { + var func = function() { var i, item; i = 0; while (( i ) < this.length) { @@ -1618,7 +1618,7 @@ function _setup_array_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "jsify", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(a) { + var func = function(a) { if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1631,7 +1631,7 @@ function _setup_array_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); - function func() { + var func = function() { return this.length; } @@ -1640,7 +1640,7 @@ function _setup_array_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(index) { + var func = function(index) { return this[((index.__uid__) ? index.__uid__ : index)]; } @@ -1649,7 +1649,7 @@ function _setup_array_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); - function __getitem__(index) { + var __getitem__ = function(index) { ; if (( index ) < 0) { var __left18, __right19; @@ -1665,7 +1665,7 @@ function _setup_array_prototype(args, kwargs) { __getitem__.kwargs_signature = { }; __getitem__.types_signature = { }; Object.defineProperty(Array.prototype, "__getitem__", { enumerable:false,value:__getitem__,writeable:true,configurable:true }); - function __setitem__(index, value) { + var __setitem__ = function(index, value) { ; if (( index ) < 0) { var __left20, __right21; @@ -1681,7 +1681,7 @@ function _setup_array_prototype(args, kwargs) { __setitem__.kwargs_signature = { }; __setitem__.types_signature = { }; Object.defineProperty(Array.prototype, "__setitem__", { enumerable:false,value:__setitem__,writeable:true,configurable:true }); - function func() { + var func = function() { return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } @@ -1690,7 +1690,7 @@ function _setup_array_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(start, stop, step) { + var func = function(start, stop, step) { var i, arr; if (__test_if_true__(( start ) === undefined && ( stop ) === undefined)) { arr = []; @@ -1716,7 +1716,7 @@ function _setup_array_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "__getslice__", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(item) { + var func = function(item) { this.push(item); return this; } @@ -1726,7 +1726,7 @@ function _setup_array_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); - function extend(other) { + var extend = function(other) { var __iter15 = other; if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { @@ -1741,7 +1741,7 @@ function _setup_array_prototype(args, kwargs) { extend.kwargs_signature = { }; extend.types_signature = { }; Object.defineProperty(Array.prototype, "extend", { enumerable:false,value:extend,writeable:true,configurable:true }); - function func(item) { + var func = function(item) { var index; index = this.indexOf(item); this.splice(index, 1); @@ -1752,7 +1752,7 @@ function _setup_array_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "remove", { enumerable:false,value:func,writeable:true,configurable:true }); - function insert(index, obj) { + var insert = function(index, obj) { ; if (( index ) < 0) { var __left24, __right25; @@ -1768,7 +1768,7 @@ function _setup_array_prototype(args, kwargs) { insert.kwargs_signature = { }; insert.types_signature = { }; Object.defineProperty(Array.prototype, "insert", { enumerable:false,value:insert,writeable:true,configurable:true }); - function index(obj) { + var index = function(obj) { return this.indexOf(obj); } @@ -1777,7 +1777,7 @@ function _setup_array_prototype(args, kwargs) { index.kwargs_signature = { }; index.types_signature = { }; Object.defineProperty(Array.prototype, "index", { enumerable:false,value:index,writeable:true,configurable:true }); - function count(obj) { + var count = function(obj) { var a; a = 0; var __iter16 = this; @@ -1796,7 +1796,7 @@ function _setup_array_prototype(args, kwargs) { count.kwargs_signature = { }; count.types_signature = { }; Object.defineProperty(Array.prototype, "count", { enumerable:false,value:count,writeable:true,configurable:true }); - function func(x, low, high) { + var func = function(x, low, high) { var a, mid; if (( low ) === undefined) { low = 0; @@ -1827,9 +1827,9 @@ function _setup_array_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "bisect", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(other) { + var func = function(other) { var f; - function __lambda__(i) { + var __lambda__ = function(i) { return ( other.indexOf(i) ) == -1; } @@ -1846,9 +1846,9 @@ function _setup_array_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "difference", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(other) { + var func = function(other) { var f; - function __lambda__(i) { + var __lambda__ = function(i) { return ( other.indexOf(i) ) != -1; } @@ -1865,7 +1865,7 @@ function _setup_array_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(other) { + var func = function(other) { var __iter17 = this; if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { @@ -1890,8 +1890,8 @@ _setup_array_prototype.kwargs_signature = { }; _setup_array_prototype.types_signature = { }; _setup_array_prototype.pythonscript_function = true; _setup_array_prototype(); -function _setup_nodelist_prototype(args, kwargs) { - function func(a) { +_setup_nodelist_prototype = function(args, kwargs) { + var func = function(a) { if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1904,7 +1904,7 @@ function _setup_nodelist_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(NodeList.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); - function func() { + var func = function() { return this.length; } @@ -1913,7 +1913,7 @@ function _setup_nodelist_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(NodeList.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); - function func(index) { + var func = function(index) { return this[((index.__uid__) ? index.__uid__ : index)]; } @@ -1922,7 +1922,7 @@ function _setup_nodelist_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(NodeList.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); - function __getitem__(index) { + var __getitem__ = function(index) { ; if (( index ) < 0) { var __left30, __right31; @@ -1938,7 +1938,7 @@ function _setup_nodelist_prototype(args, kwargs) { __getitem__.kwargs_signature = { }; __getitem__.types_signature = { }; Object.defineProperty(NodeList.prototype, "__getitem__", { enumerable:false,value:__getitem__,writeable:true,configurable:true }); - function __setitem__(index, value) { + var __setitem__ = function(index, value) { ; if (( index ) < 0) { var __left32, __right33; @@ -1954,7 +1954,7 @@ function _setup_nodelist_prototype(args, kwargs) { __setitem__.kwargs_signature = { }; __setitem__.types_signature = { }; Object.defineProperty(NodeList.prototype, "__setitem__", { enumerable:false,value:__setitem__,writeable:true,configurable:true }); - function func() { + var func = function() { return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } @@ -1963,7 +1963,7 @@ function _setup_nodelist_prototype(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(NodeList.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); - function index(obj) { + var index = function(obj) { return this.indexOf(obj); } @@ -1982,7 +1982,7 @@ _setup_nodelist_prototype.pythonscript_function = true; if (__test_if_true__(( __NODEJS__ ) == false && ( __WEBWORKER__ ) == false)) { _setup_nodelist_prototype(); } -function bisect(args, kwargs) { +bisect = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{"low": null, "high": null},args:["a", "x", "low", "high"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2004,7 +2004,7 @@ bisect.args_signature = ["a", "x", "low", "high"]; bisect.kwargs_signature = { low:null,high:null }; bisect.types_signature = { low:"None",high:"None" }; bisect.pythonscript_function = true; -function range(args, kwargs) { +range = function(args, kwargs) { var i, arr; var __sig__, __args__; __sig__ = { kwargs:{},args:["num", "stop", "step"] }; @@ -2041,7 +2041,7 @@ range.args_signature = ["num", "stop", "step"]; range.kwargs_signature = { }; range.types_signature = { }; range.pythonscript_function = true; -function xrange(args, kwargs) { +xrange = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["num", "stop", "step"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2062,7 +2062,7 @@ xrange.args_signature = ["num", "stop", "step"]; xrange.kwargs_signature = { }; xrange.types_signature = { }; xrange.pythonscript_function = true; -function sum(args, kwargs) { +sum = function(args, kwargs) { var a; var __sig__, __args__; __sig__ = { kwargs:{},args:["arr"] }; @@ -2096,7 +2096,7 @@ __StopIteration_attrs = {}; __StopIteration_parents = []; __StopIteration_properties = {}; StopIteration = __create_class__("StopIteration", __StopIteration_parents, __StopIteration_attrs, __StopIteration_properties); -function len(args, kwargs) { +len = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["ob"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2131,7 +2131,7 @@ len.args_signature = ["ob"]; len.kwargs_signature = { }; len.types_signature = { }; len.pythonscript_function = true; -function next(args, kwargs) { +next = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["obj"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2150,7 +2150,7 @@ next.args_signature = ["obj"]; next.kwargs_signature = { }; next.types_signature = { }; next.pythonscript_function = true; -function map(args, kwargs) { +map = function(args, kwargs) { var arr, v; var __sig__, __args__; __sig__ = { kwargs:{},args:["func", "objs"] }; @@ -2181,7 +2181,7 @@ map.args_signature = ["func", "objs"]; map.kwargs_signature = { }; map.types_signature = { }; map.pythonscript_function = true; -function filter(args, kwargs) { +filter = function(args, kwargs) { var arr; var __sig__, __args__; __sig__ = { kwargs:{},args:["func", "objs"] }; @@ -2213,7 +2213,7 @@ filter.args_signature = ["func", "objs"]; filter.kwargs_signature = { }; filter.types_signature = { }; filter.pythonscript_function = true; -function min(args, kwargs) { +min = function(args, kwargs) { var a; var __sig__, __args__; __sig__ = { kwargs:{},args:["lst"] }; @@ -2248,7 +2248,7 @@ min.args_signature = ["lst"]; min.kwargs_signature = { }; min.types_signature = { }; min.pythonscript_function = true; -function max(args, kwargs) { +max = function(args, kwargs) { var a; var __sig__, __args__; __sig__ = { kwargs:{},args:["lst"] }; @@ -2283,7 +2283,7 @@ max.args_signature = ["lst"]; max.kwargs_signature = { }; max.types_signature = { }; max.pythonscript_function = true; -function abs(args, kwargs) { +abs = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["num"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2302,7 +2302,7 @@ abs.args_signature = ["num"]; abs.kwargs_signature = { }; abs.types_signature = { }; abs.pythonscript_function = true; -function ord(args, kwargs) { +ord = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["char"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2321,7 +2321,7 @@ ord.args_signature = ["char"]; ord.kwargs_signature = { }; ord.types_signature = { }; ord.pythonscript_function = true; -function chr(args, kwargs) { +chr = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["num"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2340,7 +2340,7 @@ chr.args_signature = ["num"]; chr.kwargs_signature = { }; chr.types_signature = { }; chr.pythonscript_function = true; -function __ArrayIterator(arr, index) { +__ArrayIterator = function(arr, index) { __ArrayIterator.__init__(this, arr, index); this.__class__ = __ArrayIterator; this.__uid__ = ("" + _PythonJS_UID); @@ -2371,7 +2371,7 @@ var Iterator, __Iterator_attrs, __Iterator_parents; __Iterator_attrs = {}; __Iterator_parents = []; __Iterator_properties = {}; -function __Iterator___init__(args, kwargs) { +__Iterator___init__ = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "obj", "index"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2396,7 +2396,7 @@ __Iterator___init__.kwargs_signature = { }; __Iterator___init__.types_signature = { }; __Iterator___init__.pythonscript_function = true; __Iterator_attrs.__init__ = __Iterator___init__; -function __Iterator_next(args, kwargs) { +__Iterator_next = function(args, kwargs) { var index; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2420,7 +2420,7 @@ __Iterator_next.types_signature = { }; __Iterator_next.pythonscript_function = true; __Iterator_attrs.next = __Iterator_next; Iterator = __create_class__("Iterator", __Iterator_parents, __Iterator_attrs, __Iterator_properties); -function tuple(args, kwargs) { +tuple = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2453,7 +2453,7 @@ tuple.args_signature = ["a"]; tuple.kwargs_signature = { }; tuple.types_signature = { }; tuple.pythonscript_function = true; -function list(args, kwargs) { +list = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2490,7 +2490,7 @@ var dict, __dict_attrs, __dict_parents; __dict_attrs = {}; __dict_parents = []; __dict_properties = {}; -function __dict___init__(args, kwargs) { +__dict___init__ = function(args, kwargs) { var ob, value; var __sig__, __args__; __sig__ = { kwargs:{"js_object": null, "pointer": null},args:["self", "js_object", "pointer"] }; @@ -2549,7 +2549,7 @@ __dict___init__.kwargs_signature = { js_object:null,pointer:null }; __dict___init__.types_signature = { js_object:"None",pointer:"None" }; __dict___init__.pythonscript_function = true; __dict_attrs.__init__ = __dict___init__; -function __dict_jsify(args, kwargs) { +__dict_jsify = function(args, kwargs) { var keys, value; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2588,7 +2588,7 @@ __dict_jsify.kwargs_signature = { }; __dict_jsify.types_signature = { }; __dict_jsify.pythonscript_function = true; __dict_attrs.jsify = __dict_jsify; -function __dict_copy(args, kwargs) { +__dict_copy = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2609,7 +2609,7 @@ __dict_copy.types_signature = { }; __dict_copy.return_type = "dict"; __dict_copy.pythonscript_function = true; __dict_attrs.copy = __dict_copy; -function __dict_clear(args, kwargs) { +__dict_clear = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2629,7 +2629,7 @@ __dict_clear.kwargs_signature = { }; __dict_clear.types_signature = { }; __dict_clear.pythonscript_function = true; __dict_attrs.clear = __dict_clear; -function __dict_has_key(args, kwargs) { +__dict_has_key = function(args, kwargs) { var __dict; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "key"] }; @@ -2659,7 +2659,7 @@ __dict_has_key.kwargs_signature = { }; __dict_has_key.types_signature = { }; __dict_has_key.pythonscript_function = true; __dict_attrs.has_key = __dict_has_key; -function __dict_update(args, kwargs) { +__dict_update = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "other"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2687,7 +2687,7 @@ __dict_update.kwargs_signature = { }; __dict_update.types_signature = { }; __dict_update.pythonscript_function = true; __dict_attrs.update = __dict_update; -function __dict_items(args, kwargs) { +__dict_items = function(args, kwargs) { var arr; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2717,7 +2717,7 @@ __dict_items.kwargs_signature = { }; __dict_items.types_signature = { }; __dict_items.pythonscript_function = true; __dict_attrs.items = __dict_items; -function __dict_get(args, kwargs) { +__dict_get = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{"_default": null},args:["self", "key", "_default"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2744,7 +2744,7 @@ __dict_get.kwargs_signature = { _default:null }; __dict_get.types_signature = { _default:"None" }; __dict_get.pythonscript_function = true; __dict_attrs.get = __dict_get; -function __dict_set(args, kwargs) { +__dict_set = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "key", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2766,7 +2766,7 @@ __dict_set.kwargs_signature = { }; __dict_set.types_signature = { }; __dict_set.pythonscript_function = true; __dict_attrs.set = __dict_set; -function __dict___len__(args, kwargs) { +__dict___len__ = function(args, kwargs) { var __dict; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2788,7 +2788,7 @@ __dict___len__.kwargs_signature = { }; __dict___len__.types_signature = { }; __dict___len__.pythonscript_function = true; __dict_attrs.__len__ = __dict___len__; -function __dict___getitem__(args, kwargs) { +__dict___getitem__ = function(args, kwargs) { var __dict; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "key"] }; @@ -2821,7 +2821,7 @@ __dict___getitem__.kwargs_signature = { }; __dict___getitem__.types_signature = { }; __dict___getitem__.pythonscript_function = true; __dict_attrs.__getitem__ = __dict___getitem__; -function __dict___setitem__(args, kwargs) { +__dict___setitem__ = function(args, kwargs) { var __dict; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "key", "value"] }; @@ -2852,7 +2852,7 @@ __dict___setitem__.kwargs_signature = { }; __dict___setitem__.types_signature = { }; __dict___setitem__.pythonscript_function = true; __dict_attrs.__setitem__ = __dict___setitem__; -function __dict_keys(args, kwargs) { +__dict_keys = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2872,7 +2872,7 @@ __dict_keys.kwargs_signature = { }; __dict_keys.types_signature = { }; __dict_keys.pythonscript_function = true; __dict_attrs.keys = __dict_keys; -function __dict_pop(args, kwargs) { +__dict_pop = function(args, kwargs) { var js_object, v; var __sig__, __args__; __sig__ = { kwargs:{"d": null},args:["self", "key", "d"] }; @@ -2902,7 +2902,7 @@ __dict_pop.kwargs_signature = { d:null }; __dict_pop.types_signature = { d:"None" }; __dict_pop.pythonscript_function = true; __dict_attrs.pop = __dict_pop; -function __dict_values(args, kwargs) { +__dict_values = function(args, kwargs) { var keys, out; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2931,7 +2931,7 @@ __dict_values.kwargs_signature = { }; __dict_values.types_signature = { }; __dict_values.pythonscript_function = true; __dict_attrs.values = __dict_values; -function __dict___contains__(args, kwargs) { +__dict___contains__ = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2958,7 +2958,7 @@ __dict___contains__.kwargs_signature = { }; __dict___contains__.types_signature = { }; __dict___contains__.pythonscript_function = true; __dict_attrs.__contains__ = __dict___contains__; -function __dict___iter__(args, kwargs) { +__dict___iter__ = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2980,7 +2980,7 @@ __dict___iter__.return_type = "Iterator"; __dict___iter__.pythonscript_function = true; __dict_attrs.__iter__ = __dict___iter__; dict = __create_class__("dict", __dict_parents, __dict_attrs, __dict_properties); -function set(args, kwargs) { +set = function(args, kwargs) { var keys, mask, s, hashtable, key, fallback; var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; @@ -3063,7 +3063,7 @@ set.args_signature = ["a"]; set.kwargs_signature = { }; set.types_signature = { }; set.pythonscript_function = true; -function frozenset(args, kwargs) { +frozenset = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3090,7 +3090,7 @@ __array_typecodes = __jsdict([["c", 1], ["b", 1], ["B", 1], ["u", 2], ["h", 2], __array_attrs.typecodes = __array_typecodes; __array_typecode_names = __jsdict([["c", "Int8"], ["b", "Int8"], ["B", "Uint8"], ["u", "Uint16"], ["h", "Int16"], ["H", "Uint16"], ["i", "Int32"], ["I", "Uint32"], ["f", "Float32"], ["d", "Float64"], ["float32", "Float32"], ["float16", "Int16"], ["float8", "Int8"], ["int32", "Int32"], ["uint32", "Uint32"], ["int16", "Int16"], ["uint16", "Uint16"], ["int8", "Int8"], ["uint8", "Uint8"]]); __array_attrs.typecode_names = __array_typecode_names; -function __array___init__(args, kwargs) { +__array___init__ = function(args, kwargs) { var size, buff; var __sig__, __args__; __sig__ = { kwargs:{"initializer": null, "little_endian": false},args:["self", "typecode", "initializer", "little_endian"] }; @@ -3139,7 +3139,7 @@ __array___init__.kwargs_signature = { initializer:null,little_endian:false }; __array___init__.types_signature = { initializer:"None",little_endian:"False" }; __array___init__.pythonscript_function = true; __array_attrs.__init__ = __array___init__; -function __array___len__(args, kwargs) { +__array___len__ = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3159,7 +3159,7 @@ __array___len__.kwargs_signature = { }; __array___len__.types_signature = { }; __array___len__.pythonscript_function = true; __array_attrs.__len__ = __array___len__; -function __array___contains__(args, kwargs) { +__array___contains__ = function(args, kwargs) { var arr; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "value"] }; @@ -3186,7 +3186,7 @@ __array___contains__.kwargs_signature = { }; __array___contains__.types_signature = { }; __array___contains__.pythonscript_function = true; __array_attrs.__contains__ = __array___contains__; -function __array___getitem__(args, kwargs) { +__array___getitem__ = function(args, kwargs) { var func_name, dataview, value, step, func, offset; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "index"] }; @@ -3228,7 +3228,7 @@ __array___getitem__.kwargs_signature = { }; __array___getitem__.types_signature = { }; __array___getitem__.pythonscript_function = true; __array_attrs.__getitem__ = __array___getitem__; -function __array___setitem__(args, kwargs) { +__array___setitem__ = function(args, kwargs) { var func_name, dataview, step, func, offset; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "index", "value"] }; @@ -3276,7 +3276,7 @@ __array___setitem__.kwargs_signature = { }; __array___setitem__.types_signature = { }; __array___setitem__.pythonscript_function = true; __array_attrs.__setitem__ = __array___setitem__; -function __array___iter__(args, kwargs) { +__array___iter__ = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3297,7 +3297,7 @@ __array___iter__.types_signature = { }; __array___iter__.return_type = "Iterator"; __array___iter__.pythonscript_function = true; __array_attrs.__iter__ = __array___iter__; -function __array_get(args, kwargs) { +__array_get = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "index"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3318,7 +3318,7 @@ __array_get.kwargs_signature = { }; __array_get.types_signature = { }; __array_get.pythonscript_function = true; __array_attrs.get = __array_get; -function __array_fromlist(args, kwargs) { +__array_fromlist = function(args, kwargs) { var typecode, i, func_name, dataview, length, item, step, func, offset, size; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "lst"] }; @@ -3368,7 +3368,7 @@ __array_fromlist.kwargs_signature = { }; __array_fromlist.types_signature = { }; __array_fromlist.pythonscript_function = true; __array_attrs.fromlist = __array_fromlist; -function __array_resize(args, kwargs) { +__array_resize = function(args, kwargs) { var source, new_buff, target, new_size, buff; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "length"] }; @@ -3399,7 +3399,7 @@ __array_resize.kwargs_signature = { }; __array_resize.types_signature = { }; __array_resize.pythonscript_function = true; __array_attrs.resize = __array_resize; -function __array_append(args, kwargs) { +__array_append = function(args, kwargs) { var length; var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "value"] }; @@ -3426,7 +3426,7 @@ __array_append.kwargs_signature = { }; __array_append.types_signature = { }; __array_append.pythonscript_function = true; __array_attrs.append = __array_append; -function __array_extend(args, kwargs) { +__array_extend = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "lst"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3454,7 +3454,7 @@ __array_extend.kwargs_signature = { }; __array_extend.types_signature = { }; __array_extend.pythonscript_function = true; __array_attrs.extend = __array_extend; -function __array_to_array(args, kwargs) { +__array_to_array = function(args, kwargs) { var i, item, arr; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3482,7 +3482,7 @@ __array_to_array.kwargs_signature = { }; __array_to_array.types_signature = { }; __array_to_array.pythonscript_function = true; __array_attrs.to_array = __array_to_array; -function __array_to_list(args, kwargs) { +__array_to_list = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3502,7 +3502,7 @@ __array_to_list.kwargs_signature = { }; __array_to_list.types_signature = { }; __array_to_list.pythonscript_function = true; __array_attrs.to_list = __array_to_list; -function __array_to_ascii(args, kwargs) { +__array_to_ascii = function(args, kwargs) { var i, length, arr, string; var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3538,7 +3538,7 @@ var file, __file_attrs, __file_parents; __file_attrs = {}; __file_parents = []; __file_properties = {}; -function __file___init__(args, kwargs) { +__file___init__ = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self", "path", "flags"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3573,7 +3573,7 @@ __file___init__.kwargs_signature = { }; __file___init__.types_signature = { }; __file___init__.pythonscript_function = true; __file_attrs.__init__ = __file___init__; -function __file_read(args, kwargs) { +__file_read = function(args, kwargs) { var _fs, path; var __sig__, __args__; __sig__ = { kwargs:{"binary": false},args:["self", "binary"] }; @@ -3601,7 +3601,7 @@ __file_read.kwargs_signature = { binary:false }; __file_read.types_signature = { binary:"False" }; __file_read.pythonscript_function = true; __file_attrs.read = __file_read; -function __file_write(args, kwargs) { +__file_write = function(args, kwargs) { var _fs, path; var __sig__, __args__; __sig__ = { kwargs:{"binary": false},args:["self", "data", "binary"] }; @@ -3630,7 +3630,7 @@ __file_write.kwargs_signature = { binary:false }; __file_write.types_signature = { binary:"False" }; __file_write.pythonscript_function = true; __file_attrs.write = __file_write; -function __file_close(args, kwargs) { +__file_close = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3651,7 +3651,7 @@ __file_close.types_signature = { }; __file_close.pythonscript_function = true; __file_attrs.close = __file_close; file = __create_class__("file", __file_parents, __file_attrs, __file_properties); -function __open__(args, kwargs) { +__open__ = function(args, kwargs) { var __sig__, __args__; __sig__ = { kwargs:{"mode": null},args:["path", "mode"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3673,7 +3673,7 @@ __open__.types_signature = { mode:"None" }; __open__.return_type = "file"; __open__.pythonscript_function = true; json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (function (o) {return JSON.stringify(o);})]]); -function __get_other_workers_with_shared_arg(worker, ob) { +__get_other_workers_with_shared_arg = function(worker, ob) { var a, other, args; a = []; var __iter22 = threading.workers; @@ -3703,12 +3703,12 @@ __get_other_workers_with_shared_arg.args_signature = ["worker", "ob"]; __get_other_workers_with_shared_arg.kwargs_signature = { }; __get_other_workers_with_shared_arg.types_signature = { }; threading = __jsdict([["workers", []], ["_blocking_callback", null]]); -function __start_new_thread(f, args) { +__start_new_thread = function(f, args) { var jsargs, worker; worker = new Worker(f); worker.__uid__ = len(threading.workers); threading.workers.append(__jsdict([["worker", worker], ["args", args]])); - function func(event) { + var func = function(event) { var a, res, value; if (( event.data.type ) == "terminate") { worker.terminate(); @@ -3781,8 +3781,8 @@ __start_new_thread.NAME = "__start_new_thread"; __start_new_thread.args_signature = ["f", "args"]; __start_new_thread.kwargs_signature = { }; __start_new_thread.types_signature = { }; -function __gen_worker_append(worker, ob, index) { - function append(item) { +__gen_worker_append = function(worker, ob, index) { + var append = function(item) { worker.postMessage(__jsdict([["type", "append"], ["argindex", index], ["value", item]])); ob.push(item); } @@ -3798,9 +3798,9 @@ __gen_worker_append.NAME = "__gen_worker_append"; __gen_worker_append.args_signature = ["worker", "ob", "index"]; __gen_worker_append.kwargs_signature = { }; __gen_worker_append.types_signature = { }; -function __webworker_wrap(ob, argindex) { +__webworker_wrap = function(ob, argindex) { if (__test_if_true__(ob instanceof Array)) { - function func(index, item) { + var func = function(index, item) { postMessage(__jsdict([["type", "__setitem__"], ["index", index], ["value", item], ["argindex", argindex]])); Array.prototype.__setitem__.call(ob, index, item); } @@ -3810,7 +3810,7 @@ function __webworker_wrap(ob, argindex) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(ob, "__setitem__", __jsdict([["enumerable", false], ["value", func], ["writeable", true], ["configurable", true]])); - function func(item) { + var func = function(item) { postMessage(__jsdict([["type", "append"], ["value", item], ["argindex", argindex]])); Array.prototype.push.call(ob, item); } @@ -3822,7 +3822,7 @@ function __webworker_wrap(ob, argindex) { Object.defineProperty(ob, "append", __jsdict([["enumerable", false], ["value", func], ["writeable", true], ["configurable", true]])); } else { if (( typeof(ob) ) == "object") { - function func(key, item) { + var func = function(key, item) { postMessage(__jsdict([["type", "__setitem__"], ["index", key], ["value", item], ["argindex", argindex]])); ob[((key.__uid__) ? key.__uid__ : key)] = item; } @@ -3841,7 +3841,7 @@ __webworker_wrap.NAME = "__webworker_wrap"; __webworker_wrap.args_signature = ["ob", "argindex"]; __webworker_wrap.kwargs_signature = { }; __webworker_wrap.types_signature = { }; -function __rpc__(url, func, args) { +__rpc__ = function(url, func, args) { var req; req = new XMLHttpRequest(); req.open("POST", url, false); @@ -3854,7 +3854,7 @@ __rpc__.NAME = "__rpc__"; __rpc__.args_signature = ["url", "func", "args"]; __rpc__.kwargs_signature = { }; __rpc__.types_signature = { }; -function __rpc_iter__(url, attr) { +__rpc_iter__ = function(url, attr) { var req; req = new XMLHttpRequest(); req.open("POST", url, false); @@ -3867,7 +3867,7 @@ __rpc_iter__.NAME = "__rpc_iter__"; __rpc_iter__.args_signature = ["url", "attr"]; __rpc_iter__.kwargs_signature = { }; __rpc_iter__.types_signature = { }; -function __rpc_set__(url, attr, value) { +__rpc_set__ = function(url, attr, value) { var req; req = new XMLHttpRequest(); req.open("POST", url, false); @@ -3879,7 +3879,7 @@ __rpc_set__.NAME = "__rpc_set__"; __rpc_set__.args_signature = ["url", "attr", "value"]; __rpc_set__.kwargs_signature = { }; __rpc_set__.types_signature = { }; -function __rpc_get__(url, attr) { +__rpc_get__ = function(url, attr) { var req; req = new XMLHttpRequest(); req.open("POST", url, false); diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index beff5b0..e9c5ef5 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -19,10 +19,10 @@ #import code_writer class JSGenerator(NodeVisitor): #, inline_function.Inliner): - def __init__(self, requirejs=True, insert_runtime=True, webworker=False): + def __init__(self, requirejs=True, insert_runtime=True, webworker=False, function_expressions=False): #writer = code_writer.Writer() #self.setup_inliner( writer ) - self._func_expressions = False + self._func_expressions = function_expressions self._indent = 0 self._global_functions = {} self._function_stack = [] @@ -633,14 +633,14 @@ def visit_Break(self, node): def generate_runtime(): from python_to_pythonjs import main as py2pyjs lines = [ - main( open('runtime/pythonpythonjs.py', 'rb').read(), requirejs=False, insert_runtime=False ), ## lowlevel pythonjs - main( py2pyjs(open('runtime/builtins.py', 'rb').read()), requirejs=False, insert_runtime=False ) + main( open('runtime/pythonpythonjs.py', 'rb').read(), requirejs=False, insert_runtime=False, function_expressions=True ), ## lowlevel pythonjs + main( py2pyjs(open('runtime/builtins.py', 'rb').read()), requirejs=False, insert_runtime=False, function_expressions=True ) ] return '\n'.join( lines ) -def main(script, requirejs=True, insert_runtime=True, webworker=False): +def main(script, requirejs=True, insert_runtime=True, webworker=False, function_expressions=False): tree = ast.parse( script ) - return JSGenerator( requirejs=requirejs, insert_runtime=insert_runtime, webworker=webworker ).visit(tree) + return JSGenerator( requirejs=requirejs, insert_runtime=insert_runtime, webworker=webworker, function_expressions=function_expressions ).visit(tree) def command(): From 2e8b82f9dce4d336342e724f06483e6e5948d3ec Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 9 Jun 2014 15:59:39 -0700 Subject: [PATCH 006/222] regression test for custom callable __call__, updated README. --- README.md | 10 +++++++++- regtests/class/__call__.py | 13 +++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 regtests/class/__call__.py diff --git a/README.md b/README.md index 27f64f7..cb9c1c1 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,15 @@ Supported Features regular and lambda functions function calls with *args and **kwargs - +####Operator Overloading + + __getattr__ + __getattribute__ + __getitem__ + __setitem__ + __call__ + __iter__ + __add__ ####builtins diff --git a/regtests/class/__call__.py b/regtests/class/__call__.py new file mode 100644 index 0000000..5f03499 --- /dev/null +++ b/regtests/class/__call__.py @@ -0,0 +1,13 @@ +"""custom callable""" + +class A: + def __init__(self): + self.x = 5 + def __call__(self): + return 'XXX' + + +def main(): + a = A() + TestError(a.x == 5) + TestError( a()=='XXX' ) \ No newline at end of file From 46845a09f09584244f9b242366bb90e8676a4761 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 9 Jun 2014 18:01:12 -0700 Subject: [PATCH 007/222] support multiply string, list, and custom overloading with `__mul__` --- README.md | 1 + pythonjs/python_to_pythonjs.py | 6 + pythonjs/pythonjs.js | 248 +++++++++++++++++++-------------- pythonjs/runtime/builtins.py | 20 +++ regtests/class/__add__.py | 15 ++ regtests/class/__mul__.py | 15 ++ regtests/list/mul.py | 9 ++ regtests/str/mul.py | 8 ++ 8 files changed, 219 insertions(+), 103 deletions(-) create mode 100644 regtests/class/__add__.py create mode 100644 regtests/class/__mul__.py create mode 100644 regtests/list/mul.py create mode 100644 regtests/str/mul.py diff --git a/README.md b/README.md index cb9c1c1..45742b5 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,7 @@ Supported Features __call__ __iter__ __add__ + __mul__ ####builtins diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index bcdd376..bf8890d 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1192,6 +1192,12 @@ def visit_BinOp(self, node): power = POWER_OF_TWO.index( node.right.n ) return '%s >> %s'%(left, power) + elif not self._with_dart and not self._with_js and op == '*': + if left in self._typedef_vars and self._typedef_vars[left] in typedpython.native_number_types: + return '(%s * %s)'%(left, right) + else: + return '__mul_op(%s,%s)'%(left, right) + elif op == '//': if self._with_dart: return '(%s/%s).floor()' %(left, right) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 05b3ae3..b8f44bd 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -686,6 +686,48 @@ __add_op.NAME = "__add_op"; __add_op.args_signature = ["a", "b"]; __add_op.kwargs_signature = { }; __add_op.types_signature = { }; +__mul_op = function(a, b) { + var c, arr, t; + t = typeof(a); + if (( t ) == "number") { + return a * b; + } else { + if (( t ) == "string") { + arr = []; + var i, i__end__; + i = 0; + i__end__ = b; + while (( i ) < i__end__) { + arr.append(a); + i += 1; + } + return "".join(arr); + } else { + if (__test_if_true__(a instanceof Array)) { + c = []; + ; + i = 0; + i__end__ = b; + while (( i ) < i__end__) { + c.extend(a); + i += 1; + } + return c; + } else { + if (__test_if_true__(a.__mul__)) { + return a.__mul__(b); + } else { + throw new TypeError("invalid objects for multiplication"); + } + } + } + } +} + +__mul_op.NAME = "__mul_op"; +__mul_op.args_signature = ["a", "b"]; +__mul_op.kwargs_signature = { }; +__mul_op.types_signature = { }; __jsdict = function(items) { var d, key; d = {}; @@ -1172,8 +1214,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 381: while i < bases.length:")) { - if (__test_if_true__(issubclass([__get__(bases, "__getitem__", "line 382: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 401: while i < bases.length:")) { + if (__test_if_true__(issubclass([__get__(bases, "__getitem__", "line 402: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1996,7 +2038,7 @@ bisect = function(args, kwargs) { var x = __args__['x']; var low = __args__['low']; var high = __args__['high']; - return __get__(__get__(a, "bisect", "missing attribute `bisect` - line 740: return a.bisect(x, low, high)"), "__call__")([x, low, high], __NULL_OBJECT__); + return __get__(__get__(a, "bisect", "missing attribute `bisect` - line 760: return a.bisect(x, low, high)"), "__call__")([x, low, high], __NULL_OBJECT__); } bisect.NAME = "bisect"; @@ -2075,12 +2117,12 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b, __iterator__17; - __iterator__17 = __get__(__get__(arr, "__iter__", "no iterator - line 764: for b in arr:"), "__call__")([], __NULL_OBJECT__); - var __next__17; - __next__17 = __get__(__iterator__17, "next"); - while (( __iterator__17.index ) < __iterator__17.length) { - b = __next__17(); + var b, __iterator__19; + __iterator__19 = __get__(__get__(arr, "__iter__", "no iterator - line 784: for b in arr:"), "__call__")([], __NULL_OBJECT__); + var __next__19; + __next__19 = __get__(__iterator__19, "next"); + while (( __iterator__19.index ) < __iterator__19.length) { + b = __next__19(); a += b; } return a; @@ -2119,7 +2161,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 784: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 804: return ob.__len__()"), "__call__")(); } } } @@ -2142,7 +2184,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 788: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 808: return obj.next()"), "__call__")(); } next.NAME = "next"; @@ -2164,12 +2206,12 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob, __iterator__18; - __iterator__18 = __get__(__get__(objs, "__iter__", "no iterator - line 793: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__18; - __next__18 = __get__(__iterator__18, "next"); - while (( __iterator__18.index ) < __iterator__18.length) { - ob = __next__18(); + var ob, __iterator__20; + __iterator__20 = __get__(__get__(objs, "__iter__", "no iterator - line 813: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__20; + __next__20 = __get__(__iterator__20, "next"); + while (( __iterator__20.index ) < __iterator__20.length) { + ob = __next__20(); v = __get__(func, "__call__")([ob], __NULL_OBJECT__); arr.push(v); } @@ -2195,12 +2237,12 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob, __iterator__19; - __iterator__19 = __get__(__get__(objs, "__iter__", "no iterator - line 801: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__19; - __next__19 = __get__(__iterator__19, "next"); - while (( __iterator__19.index ) < __iterator__19.length) { - ob = __next__19(); + var ob, __iterator__21; + __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 821: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__21; + __next__21 = __get__(__iterator__21, "next"); + while (( __iterator__21.index ) < __iterator__21.length) { + ob = __next__21(); if (__test_if_true__(__get__(func, "__call__")([ob], __NULL_OBJECT__))) { arr.push(ob); } @@ -2226,12 +2268,12 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value, __iterator__20; - __iterator__20 = __get__(__get__(lst, "__iter__", "no iterator - line 810: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__20; - __next__20 = __get__(__iterator__20, "next"); - while (( __iterator__20.index ) < __iterator__20.length) { - value = __next__20(); + var value, __iterator__22; + __iterator__22 = __get__(__get__(lst, "__iter__", "no iterator - line 830: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__22; + __next__22 = __get__(__iterator__22, "next"); + while (( __iterator__22.index ) < __iterator__22.length) { + value = __next__22(); if (( a ) === null) { a = value; } else { @@ -2261,12 +2303,12 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value, __iterator__21; - __iterator__21 = __get__(__get__(lst, "__iter__", "no iterator - line 817: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__21; - __next__21 = __get__(__iterator__21, "next"); - while (( __iterator__21.index ) < __iterator__21.length) { - value = __next__21(); + var value, __iterator__23; + __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 837: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__23; + __next__23 = __get__(__iterator__23, "next"); + while (( __iterator__23.index ) < __iterator__23.length) { + value = __next__23(); if (( a ) === null) { a = value; } else { @@ -2387,7 +2429,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 852: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 872: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.NAME = "__Iterator___init__"; @@ -2511,28 +2553,28 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o, __iterator__22; - __iterator__22 = __get__(__get__(ob, "__iter__", "no iterator - line 907: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__22; - __next__22 = __get__(__iterator__22, "next"); - while (( __iterator__22.index ) < __iterator__22.length) { - o = __next__22(); + var o, __iterator__24; + __iterator__24 = __get__(__get__(ob, "__iter__", "no iterator - line 927: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__24; + __next__24 = __get__(__iterator__24, "next"); + while (( __iterator__24.index ) < __iterator__24.length) { + o = __next__24(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 909: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 909: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 909: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 929: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 929: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 929: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 911: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 911: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 911: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 931: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 931: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 931: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key, __iterator__23; - __iterator__23 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 913: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__23; - __next__23 = __get__(__iterator__23, "next"); - while (( __iterator__23.index ) < __iterator__23.length) { - key = __next__23(); - value = __get__(ob, "__getitem__", "line 914: value = ob[ key ]")([key], __NULL_OBJECT__); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 915: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + var key, __iterator__25; + __iterator__25 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 933: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__25; + __next__25 = __get__(__iterator__25, "next"); + while (( __iterator__25.index ) < __iterator__25.length) { + key = __next__25(); + value = __get__(ob, "__getitem__", "line 934: value = ob[ key ]")([key], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 935: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2562,16 +2604,16 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key, __iterator__24; - __iterator__24 = __get__(__get__(keys, "__iter__", "no iterator - line 923: for key in keys:"), "__call__")([], __NULL_OBJECT__); - var __next__24; - __next__24 = __get__(__iterator__24, "next"); - while (( __iterator__24.index ) < __iterator__24.length) { - key = __next__24(); - value = __get__(self["$wrapped"], "__getitem__", "line 924: value = self[...][key]")([key], __NULL_OBJECT__); + var key, __iterator__26; + __iterator__26 = __get__(__get__(keys, "__iter__", "no iterator - line 943: for key in keys:"), "__call__")([], __NULL_OBJECT__); + var __next__26; + __next__26 = __get__(__iterator__26, "next"); + while (( __iterator__26.index ) < __iterator__26.length) { + key = __next__26(); + value = __get__(self["$wrapped"], "__getitem__", "line 944: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 927: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 947: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2644,7 +2686,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 943: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 963: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2671,13 +2713,13 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key, __iterator__25; - __iterator__25 = __get__(__get__(other, "__iter__", "no iterator - line 951: for key in other:"), "__call__")([], __NULL_OBJECT__); - var __next__25; - __next__25 = __get__(__iterator__25, "next"); - while (( __iterator__25.index ) < __iterator__25.length) { - key = __next__25(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 952: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 952: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); + var key, __iterator__27; + __iterator__27 = __get__(__get__(other, "__iter__", "no iterator - line 971: for key in other:"), "__call__")([], __NULL_OBJECT__); + var __next__27; + __next__27 = __get__(__iterator__27, "next"); + while (( __iterator__27.index ) < __iterator__27.length) { + key = __next__27(); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 972: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 972: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); } } @@ -2700,13 +2742,13 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key, __iterator__26; - __iterator__26 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 956: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__26; - __next__26 = __get__(__iterator__26, "next"); - while (( __iterator__26.index ) < __iterator__26.length) { - key = __next__26(); - __get__(__get__(arr, "append", "missing attribute `append` - line 957: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + var key, __iterator__28; + __iterator__28 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 976: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__28; + __next__28 = __get__(__iterator__28, "next"); + while (( __iterator__28.index ) < __iterator__28.length) { + key = __next__28(); + __get__(__get__(arr, "append", "missing attribute `append` - line 977: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2757,7 +2799,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 967: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 987: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.NAME = "__dict_set"; @@ -3106,11 +3148,11 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1168: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1168: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1188: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1188: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); - self.bytes = (self.length * self.itemsize); + self.bytes = __mul_op(self.length, self.itemsize); if (( self.typecode ) == "float8") { self._scale = max([[abs([min([initializer], __NULL_OBJECT__)], __NULL_OBJECT__), max([initializer], __NULL_OBJECT__)]], __NULL_OBJECT__); self._norm_get = (self._scale / 127); @@ -3130,7 +3172,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1192: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1212: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.NAME = "__array___init__"; @@ -3172,7 +3214,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1200: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1220: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3200,20 +3242,20 @@ __array___getitem__ = function(args, kwargs) { var self = __args__['self']; var index = __args__['index']; step = self.itemsize; - offset = (step * index); + offset = __mul_op(step, index); dataview = self.dataview; var __left34, __right35; __left34 = "get"; - __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1210: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1210: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1230: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1230: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left34) ) == "number") ? (__left34 + __right35) : __add_op(__left34, __right35)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); if (( self.typecode ) == "float8") { - value = (value * self._norm_get); + value = __mul_op(value, self._norm_get); } else { if (( self.typecode ) == "float16") { - value = (value * self._norm_get); + value = __mul_op(value, self._norm_get); } } return value; @@ -3249,19 +3291,19 @@ __array___setitem__ = function(args, kwargs) { __right37 = index; index = (((( typeof(__left36) ) == "number") ? (__left36 + __right37) : __add_op(__left36, __right37)) - 1); } - offset = (step * index); + offset = __mul_op(step, index); dataview = self.dataview; var __left38, __right39; __left38 = "set"; - __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1229: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1229: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1249: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1249: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left38) ) == "number") ? (__left38 + __right39) : __add_op(__left38, __right39)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { - value = (value * self._norm_set); + value = __mul_op(value, self._norm_set); } else { if (( self.typecode ) == "float16") { - value = (value * self._norm_set); + value = __mul_op(value, self._norm_set); } } func(offset, value); @@ -3334,18 +3376,18 @@ __array_fromlist = function(args, kwargs) { length = len([lst], __NULL_OBJECT__); step = self.itemsize; typecode = self.typecode; - size = (length * step); + size = __mul_op(length, step); dataview = self.dataview; var __left40, __right41; __left40 = "set"; - __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1254: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1254: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); + __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1274: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1274: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); func_name = ((( typeof(__left40) ) == "number") ? (__left40 + __right41) : __add_op(__left40, __right41)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = __get__(lst, "__getitem__", "line 1259: item = lst[i]")([i], __NULL_OBJECT__); + item = __get__(lst, "__getitem__", "line 1279: item = lst[i]")([i], __NULL_OBJECT__); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3383,7 +3425,7 @@ __array_resize = function(args, kwargs) { var length = __args__['length']; buff = self.buffer; source = new Uint8Array(buff); - new_size = (length * self.itemsize); + new_size = __mul_op(length, self.itemsize); new_buff = new ArrayBuffer(new_size); target = new Uint8Array(new_buff); target.set(source); @@ -3416,7 +3458,7 @@ __array_append = function(args, kwargs) { var __left42, __right43; __left42 = self.length; __right43 = 1; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1287: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1307: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3438,13 +3480,13 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value, __iterator__31; - __iterator__31 = __get__(__get__(lst, "__iter__", "no iterator - line 1291: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__31; - __next__31 = __get__(__iterator__31, "next"); - while (( __iterator__31.index ) < __iterator__31.length) { - value = __next__31(); - __get__(__get__(self, "append", "missing attribute `append` - line 1292: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + var value, __iterator__33; + __iterator__33 = __get__(__get__(lst, "__iter__", "no iterator - line 1311: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__33; + __next__33 = __get__(__iterator__33, "next"); + while (( __iterator__33.index ) < __iterator__33.length) { + value = __next__33(); + __get__(__get__(self, "append", "missing attribute `append` - line 1312: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3493,7 +3535,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1304: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1324: return self.to_array()"), "__call__")(); } __array_to_list.NAME = "__array_to_list"; @@ -3515,9 +3557,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1308: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1328: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1309: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1329: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 43d41a9..d0fece5 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -118,6 +118,26 @@ def __add_op(a, b): else: raise TypeError('invalid objects for addition') + def __mul_op(a, b): + t = typeof(a) + if t == 'number': + return JS("a * b") + elif t == 'string': + arr = [] + for i in range(b): + arr.append(a) + return ''.join(arr) + elif instanceof(a, Array): + c = [] + for i in range(b): + c.extend(a) + return c + elif a.__mul__: + return a.__mul__(b) + else: + raise TypeError('invalid objects for multiplication') + + def __jsdict( items ): d = JS("{}") for item in items: diff --git a/regtests/class/__add__.py b/regtests/class/__add__.py new file mode 100644 index 0000000..075d401 --- /dev/null +++ b/regtests/class/__add__.py @@ -0,0 +1,15 @@ +"""custom addition""" + +class A: + def __init__(self): + self.x = 5 + def __add__(self, other): + return self.x + other.x + + +def main(): + a = A() + b = A() + c = a + b + TestError( c == 10 ) + diff --git a/regtests/class/__mul__.py b/regtests/class/__mul__.py new file mode 100644 index 0000000..1890efe --- /dev/null +++ b/regtests/class/__mul__.py @@ -0,0 +1,15 @@ +"""custom multiplication""" + +class A: + def __init__(self): + self.x = 5 + def __mul__(self, other): + return self.x * other.x + + +def main(): + a = A() + b = A() + c = a * b + TestError( c == 25 ) + diff --git a/regtests/list/mul.py b/regtests/list/mul.py new file mode 100644 index 0000000..5938f4d --- /dev/null +++ b/regtests/list/mul.py @@ -0,0 +1,9 @@ +"""list multiplication""" + + +def main(): + a = ['hi'] + b = a * 2 + TestError( len(b)==2 ) + TestError( b[0]=='hi' ) + TestError( b[1]=='hi' ) diff --git a/regtests/str/mul.py b/regtests/str/mul.py new file mode 100644 index 0000000..f71ca45 --- /dev/null +++ b/regtests/str/mul.py @@ -0,0 +1,8 @@ +"""string multiplication""" + + +def main(): + a = 'hi' + b = a * 2 + TestError( b == 'hihi' ) + From aa3b04a024cb4759b91b62b53788ee8ff9b33860 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 9 Jun 2014 20:21:07 -0700 Subject: [PATCH 008/222] SyntaxErrors in 1st phase of translation will now show the line number and source code that caused the error. fixed bisect builtin. --- pythonjs/python_to_pythonjs.py | 63 ++++++++++++++++++++++++---------- pythonjs/pythonjs.js | 2 +- pythonjs/runtime/builtins.py | 6 ++-- 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index bf8890d..a27f78a 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -122,6 +122,16 @@ class PythonToPythonJS(NodeVisitor, inline_function.Inliner): identifier = 0 _func_typedefs = () + def format_error(self, node): + lines = [] + if self._line_number > 0: + lines.append( self._source[self._line_number-1] ) + lines.append( self._source[self._line_number] ) + if self._line_number+1 < len(self._source): + lines.append( self._source[self._line_number+1] ) + + return 'line %s\n%s\n%s' %(self._line_number, '\n'.join(lines), node) + def __init__(self, source=None, module=None, module_path=None, dart=False, coffee=False, lua=False): source = typedpython.transform_source( source ) @@ -129,6 +139,9 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe super(PythonToPythonJS, self).__init__() self.setup_inliner( writer ) + self._line = None + self._line_number = 0 + self._direct_operators = set() ## optimize "+" operator self._with_ll = False ## lowlevel self._with_lua = lua @@ -366,6 +379,11 @@ def visit_ImportFrom(self, node): elif node.module == 'array' and node.names[0].name == 'array': self._use_array = True ## this is just a hint that calls to array call the builtin array + elif node.module == 'bisect' and node.names[0].name == 'bisect': + ## bisect library is part of the stdlib, + ## in pythonjs it is a builtin function defined in builtins.py + pass + elif node.module in lib: imported = False for n in node.names: @@ -1004,7 +1022,7 @@ def visit_BoolOp(self, node): def visit_If(self, node): if self._with_dart and writer.is_at_global_level(): - raise SyntaxError('if statements can not be used at module level in dart') + raise SyntaxError( self.format_error('if statements can not be used at module level in dart') ) elif self._with_lua: writer.write('if __test_if_true__(%s):' % self.visit(node.test)) @@ -1050,7 +1068,7 @@ def visit_Raise(self, node): elif isinstance(node.type, ast.Call): if len(node.type.args) > 1: - raise SyntaxError('error to raise can have at most a single argument') + raise SyntaxError( self.format_error('raise Error(x) can only have a single argument') ) if node.type.args: writer.write( 'raise %s(%s)' %(self.visit(node.type.func), self.visit(node.type.args[0])) ) else: @@ -1157,9 +1175,10 @@ def visit_BinOp(self, node): if node.right.id in self._global_nodes: n = self._global_nodes[ node.right.id ].n else: - raise SyntaxError + raise SyntaxError( self.format_error(node) ) else: - raise SyntaxError + #raise SyntaxError( self.format_error(node) ) + return '__mul_op(%s,%s)'%(left, right) elts = [ self.visit(e) for e in node.left.elts ] expanded = [] @@ -1495,6 +1514,11 @@ def visit_Assign(self, node): use_runtime_errors = use_runtime_errors and self._with_runtime_exceptions lineno = node.lineno + if node.lineno < len(self._source): + src = self._source[ node.lineno ] + self._line_number = node.lineno + self._line = src + if use_runtime_errors: writer.write('try:') @@ -1515,7 +1539,7 @@ def visit_Assign(self, node): self._typedef_vars[ node.value.id ] = target.id return None else: - raise SyntaxError(targets) + raise SyntaxError( self.format_error(targets) ) elif self._with_rpc_name and isinstance(target, Attribute) and isinstance(target.value, Name) and target.value.id == self._with_rpc_name: writer.write('__rpc_set__(%s, "%s", %s)' %(self._with_rpc, target.attr, self.visit(node.value))) @@ -1760,10 +1784,11 @@ def visit_Str(self, node): return '"""%s"""' %s.encode('utf-8') def visit_Expr(self, node): - log('line: %s' %node.lineno ) if node.lineno < len(self._source): src = self._source[ node.lineno ] - log( src ) + ## TODO raise SyntaxErrors with the line number and line source + self._line_number = node.lineno + self._line = src use_runtime_errors = not (self._with_js or self._with_ll or self._with_dart or self._with_coffee or self._with_lua) use_runtime_errors = use_runtime_errors and self._with_runtime_exceptions @@ -1831,7 +1856,7 @@ def visit_Call(self, node): #return '%s.append( [%s], __NULL_OBJECT__)' %(node.func.value.id, self.visit(node.args[0]) ) return '%s.push( %s )' %(node.func.value.id, self.visit(node.args[0]) ) else: - raise SyntaxError + raise SyntaxError( self.format_error(node) ) elif self._with_webworker and isinstance(node.func, ast.Attribute) and isinstance(node.func.value, Name) and node.func.value.id == 'self' and node.func.attr == 'terminate': @@ -1843,7 +1868,7 @@ def visit_Call(self, node): elif node.func.attr == 'start_webworker': return '__start_new_thread( %s, %s )' %(self.visit(node.args[0]), self.visit(node.args[1])) else: - raise SyntaxError(node.func.attr) + raise SyntaxError( self.format_error(node.func.attr) ) elif self._with_webworker and name in self._global_functions: node.calling_from_worker = True @@ -1866,7 +1891,7 @@ def visit_Call(self, node): self._with_js = False writer.with_javascript = False else: - raise SyntaxError + raise SyntaxError( self.format_error(node) ) elif kw.arg == 'dart': if kw.value.id == 'True': @@ -1874,7 +1899,7 @@ def visit_Call(self, node): elif kw.value.id == 'False': self._with_dart = False else: - raise SyntaxError + raise SyntaxError( self.format_error(node) ) elif kw.arg == 'coffee': if kw.value.id == 'True': @@ -1882,7 +1907,7 @@ def visit_Call(self, node): elif kw.value.id == 'False': self._with_coffee = False else: - raise SyntaxError + raise SyntaxError( self.format_error(node) ) elif kw.arg == 'lua': if kw.value.id == 'True': @@ -1890,7 +1915,7 @@ def visit_Call(self, node): elif kw.value.id == 'False': self._with_lua = False else: - raise SyntaxError + raise SyntaxError( self.format_error(node) ) elif kw.arg == 'inline_functions': if kw.value.id == 'True': @@ -1898,7 +1923,7 @@ def visit_Call(self, node): elif kw.value.id == 'False': self._with_inline = False else: - raise SyntaxError + raise SyntaxError( self.format_error(node) ) elif kw.arg == 'runtime_exceptions': if kw.value.id == 'True': @@ -1906,7 +1931,7 @@ def visit_Call(self, node): elif kw.value.id == 'False': self._with_runtime_exceptions = False else: - raise SyntaxError + raise SyntaxError( self.format_error(node) ) elif kw.arg == 'direct_operator': if kw.value.s.lower() == 'none': @@ -1915,7 +1940,7 @@ def visit_Call(self, node): self._direct_operators.add( kw.value.s ) else: - raise SyntaxError + raise SyntaxError( self.format_error(node) ) elif self._with_ll or name == 'inline': args = [self.visit(arg) for arg in node.args] @@ -2352,7 +2377,7 @@ def visit_FunctionDef(self, node): elif isinstance(decorator, Attribute) and isinstance(decorator.value, Name) and decorator.value.id in self._decorator_properties: if decorator.attr == 'setter': if self._decorator_properties[ decorator.value.id ]['set']: - raise SyntaxError('user error - the same decorator.setter is used more than once!') + raise SyntaxError( self.format_error("decorator.setter is used more than once") ) n = node.name + '__setprop__' self._decorator_properties[ decorator.value.id ]['set'] = n node.name = n @@ -2424,7 +2449,7 @@ def visit_FunctionDef(self, node): ## dart supports optional positional params [x=1, y=2], or optional named {x:1, y:2} ## but not both at the same time. if node.args.kwarg: - raise SyntaxError( 'dart functions can not take variable keyword arguments (**kwargs)' ) + raise SyntaxError( self.format_error('dart functions can not take variable keyword arguments (**kwargs)' ) ) for dec in with_dart_decorators: writer.write('@%s'%dec) @@ -2441,7 +2466,7 @@ def visit_FunctionDef(self, node): if node.args.vararg: if node.args.defaults: - raise SyntaxError( 'dart functions can not use variable arguments (*args) and have keyword arguments' ) + raise SyntaxError( self.format_error('dart functions can not use variable arguments (*args) and have keyword arguments' ) ) args.append('__variable_args__%s' %node.args.vararg) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index b8f44bd..af2c86a 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -2038,7 +2038,7 @@ bisect = function(args, kwargs) { var x = __args__['x']; var low = __args__['low']; var high = __args__['high']; - return __get__(__get__(a, "bisect", "missing attribute `bisect` - line 760: return a.bisect(x, low, high)"), "__call__")([x, low, high], __NULL_OBJECT__); + return a.bisect(x, low, high); } bisect.NAME = "bisect"; diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index d0fece5..6e3b675 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -755,9 +755,9 @@ def index(obj): def bisect(a, x, low=None, high=None): - #if isinstance(a, list): - # return a[...].bisect(x, low, high) - return a.bisect(x, low, high) + ## bisect function from bisect module of the stdlib + with javascript: + return a.bisect(x, low, high) def range(num, stop, step): From fdefd7508ae6fd028da1181cd6091eda9bc8daac Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 9 Jun 2014 20:42:36 -0700 Subject: [PATCH 009/222] fixed set builtin, new regression test set/issubset.py --- pythonjs/pythonjs.js | 5 +---- pythonjs/runtime/builtins.py | 4 ++-- regtests/set/issubset.py | 10 ++++++++++ 3 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 regtests/set/issubset.py diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index af2c86a..2a56576 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -3035,9 +3035,6 @@ set = function(args, kwargs) { __args__ = __getargs__("set", __sig__, args, kwargs); var a = __args__['a']; "\n This returns an array that is a minimal implementation of set.\n Often sets are used simply to remove duplicate entries from a list, \n and then it get converted back to a list, it is safe to use fastset for this.\n\n The array prototype is overloaded with basic set functions:\n difference\n intersection\n issubset\n\n Note: sets in Python are not subscriptable, but can be iterated over.\n\n Python docs say that set are unordered, some programs may rely on this disorder\n for randomness, for sets of integers we emulate the unorder only uppon initalization \n of the set, by masking the value by bits-1. Python implements sets starting with an \n array of length 8, and mask of 7, if set length grows to 6 (3/4th), then it allocates \n a new array of length 32 and mask of 31. This is only emulated for arrays of \n integers up to an array length of 1536.\n\n "; - if (__test_if_true__(a instanceof Array)) { - a = a["$wrapped"]; - } hashtable = null; if (( a.length ) <= 1536) { hashtable = __jsdict([]); @@ -3066,7 +3063,7 @@ set = function(args, kwargs) { if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { var b = __iter19[ __idx19 ]; - if (__test_if_true__(typeof(b, "number") && ( b ) === ( (b | 0) ))) { + if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[((key.__uid__) ? key.__uid__ : key)] = b; keys.push(key); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 6e3b675..87051e5 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -1077,7 +1077,7 @@ def set(a): ''' with javascript: - if isinstance(a, list): a = a[...] + hashtable = null if a.length <= 1536: hashtable = {} @@ -1096,7 +1096,7 @@ def set(a): fallback = False if hashtable: for b in a: - if typeof(b,'number') and b is (b|0): ## set if integer + if typeof(b)=='number' and b is (b|0): ## set if integer key = b & mask hashtable[ key ] = b keys.push( key ) diff --git a/regtests/set/issubset.py b/regtests/set/issubset.py new file mode 100644 index 0000000..9e2b3df --- /dev/null +++ b/regtests/set/issubset.py @@ -0,0 +1,10 @@ +"""get/set remote attributes""" + +def main(): + x = set([1,2,3]) + y = set([1,2,3,4]) + + TestError( x.issubset(y)==True ) + TestError( y.issubset(x)==False ) + + \ No newline at end of file From 8d2c5ea192fe5fa583f77270382b622a122665a2 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 9 Jun 2014 21:18:50 -0700 Subject: [PATCH 010/222] fixed list.sort(), numeric elements now sort properly as they should in numeric order --- pythonjs/python_to_pythonjs.py | 8 ++- pythonjs/pythonjs.js | 102 +++++++++++++++++++++------------ pythonjs/runtime/builtins.py | 17 ++++++ regtests/list/sort.py | 16 ++++++ 4 files changed, 105 insertions(+), 38 deletions(-) create mode 100644 regtests/list/sort.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index a27f78a..f6793e0 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2010,6 +2010,9 @@ def visit_Call(self, node): elif anode.attr == 'split' and not args: return '__split_method(%s)' %self.visit(anode.value) + elif anode.attr == 'sort' and not args: + return '__sort_method(%s)' %self.visit(anode.value) + elif anode.attr == 'replace' and len(node.args)==2: return '__replace_method(%s, %s)' %(self.visit(anode.value), ','.join(args) ) @@ -2192,7 +2195,7 @@ def visit_Call(self, node): ####################################### ## special method calls ## - if isinstance(node.func, ast.Attribute) and node.func.attr in ('get', 'keys', 'values', 'pop', 'items', 'split', 'replace') and not self._with_lua: + if isinstance(node.func, ast.Attribute) and node.func.attr in ('get', 'keys', 'values', 'pop', 'items', 'split', 'replace', 'sort') and not self._with_lua: anode = node.func if anode.attr == 'get' and len(node.args) > 0 and len(node.args) <= 2: return '__jsdict_get(%s, %s)' %(self.visit(anode.value), args ) @@ -2212,6 +2215,9 @@ def visit_Call(self, node): else: return '__jsdict_pop(%s)' %self.visit(anode.value) + elif anode.attr == 'sort' and not args: + return '__sort_method(%s)' %self.visit(anode.value) + elif anode.attr == 'split' and len(node.args) <= 1: if not args: return '__split_method(%s)' %self.visit(anode.value) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 2a56576..672943a 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -1639,6 +1639,34 @@ _setup_str_prototype.kwargs_signature = { }; _setup_str_prototype.types_signature = { }; _setup_str_prototype.pythonscript_function = true; _setup_str_prototype(); +__sort_method = function(ob) { + if (__test_if_true__(ob instanceof Array)) { + var f = function(a, b) { + if (( a ) < b) { + return -1; + } else { + if (( a ) > b) { + return 1; + } else { + return 0; + } + } + } + + f.NAME = "f"; + f.args_signature = ["a", "b"]; + f.kwargs_signature = { }; + f.types_signature = { }; + return ob.sort( f ); + } else { + return ob.sort(); + } +} + +__sort_method.NAME = "__sort_method"; +__sort_method.args_signature = ["ob"]; +__sort_method.kwargs_signature = { }; +__sort_method.types_signature = { }; _setup_array_prototype = function(args, kwargs) { var func = function() { var i, item; @@ -2118,7 +2146,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b, __iterator__19; - __iterator__19 = __get__(__get__(arr, "__iter__", "no iterator - line 784: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__19 = __get__(__get__(arr, "__iter__", "no iterator - line 801: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__19; __next__19 = __get__(__iterator__19, "next"); while (( __iterator__19.index ) < __iterator__19.length) { @@ -2161,7 +2189,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 804: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 821: return ob.__len__()"), "__call__")(); } } } @@ -2184,7 +2212,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 808: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 825: return obj.next()"), "__call__")(); } next.NAME = "next"; @@ -2207,7 +2235,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__20; - __iterator__20 = __get__(__get__(objs, "__iter__", "no iterator - line 813: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__20 = __get__(__get__(objs, "__iter__", "no iterator - line 830: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__20; __next__20 = __get__(__iterator__20, "next"); while (( __iterator__20.index ) < __iterator__20.length) { @@ -2238,7 +2266,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__21; - __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 821: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 838: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__21; __next__21 = __get__(__iterator__21, "next"); while (( __iterator__21.index ) < __iterator__21.length) { @@ -2269,7 +2297,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__22; - __iterator__22 = __get__(__get__(lst, "__iter__", "no iterator - line 830: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__22 = __get__(__get__(lst, "__iter__", "no iterator - line 847: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__22; __next__22 = __get__(__iterator__22, "next"); while (( __iterator__22.index ) < __iterator__22.length) { @@ -2304,7 +2332,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__23; - __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 837: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 854: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__23; __next__23 = __get__(__iterator__23, "next"); while (( __iterator__23.index ) < __iterator__23.length) { @@ -2429,7 +2457,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 872: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 889: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.NAME = "__Iterator___init__"; @@ -2554,27 +2582,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o, __iterator__24; - __iterator__24 = __get__(__get__(ob, "__iter__", "no iterator - line 927: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__24 = __get__(__get__(ob, "__iter__", "no iterator - line 944: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__24; __next__24 = __get__(__iterator__24, "next"); while (( __iterator__24.index ) < __iterator__24.length) { o = __next__24(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 929: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 929: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 929: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 946: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 946: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 946: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 931: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 931: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 931: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 948: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 948: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 948: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key, __iterator__25; - __iterator__25 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 933: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__25 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 950: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__25; __next__25 = __get__(__iterator__25, "next"); while (( __iterator__25.index ) < __iterator__25.length) { key = __next__25(); - value = __get__(ob, "__getitem__", "line 934: value = ob[ key ]")([key], __NULL_OBJECT__); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 935: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = __get__(ob, "__getitem__", "line 951: value = ob[ key ]")([key], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 952: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2605,15 +2633,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key, __iterator__26; - __iterator__26 = __get__(__get__(keys, "__iter__", "no iterator - line 943: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__26 = __get__(__get__(keys, "__iter__", "no iterator - line 960: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { key = __next__26(); - value = __get__(self["$wrapped"], "__getitem__", "line 944: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 961: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 947: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 964: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2686,7 +2714,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 963: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 980: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2714,12 +2742,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key, __iterator__27; - __iterator__27 = __get__(__get__(other, "__iter__", "no iterator - line 971: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__27 = __get__(__get__(other, "__iter__", "no iterator - line 988: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); while (( __iterator__27.index ) < __iterator__27.length) { key = __next__27(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 972: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 972: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 989: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 989: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); } } @@ -2743,12 +2771,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key, __iterator__28; - __iterator__28 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 976: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__28 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 993: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { key = __next__28(); - __get__(__get__(arr, "append", "missing attribute `append` - line 977: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 994: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2799,7 +2827,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 987: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1004: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.NAME = "__dict_set"; @@ -3086,7 +3114,7 @@ set = function(args, kwargs) { } } } else { - keys.sort(); + __sort_method(keys); var __iter21 = keys; if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { @@ -3145,7 +3173,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1188: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1188: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1205: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1205: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3169,7 +3197,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1212: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1229: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.NAME = "__array___init__"; @@ -3211,7 +3239,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1220: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1237: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3243,7 +3271,7 @@ __array___getitem__ = function(args, kwargs) { dataview = self.dataview; var __left34, __right35; __left34 = "get"; - __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1230: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1230: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1247: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1247: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left34) ) == "number") ? (__left34 + __right35) : __add_op(__left34, __right35)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { @@ -3292,7 +3320,7 @@ __array___setitem__ = function(args, kwargs) { dataview = self.dataview; var __left38, __right39; __left38 = "set"; - __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1249: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1249: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1266: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1266: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left38) ) == "number") ? (__left38 + __right39) : __add_op(__left38, __right39)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { @@ -3377,14 +3405,14 @@ __array_fromlist = function(args, kwargs) { dataview = self.dataview; var __left40, __right41; __left40 = "set"; - __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1274: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1274: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); + __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1291: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1291: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); func_name = ((( typeof(__left40) ) == "number") ? (__left40 + __right41) : __add_op(__left40, __right41)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = __get__(lst, "__getitem__", "line 1279: item = lst[i]")([i], __NULL_OBJECT__); + item = __get__(lst, "__getitem__", "line 1296: item = lst[i]")([i], __NULL_OBJECT__); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3455,7 +3483,7 @@ __array_append = function(args, kwargs) { var __left42, __right43; __left42 = self.length; __right43 = 1; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1307: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1324: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3478,12 +3506,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value, __iterator__33; - __iterator__33 = __get__(__get__(lst, "__iter__", "no iterator - line 1311: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__33 = __get__(__get__(lst, "__iter__", "no iterator - line 1328: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__33; __next__33 = __get__(__iterator__33, "next"); while (( __iterator__33.index ) < __iterator__33.length) { value = __next__33(); - __get__(__get__(self, "append", "missing attribute `append` - line 1312: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1329: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3532,7 +3560,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1324: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1341: return self.to_array()"), "__call__")(); } __array_to_list.NAME = "__array_to_list"; @@ -3554,9 +3582,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1328: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1345: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1329: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1346: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 87051e5..11fcd1e 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -586,6 +586,23 @@ def func(fmt): _setup_str_prototype() + +## note Arrays in javascript by default sort by string order, even if the elements are numbers. +with javascript: + def __sort_method(ob): + if instanceof(ob, Array): + def f(a,b): + if a < b: + return -1 + elif a > b: + return 1 + else: + return 0 + return JS("ob.sort( f )") + + else: + return JS("ob.sort()") + def _setup_array_prototype(): with javascript: diff --git a/regtests/list/sort.py b/regtests/list/sort.py new file mode 100644 index 0000000..a990fb0 --- /dev/null +++ b/regtests/list/sort.py @@ -0,0 +1,16 @@ +"""list sort""" + +def main(): + x = [100, 10, 3,2,1] + x.sort() + TestError( x[0]==1 ) + TestError( x[1]==2 ) + TestError( x[2]==3 ) + TestError( x[3]==10 ) + TestError( x[4]==100 ) + + y = ['C', 'B', 'A'] + y.sort() + TestError( y[0]=='A' ) + TestError( y[1]=='B' ) + TestError( y[2]=='C' ) From 5cc18233fa2a5ebd237e5f76dcbe902d5cb31502 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 9 Jun 2014 23:25:57 -0700 Subject: [PATCH 011/222] support slice set `a[ n:n ] = iterable`. use latest pypy2.3 in benchmarks if its installed to the user's home directory. --- pythonjs/python_to_pythonjs.py | 4 +- pythonjs/pythonjs.js | 296 +++++++++++++++++---------------- pythonjs/runtime/builtins.py | 7 + regtests/list/set_slice.py | 21 +++ regtests/run.py | 30 +++- 5 files changed, 212 insertions(+), 146 deletions(-) create mode 100644 regtests/list/set_slice.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index f6793e0..a629f0c 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1584,6 +1584,9 @@ def _visit_assign_helper(self, node, target): #code = '%s["$wrapped"] = %s' %(self.visit(target.value), self.visit(node.value)) code = '%s[...] = %s' %(self.visit(target.value), self.visit(node.value)) + elif isinstance(target.slice, ast.Slice): + code = '%s.__setslice__(%s, %s)' %(self.visit(target.value), self.visit(target.slice), self.visit(node.value)) + elif self._with_dart or self._with_ll: code = '%s[ %s ] = %s' code = code % (self.visit(target.value), self.visit(target.slice.value), self.visit(node.value)) @@ -1596,7 +1599,6 @@ def _visit_assign_helper(self, node, target): code = '%s[ __ternary_operator__(%s.__uid__, %s) ] = %s' % (self.visit(target.value), s, s, self.visit(node.value)) elif name in self._func_typedefs and self._func_typedefs[name] == 'list': - #code = '%s[...][%s] = %s'%(name, self.visit(target.slice.value), self.visit(node.value)) code = '%s[%s] = %s'%(name, self.visit(target.slice.value), self.visit(node.value)) else: diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 672943a..a047a77 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -1786,6 +1786,24 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "__getslice__", { enumerable:false,value:func,writeable:true,configurable:true }); + var func = function(start, stop, step, items) { + var arr; + arr = [start, (stop - start)]; + var __iter15 = items; + if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } + for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { + var item = __iter15[ __idx15 ]; + arr.push(item); + } + this.splice.apply(this, arr); + return this; + } + + func.NAME = "func"; + func.args_signature = ["start", "stop", "step", "items"]; + func.kwargs_signature = { }; + func.types_signature = { }; + Object.defineProperty(Array.prototype, "__setslice__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(item) { this.push(item); return this; @@ -1797,10 +1815,10 @@ _setup_array_prototype = function(args, kwargs) { func.types_signature = { }; Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); var extend = function(other) { - var __iter15 = other; - if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } - for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { - var obj = __iter15[ __idx15 ]; + var __iter16 = other; + if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } + for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { + var obj = __iter16[ __idx16 ]; this.push(obj); } return this; @@ -1850,10 +1868,10 @@ _setup_array_prototype = function(args, kwargs) { var count = function(obj) { var a; a = 0; - var __iter16 = this; - if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } - for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { - var item = __iter16[ __idx16 ]; + var __iter17 = this; + if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } + for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { + var item = __iter17[ __idx17 ]; if (( item ) === obj) { a += 1; } @@ -1936,10 +1954,10 @@ _setup_array_prototype = function(args, kwargs) { func.types_signature = { }; Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { - var __iter17 = this; - if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } - for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { - var item = __iter17[ __idx17 ]; + var __iter18 = this; + if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } + for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { + var item = __iter18[ __idx18 ]; if (( other.indexOf(item) ) == -1) { return false; } @@ -2145,12 +2163,12 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b, __iterator__19; - __iterator__19 = __get__(__get__(arr, "__iter__", "no iterator - line 801: for b in arr:"), "__call__")([], __NULL_OBJECT__); - var __next__19; - __next__19 = __get__(__iterator__19, "next"); - while (( __iterator__19.index ) < __iterator__19.length) { - b = __next__19(); + var b, __iterator__20; + __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 808: for b in arr:"), "__call__")([], __NULL_OBJECT__); + var __next__20; + __next__20 = __get__(__iterator__20, "next"); + while (( __iterator__20.index ) < __iterator__20.length) { + b = __next__20(); a += b; } return a; @@ -2189,7 +2207,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 821: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 828: return ob.__len__()"), "__call__")(); } } } @@ -2212,7 +2230,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 825: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 832: return obj.next()"), "__call__")(); } next.NAME = "next"; @@ -2234,12 +2252,12 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob, __iterator__20; - __iterator__20 = __get__(__get__(objs, "__iter__", "no iterator - line 830: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__20; - __next__20 = __get__(__iterator__20, "next"); - while (( __iterator__20.index ) < __iterator__20.length) { - ob = __next__20(); + var ob, __iterator__21; + __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 837: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__21; + __next__21 = __get__(__iterator__21, "next"); + while (( __iterator__21.index ) < __iterator__21.length) { + ob = __next__21(); v = __get__(func, "__call__")([ob], __NULL_OBJECT__); arr.push(v); } @@ -2265,12 +2283,12 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob, __iterator__21; - __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 838: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__21; - __next__21 = __get__(__iterator__21, "next"); - while (( __iterator__21.index ) < __iterator__21.length) { - ob = __next__21(); + var ob, __iterator__22; + __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 845: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__22; + __next__22 = __get__(__iterator__22, "next"); + while (( __iterator__22.index ) < __iterator__22.length) { + ob = __next__22(); if (__test_if_true__(__get__(func, "__call__")([ob], __NULL_OBJECT__))) { arr.push(ob); } @@ -2296,12 +2314,12 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value, __iterator__22; - __iterator__22 = __get__(__get__(lst, "__iter__", "no iterator - line 847: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__22; - __next__22 = __get__(__iterator__22, "next"); - while (( __iterator__22.index ) < __iterator__22.length) { - value = __next__22(); + var value, __iterator__23; + __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 854: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__23; + __next__23 = __get__(__iterator__23, "next"); + while (( __iterator__23.index ) < __iterator__23.length) { + value = __next__23(); if (( a ) === null) { a = value; } else { @@ -2331,12 +2349,12 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value, __iterator__23; - __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 854: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__23; - __next__23 = __get__(__iterator__23, "next"); - while (( __iterator__23.index ) < __iterator__23.length) { - value = __next__23(); + var value, __iterator__24; + __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 861: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__24; + __next__24 = __get__(__iterator__24, "next"); + while (( __iterator__24.index ) < __iterator__24.length) { + value = __next__24(); if (( a ) === null) { a = value; } else { @@ -2457,7 +2475,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 889: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 896: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.NAME = "__Iterator___init__"; @@ -2581,28 +2599,28 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o, __iterator__24; - __iterator__24 = __get__(__get__(ob, "__iter__", "no iterator - line 944: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__24; - __next__24 = __get__(__iterator__24, "next"); - while (( __iterator__24.index ) < __iterator__24.length) { - o = __next__24(); + var o, __iterator__25; + __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 951: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__25; + __next__25 = __get__(__iterator__25, "next"); + while (( __iterator__25.index ) < __iterator__25.length) { + o = __next__25(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 946: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 946: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 946: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 953: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 953: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 953: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 948: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 948: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 948: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 955: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 955: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 955: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key, __iterator__25; - __iterator__25 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 950: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__25; - __next__25 = __get__(__iterator__25, "next"); - while (( __iterator__25.index ) < __iterator__25.length) { - key = __next__25(); - value = __get__(ob, "__getitem__", "line 951: value = ob[ key ]")([key], __NULL_OBJECT__); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 952: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + var key, __iterator__26; + __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 957: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__26; + __next__26 = __get__(__iterator__26, "next"); + while (( __iterator__26.index ) < __iterator__26.length) { + key = __next__26(); + value = __get__(ob, "__getitem__", "line 958: value = ob[ key ]")([key], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 959: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2632,16 +2650,16 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key, __iterator__26; - __iterator__26 = __get__(__get__(keys, "__iter__", "no iterator - line 960: for key in keys:"), "__call__")([], __NULL_OBJECT__); - var __next__26; - __next__26 = __get__(__iterator__26, "next"); - while (( __iterator__26.index ) < __iterator__26.length) { - key = __next__26(); - value = __get__(self["$wrapped"], "__getitem__", "line 961: value = self[...][key]")([key], __NULL_OBJECT__); + var key, __iterator__27; + __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 967: for key in keys:"), "__call__")([], __NULL_OBJECT__); + var __next__27; + __next__27 = __get__(__iterator__27, "next"); + while (( __iterator__27.index ) < __iterator__27.length) { + key = __next__27(); + value = __get__(self["$wrapped"], "__getitem__", "line 968: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 964: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 971: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2714,7 +2732,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 980: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 987: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2741,13 +2759,13 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key, __iterator__27; - __iterator__27 = __get__(__get__(other, "__iter__", "no iterator - line 988: for key in other:"), "__call__")([], __NULL_OBJECT__); - var __next__27; - __next__27 = __get__(__iterator__27, "next"); - while (( __iterator__27.index ) < __iterator__27.length) { - key = __next__27(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 989: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 989: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); + var key, __iterator__28; + __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 995: for key in other:"), "__call__")([], __NULL_OBJECT__); + var __next__28; + __next__28 = __get__(__iterator__28, "next"); + while (( __iterator__28.index ) < __iterator__28.length) { + key = __next__28(); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 996: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 996: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); } } @@ -2770,13 +2788,13 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key, __iterator__28; - __iterator__28 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 993: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__28; - __next__28 = __get__(__iterator__28, "next"); - while (( __iterator__28.index ) < __iterator__28.length) { - key = __next__28(); - __get__(__get__(arr, "append", "missing attribute `append` - line 994: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + var key, __iterator__29; + __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1000: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__29; + __next__29 = __get__(__iterator__29, "next"); + while (( __iterator__29.index ) < __iterator__29.length) { + key = __next__29(); + __get__(__get__(arr, "append", "missing attribute `append` - line 1001: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2827,7 +2845,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1004: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1011: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.NAME = "__dict_set"; @@ -2986,10 +3004,10 @@ __dict_values = function(args, kwargs) { var self = __args__['self']; keys = Object.keys(self["$wrapped"]); out = []; - var __iter18 = keys; - if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } - for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { - var key = __iter18[ __idx18 ]; + var __iter19 = keys; + if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } + for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { + var key = __iter19[ __idx19 ]; out.push(self["$wrapped"][((key.__uid__) ? key.__uid__ : key)]); } return out; @@ -3087,10 +3105,10 @@ set = function(args, kwargs) { } fallback = false; if (__test_if_true__(hashtable)) { - var __iter19 = a; - if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } - for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { - var b = __iter19[ __idx19 ]; + var __iter20 = a; + if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } + for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { + var b = __iter20[ __idx20 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[((key.__uid__) ? key.__uid__ : key)] = b; @@ -3105,20 +3123,20 @@ set = function(args, kwargs) { } s = []; if (__test_if_true__(fallback)) { - var __iter20 = a; - if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } - for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { - var item = __iter20[ __idx20 ]; + var __iter21 = a; + if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } + for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { + var item = __iter21[ __idx21 ]; if (( s.indexOf(item) ) == -1) { s.push(item); } } } else { __sort_method(keys); - var __iter21 = keys; - if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } - for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { - var key = __iter21[ __idx21 ]; + var __iter22 = keys; + if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } + for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { + var key = __iter22[ __idx22 ]; s.push(hashtable[((key.__uid__) ? key.__uid__ : key)]); } } @@ -3173,7 +3191,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1205: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1205: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1212: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1212: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3197,7 +3215,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1229: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1236: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.NAME = "__array___init__"; @@ -3239,7 +3257,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1237: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1244: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3271,7 +3289,7 @@ __array___getitem__ = function(args, kwargs) { dataview = self.dataview; var __left34, __right35; __left34 = "get"; - __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1247: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1247: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1254: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1254: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left34) ) == "number") ? (__left34 + __right35) : __add_op(__left34, __right35)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { @@ -3320,7 +3338,7 @@ __array___setitem__ = function(args, kwargs) { dataview = self.dataview; var __left38, __right39; __left38 = "set"; - __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1266: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1266: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1273: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1273: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left38) ) == "number") ? (__left38 + __right39) : __add_op(__left38, __right39)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { @@ -3405,14 +3423,14 @@ __array_fromlist = function(args, kwargs) { dataview = self.dataview; var __left40, __right41; __left40 = "set"; - __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1291: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1291: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); + __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1298: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1298: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); func_name = ((( typeof(__left40) ) == "number") ? (__left40 + __right41) : __add_op(__left40, __right41)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = __get__(lst, "__getitem__", "line 1296: item = lst[i]")([i], __NULL_OBJECT__); + item = __get__(lst, "__getitem__", "line 1303: item = lst[i]")([i], __NULL_OBJECT__); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3483,7 +3501,7 @@ __array_append = function(args, kwargs) { var __left42, __right43; __left42 = self.length; __right43 = 1; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1324: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1331: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3505,13 +3523,13 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value, __iterator__33; - __iterator__33 = __get__(__get__(lst, "__iter__", "no iterator - line 1328: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__33; - __next__33 = __get__(__iterator__33, "next"); - while (( __iterator__33.index ) < __iterator__33.length) { - value = __next__33(); - __get__(__get__(self, "append", "missing attribute `append` - line 1329: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + var value, __iterator__34; + __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1335: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__34; + __next__34 = __get__(__iterator__34, "next"); + while (( __iterator__34.index ) < __iterator__34.length) { + value = __next__34(); + __get__(__get__(self, "append", "missing attribute `append` - line 1336: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3560,7 +3578,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1341: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1348: return self.to_array()"), "__call__")(); } __array_to_list.NAME = "__array_to_list"; @@ -3582,9 +3600,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1345: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1352: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1346: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1353: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3743,17 +3761,17 @@ json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (f __get_other_workers_with_shared_arg = function(worker, ob) { var a, other, args; a = []; - var __iter22 = threading.workers; - if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } - for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { - var b = __iter22[ __idx22 ]; + var __iter23 = threading.workers; + if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } + for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { + var b = __iter23[ __idx23 ]; other = b[(("worker".__uid__) ? "worker".__uid__ : "worker")]; args = b[(("args".__uid__) ? "args".__uid__ : "args")]; if (( other ) !== worker) { - var __iter23 = args; - if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } - for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { - var arg = __iter23[ __idx23 ]; + var __iter24 = args; + if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } + for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { + var arg = __iter24[ __idx24 ]; if (( arg ) === ob) { if (! (__contains__(a, other))) { a.append(other); @@ -3789,10 +3807,10 @@ __start_new_thread = function(f, args) { if (( event.data.type ) == "append") { a = args[((event.data.argindex.__uid__) ? event.data.argindex.__uid__ : event.data.argindex)]; a.push(event.data.value); - var __iter24 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } - for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { - var other = __iter24[ __idx24 ]; + var __iter25 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } + for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { + var other = __iter25[ __idx25 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); } } else { @@ -3804,10 +3822,10 @@ __start_new_thread = function(f, args) { } else { a[((event.data.index.__uid__) ? event.data.index.__uid__ : event.data.index)] = value; } - var __iter25 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } - for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { - var other = __iter25[ __idx25 ]; + var __iter26 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } + for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { + var other = __iter26[ __idx26 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); } } else { @@ -3826,10 +3844,10 @@ __start_new_thread = function(f, args) { jsargs = []; var i; i = 0; - var __iter26 = args; - if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } - for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { - var arg = __iter26[ __idx26 ]; + var __iter27 = args; + if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } + for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { + var arg = __iter27[ __idx27 ]; if (__test_if_true__(arg.jsify)) { jsargs.append(arg.jsify()); } else { diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 11fcd1e..6a3b47c 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -659,6 +659,13 @@ def func(start, stop, step): stop = this.length + stop return this.slice(start, stop) + @Array.prototype.__setslice__ + def func(start, stop, step, items): + arr = [start, stop-start] + for item in items: arr.push( item ) + this.splice.apply(this, arr ) + return this + @Array.prototype.append def func(item): this.push( item ) diff --git a/regtests/list/set_slice.py b/regtests/list/set_slice.py new file mode 100644 index 0000000..6dff724 --- /dev/null +++ b/regtests/list/set_slice.py @@ -0,0 +1,21 @@ +"""list slice set""" + + +def main(): + a = list(range(10)) + a[ 2:4 ] = 'XXXY' + + TestError( a[0]==0 ) + TestError( a[1]==1 ) + + TestError( a[2]=='X' ) + TestError( a[3]=='X' ) + TestError( a[4]=='X' ) + TestError( a[5]=='Y' ) + + TestError( a[6]==4 ) + TestError( a[7]==5 ) + TestError( a[8]==6 ) + TestError( a[9]==7 ) + TestError( a[10]==8 ) + TestError( a[11]==9 ) diff --git a/regtests/run.py b/regtests/run.py index 7e86b78..ecd32cb 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -113,9 +113,31 @@ def runnable(command): except OSError: return False -## rhino has problems: like maximum callstack errors simply freeze up rhino -pypy_runnable = runnable( 'pypy --help' ) +def run_pypy_test_on(filename): + """PyPy""" + write("%s.py" % tmpname, patch_python(filename, python='PYPY')) + return run_command("%s %s.py %s" % (pypy_exe, tmpname, display_errors)) + + +pypy_runnable = False +pypy_exe = None +if os.path.isfile( os.path.expanduser('~/pypy-2.3.1-linux64/bin/pypy') ): + pypy_runnable = True + pypy_exe = os.path.expanduser('~/pypy-2.3.1-linux64/bin/pypy') + run_pypy_test_on.__doc__ = 'PyPy 2.3.1' +elif os.path.isfile( os.path.expanduser('~/pypy-2.2-linux64/bin/pypy') ): + pypy_runnable = True + pypy_exe = os.path.expanduser('~/pypy-2.2-linux64/bin/pypy') + run_pypy_test_on.__doc__ = 'PyPy 2.2' +elif runnable( 'pypy --help' ): + pypy_runnable = True + pypy_exe = 'pypy' + + + +## rhino is not run by default because it simply freezes up on maximum callstack errors rhino_runnable = '--rhino' in sys.argv and runnable("rhino -e 'quit()'") + node_runnable = runnable("node --help") ## sudo npm install nodewebkit -g @@ -351,10 +373,6 @@ def run_python3_test_on(filename): write("%s.py" % tmpname, patch_python(filename, python='PYTHON3')) return run_command("python3 %s.py %s" % (tmpname, display_errors)) -def run_pypy_test_on(filename): - """PyPy""" - write("%s.py" % tmpname, patch_python(filename, python='PYPY')) - return run_command("pypy %s.py %s" % (tmpname, display_errors)) def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False, luajs=False, multioutput=False): From e03c2c5bb5a0873ea9715c2e8b5b2e826816f4e3 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 10 Jun 2014 01:43:57 -0700 Subject: [PATCH 012/222] fixed list reverse slice `list[n::-1]` --- pythonjs/pythonjs.js | 109 ++++++++++++++++++--------------- pythonjs/runtime/builtins.py | 43 ++++++++++--- regtests/list/slice_reverse.py | 19 ++++++ 3 files changed, 114 insertions(+), 57 deletions(-) create mode 100644 regtests/list/slice_reverse.py diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index a047a77..4af8e96 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -1761,24 +1761,37 @@ _setup_array_prototype = function(args, kwargs) { func.types_signature = { }; Object.defineProperty(Array.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(start, stop, step) { - var i, arr; + var i, reverse, arr; + reverse = ( step ) < 0; + if (( typeof(step) ) == "number") { + if (__test_if_true__(reverse)) { + step = Math.abs(step); + } + } else { + step = 1; + } + arr = []; + i = 0; + while (( i ) < this.length) { + arr.push(this[((i.__uid__) ? i.__uid__ : i)]); + i += step; + } if (__test_if_true__(( start ) === undefined && ( stop ) === undefined)) { - arr = []; - i = 0; - while (( i ) < this.length) { - arr.push(this[((i.__uid__) ? i.__uid__ : i)]); - i += step; + if (__test_if_true__(reverse)) { + arr.reverse(); } - return arr; } else { - if (( stop ) < 0) { + if (__test_if_true__(reverse)) { var __left22, __right23; - __left22 = this.length; - __right23 = stop; - stop = ((( typeof(__left22) ) == "number") ? (__left22 + __right23) : __add_op(__left22, __right23)); + __left22 = start; + __right23 = 1; + arr = arr.slice(stop, ((( typeof(__left22) ) == "number") ? (__left22 + __right23) : __add_op(__left22, __right23))); + arr.reverse(); + } else { + arr = arr.slice(start, stop); } - return this.slice(start, stop); } + return arr; } func.NAME = "func"; @@ -2164,7 +2177,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b, __iterator__20; - __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 808: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 833: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__20; __next__20 = __get__(__iterator__20, "next"); while (( __iterator__20.index ) < __iterator__20.length) { @@ -2207,7 +2220,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 828: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 853: return ob.__len__()"), "__call__")(); } } } @@ -2230,7 +2243,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 832: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 857: return obj.next()"), "__call__")(); } next.NAME = "next"; @@ -2253,7 +2266,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__21; - __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 837: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 862: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__21; __next__21 = __get__(__iterator__21, "next"); while (( __iterator__21.index ) < __iterator__21.length) { @@ -2284,7 +2297,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__22; - __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 845: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 870: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__22; __next__22 = __get__(__iterator__22, "next"); while (( __iterator__22.index ) < __iterator__22.length) { @@ -2315,7 +2328,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__23; - __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 854: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 879: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__23; __next__23 = __get__(__iterator__23, "next"); while (( __iterator__23.index ) < __iterator__23.length) { @@ -2350,7 +2363,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__24; - __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 861: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 886: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__24; __next__24 = __get__(__iterator__24, "next"); while (( __iterator__24.index ) < __iterator__24.length) { @@ -2475,7 +2488,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 896: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 921: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.NAME = "__Iterator___init__"; @@ -2600,27 +2613,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o, __iterator__25; - __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 951: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 976: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__25; __next__25 = __get__(__iterator__25, "next"); while (( __iterator__25.index ) < __iterator__25.length) { o = __next__25(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 953: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 953: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 953: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 978: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 978: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 978: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 955: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 955: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 955: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 980: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 980: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 980: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key, __iterator__26; - __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 957: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 982: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { key = __next__26(); - value = __get__(ob, "__getitem__", "line 958: value = ob[ key ]")([key], __NULL_OBJECT__); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 959: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = __get__(ob, "__getitem__", "line 983: value = ob[ key ]")([key], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 984: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2651,15 +2664,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key, __iterator__27; - __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 967: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 992: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); while (( __iterator__27.index ) < __iterator__27.length) { key = __next__27(); - value = __get__(self["$wrapped"], "__getitem__", "line 968: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 993: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 971: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 996: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2732,7 +2745,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 987: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1012: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2760,12 +2773,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key, __iterator__28; - __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 995: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 1020: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { key = __next__28(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 996: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 996: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1021: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 1021: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); } } @@ -2789,12 +2802,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key, __iterator__29; - __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1000: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1025: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__29; __next__29 = __get__(__iterator__29, "next"); while (( __iterator__29.index ) < __iterator__29.length) { key = __next__29(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1001: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1026: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2845,7 +2858,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1011: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1036: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.NAME = "__dict_set"; @@ -3191,7 +3204,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1212: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1212: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1237: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1237: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3215,7 +3228,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1236: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1261: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.NAME = "__array___init__"; @@ -3257,7 +3270,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1244: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1269: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3289,7 +3302,7 @@ __array___getitem__ = function(args, kwargs) { dataview = self.dataview; var __left34, __right35; __left34 = "get"; - __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1254: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1254: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1279: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1279: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left34) ) == "number") ? (__left34 + __right35) : __add_op(__left34, __right35)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { @@ -3338,7 +3351,7 @@ __array___setitem__ = function(args, kwargs) { dataview = self.dataview; var __left38, __right39; __left38 = "set"; - __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1273: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1273: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1298: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1298: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left38) ) == "number") ? (__left38 + __right39) : __add_op(__left38, __right39)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { @@ -3423,14 +3436,14 @@ __array_fromlist = function(args, kwargs) { dataview = self.dataview; var __left40, __right41; __left40 = "set"; - __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1298: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1298: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); + __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1323: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1323: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); func_name = ((( typeof(__left40) ) == "number") ? (__left40 + __right41) : __add_op(__left40, __right41)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = __get__(lst, "__getitem__", "line 1303: item = lst[i]")([i], __NULL_OBJECT__); + item = __get__(lst, "__getitem__", "line 1328: item = lst[i]")([i], __NULL_OBJECT__); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3501,7 +3514,7 @@ __array_append = function(args, kwargs) { var __left42, __right43; __left42 = self.length; __right43 = 1; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1331: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1356: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3524,12 +3537,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value, __iterator__34; - __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1335: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1360: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__34; __next__34 = __get__(__iterator__34, "next"); while (( __iterator__34.index ) < __iterator__34.length) { value = __next__34(); - __get__(__get__(self, "append", "missing attribute `append` - line 1336: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1361: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3578,7 +3591,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1348: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1373: return self.to_array()"), "__call__")(); } __array_to_list.NAME = "__array_to_list"; @@ -3600,9 +3613,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1352: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1377: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1353: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1378: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 6a3b47c..b1953ee 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -647,17 +647,42 @@ def func(): @Array.prototype.__getslice__ def func(start, stop, step): + #if start is undefined and stop is undefined: + # arr = [] + # i = 0 + # while i < this.length: + # arr.push( this[i] ) + # i += step + # return arr + #else: + # if stop < 0: + # stop = this.length + stop + # return this.slice(start, stop) + + reverse = step < 0 ## in javascript `null<0` and `undefined<0` are false + if typeof(step)=='number': + if reverse: step = Math.abs(step) + else: + step = 1 + + arr = [] + i = 0 + while i < this.length: + arr.push( this[i] ) + i += step + if start is undefined and stop is undefined: - arr = [] - i = 0 - while i < this.length: - arr.push( this[i] ) - i += step - return arr + if reverse: arr.reverse() + elif reverse: + arr = arr.slice(stop, start+1) + arr.reverse() else: - if stop < 0: - stop = this.length + stop - return this.slice(start, stop) + #if stop < 0: ## mozilla spec says negative indices are supported + # stop = arr.length + stop + arr = arr.slice(start, stop) + + return arr + @Array.prototype.__setslice__ def func(start, stop, step, items): diff --git a/regtests/list/slice_reverse.py b/regtests/list/slice_reverse.py new file mode 100644 index 0000000..fa3621f --- /dev/null +++ b/regtests/list/slice_reverse.py @@ -0,0 +1,19 @@ +"""list reverse slice""" + + +def main(): + a = range(10) + b = a[ 4::-1 ] + #print(b) + TestError( b[0]==4 ) + TestError( b[1]==3 ) + TestError( b[2]==2 ) + TestError( b[3]==1 ) + TestError( b[4]==0 ) + + c = range(20) + d = c[ 2::-1 ] + #print(d) + TestError( d[0]==2 ) + TestError( d[1]==1 ) + TestError( d[2]==0 ) From 5dbc066f232625666b2c9e3a08024af82fc7d9eb Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 10 Jun 2014 02:00:51 -0700 Subject: [PATCH 013/222] fixed `list.pop(n)` --- pythonjs/pythonjs.js | 82 +++++++++++++++++++----------------- pythonjs/runtime/builtins.py | 7 ++- regtests/list/pop.py | 9 ++++ 3 files changed, 58 insertions(+), 40 deletions(-) create mode 100644 regtests/list/pop.py diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 4af8e96..fccbabc 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -845,7 +845,11 @@ __jsdict_pop = function(ob, key, _kwargs_) { if (_kwargs_ === undefined || _kwargs_._default === undefined) {var _default = null} else {var _default=_kwargs_._default}; if (__test_if_true__(ob instanceof Array)) { if (__test_if_true__(ob.length)) { - return ob.pop(key); + if (( key ) === undefined) { + return ob.pop(); + } else { + return ob.splice(ob.indexOf(key), 1)[0]; + } } else { throw new IndexError(key); } @@ -1214,8 +1218,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 401: while i < bases.length:")) { - if (__test_if_true__(issubclass([__get__(bases, "__getitem__", "line 402: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 406: while i < bases.length:")) { + if (__test_if_true__(issubclass([__get__(bases, "__getitem__", "line 407: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2177,7 +2181,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b, __iterator__20; - __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 833: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 838: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__20; __next__20 = __get__(__iterator__20, "next"); while (( __iterator__20.index ) < __iterator__20.length) { @@ -2220,7 +2224,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 853: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 858: return ob.__len__()"), "__call__")(); } } } @@ -2243,7 +2247,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 857: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 862: return obj.next()"), "__call__")(); } next.NAME = "next"; @@ -2266,7 +2270,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__21; - __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 862: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 867: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__21; __next__21 = __get__(__iterator__21, "next"); while (( __iterator__21.index ) < __iterator__21.length) { @@ -2297,7 +2301,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__22; - __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 870: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 875: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__22; __next__22 = __get__(__iterator__22, "next"); while (( __iterator__22.index ) < __iterator__22.length) { @@ -2328,7 +2332,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__23; - __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 879: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 884: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__23; __next__23 = __get__(__iterator__23, "next"); while (( __iterator__23.index ) < __iterator__23.length) { @@ -2363,7 +2367,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__24; - __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 886: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 891: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__24; __next__24 = __get__(__iterator__24, "next"); while (( __iterator__24.index ) < __iterator__24.length) { @@ -2488,7 +2492,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 921: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 926: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.NAME = "__Iterator___init__"; @@ -2613,27 +2617,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o, __iterator__25; - __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 976: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 981: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__25; __next__25 = __get__(__iterator__25, "next"); while (( __iterator__25.index ) < __iterator__25.length) { o = __next__25(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 978: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 978: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 978: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 983: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 983: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 983: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 980: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 980: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 980: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 985: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 985: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 985: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key, __iterator__26; - __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 982: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 987: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { key = __next__26(); - value = __get__(ob, "__getitem__", "line 983: value = ob[ key ]")([key], __NULL_OBJECT__); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 984: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = __get__(ob, "__getitem__", "line 988: value = ob[ key ]")([key], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 989: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2664,15 +2668,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key, __iterator__27; - __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 992: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 997: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); while (( __iterator__27.index ) < __iterator__27.length) { key = __next__27(); - value = __get__(self["$wrapped"], "__getitem__", "line 993: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 998: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 996: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1001: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2745,7 +2749,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1012: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1017: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2773,12 +2777,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key, __iterator__28; - __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 1020: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 1025: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { key = __next__28(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1021: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 1021: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1026: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 1026: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); } } @@ -2802,12 +2806,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key, __iterator__29; - __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1025: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1030: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__29; __next__29 = __get__(__iterator__29, "next"); while (( __iterator__29.index ) < __iterator__29.length) { key = __next__29(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1026: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1031: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2858,7 +2862,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1036: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1041: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.NAME = "__dict_set"; @@ -3204,7 +3208,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1237: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1237: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1242: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1242: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3228,7 +3232,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1261: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1266: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.NAME = "__array___init__"; @@ -3270,7 +3274,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1269: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1274: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3302,7 +3306,7 @@ __array___getitem__ = function(args, kwargs) { dataview = self.dataview; var __left34, __right35; __left34 = "get"; - __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1279: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1279: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1284: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1284: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left34) ) == "number") ? (__left34 + __right35) : __add_op(__left34, __right35)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { @@ -3351,7 +3355,7 @@ __array___setitem__ = function(args, kwargs) { dataview = self.dataview; var __left38, __right39; __left38 = "set"; - __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1298: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1298: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1303: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1303: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left38) ) == "number") ? (__left38 + __right39) : __add_op(__left38, __right39)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { @@ -3436,14 +3440,14 @@ __array_fromlist = function(args, kwargs) { dataview = self.dataview; var __left40, __right41; __left40 = "set"; - __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1323: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1323: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); + __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1328: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1328: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); func_name = ((( typeof(__left40) ) == "number") ? (__left40 + __right41) : __add_op(__left40, __right41)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = __get__(lst, "__getitem__", "line 1328: item = lst[i]")([i], __NULL_OBJECT__); + item = __get__(lst, "__getitem__", "line 1333: item = lst[i]")([i], __NULL_OBJECT__); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3514,7 +3518,7 @@ __array_append = function(args, kwargs) { var __left42, __right43; __left42 = self.length; __right43 = 1; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1356: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1361: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3537,12 +3541,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value, __iterator__34; - __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1360: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1365: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__34; __next__34 = __get__(__iterator__34, "next"); while (( __iterator__34.index ) < __iterator__34.length) { value = __next__34(); - __get__(__get__(self, "append", "missing attribute `append` - line 1361: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1366: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3591,7 +3595,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1373: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1378: return self.to_array()"), "__call__")(); } __array_to_list.NAME = "__array_to_list"; @@ -3613,9 +3617,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1377: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1382: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1378: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1383: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index b1953ee..783bc37 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -199,9 +199,14 @@ def __jsdict_items(ob): def __jsdict_pop(ob, key, _default=None): if instanceof(ob, Array): if ob.length: - return JS("ob.pop(key)") + ## note: javascript array.pop only pops the end of an array + if key is undefined: + return inline("ob.pop()") + else: + return ob.splice( ob.indexOf(key), 1 )[0] else: raise IndexError(key) + elif instanceof(ob, Object): if JS("key in ob"): v = ob[key] diff --git a/regtests/list/pop.py b/regtests/list/pop.py new file mode 100644 index 0000000..82f8207 --- /dev/null +++ b/regtests/list/pop.py @@ -0,0 +1,9 @@ +"""list.pop(n)""" + + +def main(): + a = list(range(10)) + b = a.pop() + TestError( b==9 ) + c = a.pop(0) + TestError( c==0 ) From cbbdeb73298450e273d5e19b7e122ae8f3498881 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 10 Jun 2014 02:13:24 -0700 Subject: [PATCH 014/222] fixed `list.pop(index)` --- pythonjs/pythonjs.js | 2 +- pythonjs/runtime/builtins.py | 2 +- regtests/list/pop.py | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index fccbabc..2baf9fb 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -848,7 +848,7 @@ __jsdict_pop = function(ob, key, _kwargs_) { if (( key ) === undefined) { return ob.pop(); } else { - return ob.splice(ob.indexOf(key), 1)[0]; + return ob.splice(key, 1)[0]; } } else { throw new IndexError(key); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 783bc37..3a39821 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -203,7 +203,7 @@ def __jsdict_pop(ob, key, _default=None): if key is undefined: return inline("ob.pop()") else: - return ob.splice( ob.indexOf(key), 1 )[0] + return ob.splice( key, 1 )[0] else: raise IndexError(key) diff --git a/regtests/list/pop.py b/regtests/list/pop.py index 82f8207..c9e1558 100644 --- a/regtests/list/pop.py +++ b/regtests/list/pop.py @@ -7,3 +7,7 @@ def main(): TestError( b==9 ) c = a.pop(0) TestError( c==0 ) + + d = ['A', 'B'] + TestError( d.pop(1)=='B' ) + TestError( len(d)==1 ) \ No newline at end of file From bda74eebdffc24203dd2d41537e99193c33c3a75 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 10 Jun 2014 02:34:16 -0700 Subject: [PATCH 015/222] support while/else syntax. --- pythonjs/python_to_pythonjs.py | 14 +++++++++++--- regtests/loop/while_else.py | 25 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 regtests/loop/while_else.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index a629f0c..e60ca0a 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2901,6 +2901,7 @@ def visit_Continue(self, node): return '' def visit_Break(self, node): + writer.write('__break__ = True') writer.write('break') def visit_For(self, node): @@ -3131,13 +3132,10 @@ def visit_For(self, node): _call_ids = 0 def visit_While(self, node): - log('while loop:') if self._cache_while_body_calls: ## TODO add option for this for n in node.body: calls = collect_calls(n) for c in calls: - log('--call: %s' %c) - log('------: %s' %c.func) if isinstance(c.func, ast.Name): ## these are constant for sure i = self._call_ids writer.write( '__call__%s = __get__(%s,"__call__")' %(i,self.visit(c.func)) ) @@ -3145,6 +3143,10 @@ def visit_While(self, node): c.constant = True self._call_ids += 1 + if node.orelse: + writer.write('var(__break__)') + writer.write('__break__ = False') + self._in_while_test = True writer.write('while %s:' % self.visit(node.test)) self._in_while_test = False @@ -3152,6 +3154,12 @@ def visit_While(self, node): map(self.visit, node.body) writer.pull() + if node.orelse: + writer.write('if __break__ == False:') + writer.push() + map(self.visit, node.orelse) + writer.pull() + def visit_With(self, node): global writer diff --git a/regtests/loop/while_else.py b/regtests/loop/while_else.py new file mode 100644 index 0000000..8cb012f --- /dev/null +++ b/regtests/loop/while_else.py @@ -0,0 +1,25 @@ +''' +while else loop +''' + +def main(): + + a = False + i = 0 + while i < 10: + i += 1 + else: + a = True + + TestError( a==True ) + + b = False + i = 0 + while i < 10: + i += 1 + break + else: + b = True + + TestError( b==False ) + From 2277c25ac06d9fce4f0a1426643fa3c6f0180a4d Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 10 Jun 2014 07:41:58 -0700 Subject: [PATCH 016/222] fixed `list[ :n ] = iterable` --- pythonjs/pythonjs.js | 80 ++++++++++++++++++++---------------- pythonjs/runtime/builtins.py | 15 +------ regtests/list/insert.py | 12 ++++++ regtests/list/set_slice.py | 9 ++++ regtests/run.py | 15 ++++++- 5 files changed, 80 insertions(+), 51 deletions(-) create mode 100644 regtests/list/insert.py diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 2baf9fb..237864b 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -961,6 +961,7 @@ __sprintf = function(fmt, args) { var txt = __iter7[ __idx7 ]; arr.append(txt); if (( i ) >= args.length) { + __break__ = true; break; } item = args[((i.__uid__) ? i.__uid__ : i)]; @@ -1805,6 +1806,12 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "__getslice__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(start, stop, step, items) { var arr; + if (( start ) === undefined) { + start = 0; + } + if (( stop ) === undefined) { + stop = this.length; + } arr = [start, (stop - start)]; var __iter15 = items; if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } @@ -2181,7 +2188,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b, __iterator__20; - __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 838: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 827: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__20; __next__20 = __get__(__iterator__20, "next"); while (( __iterator__20.index ) < __iterator__20.length) { @@ -2224,7 +2231,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 858: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 847: return ob.__len__()"), "__call__")(); } } } @@ -2247,7 +2254,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 862: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 851: return obj.next()"), "__call__")(); } next.NAME = "next"; @@ -2270,7 +2277,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__21; - __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 867: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 856: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__21; __next__21 = __get__(__iterator__21, "next"); while (( __iterator__21.index ) < __iterator__21.length) { @@ -2301,7 +2308,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__22; - __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 875: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 864: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__22; __next__22 = __get__(__iterator__22, "next"); while (( __iterator__22.index ) < __iterator__22.length) { @@ -2332,7 +2339,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__23; - __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 884: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 873: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__23; __next__23 = __get__(__iterator__23, "next"); while (( __iterator__23.index ) < __iterator__23.length) { @@ -2367,7 +2374,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__24; - __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 891: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 880: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__24; __next__24 = __get__(__iterator__24, "next"); while (( __iterator__24.index ) < __iterator__24.length) { @@ -2492,7 +2499,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 926: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 915: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.NAME = "__Iterator___init__"; @@ -2617,27 +2624,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o, __iterator__25; - __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 981: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 970: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__25; __next__25 = __get__(__iterator__25, "next"); while (( __iterator__25.index ) < __iterator__25.length) { o = __next__25(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 983: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 983: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 983: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 972: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 972: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 972: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 985: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 985: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 985: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 974: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 974: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 974: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key, __iterator__26; - __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 987: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 976: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { key = __next__26(); - value = __get__(ob, "__getitem__", "line 988: value = ob[ key ]")([key], __NULL_OBJECT__); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 989: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = __get__(ob, "__getitem__", "line 977: value = ob[ key ]")([key], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 978: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2668,15 +2675,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key, __iterator__27; - __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 997: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 986: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); while (( __iterator__27.index ) < __iterator__27.length) { key = __next__27(); - value = __get__(self["$wrapped"], "__getitem__", "line 998: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 987: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1001: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 990: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2749,7 +2756,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1017: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1006: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2777,12 +2784,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key, __iterator__28; - __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 1025: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 1014: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { key = __next__28(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1026: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 1026: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1015: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 1015: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); } } @@ -2806,12 +2813,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key, __iterator__29; - __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1030: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1019: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__29; __next__29 = __get__(__iterator__29, "next"); while (( __iterator__29.index ) < __iterator__29.length) { key = __next__29(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1031: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1020: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2862,7 +2869,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1041: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1030: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.NAME = "__dict_set"; @@ -3132,6 +3139,7 @@ set = function(args, kwargs) { keys.push(key); } else { fallback = true; + __break__ = true; break; } } @@ -3208,7 +3216,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1242: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1242: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1231: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1231: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3232,7 +3240,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1266: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1255: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.NAME = "__array___init__"; @@ -3274,7 +3282,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1274: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1263: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3306,7 +3314,7 @@ __array___getitem__ = function(args, kwargs) { dataview = self.dataview; var __left34, __right35; __left34 = "get"; - __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1284: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1284: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1273: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1273: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left34) ) == "number") ? (__left34 + __right35) : __add_op(__left34, __right35)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { @@ -3355,7 +3363,7 @@ __array___setitem__ = function(args, kwargs) { dataview = self.dataview; var __left38, __right39; __left38 = "set"; - __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1303: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1303: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); + __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1292: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1292: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); func_name = ((( typeof(__left38) ) == "number") ? (__left38 + __right39) : __add_op(__left38, __right39)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { @@ -3440,14 +3448,14 @@ __array_fromlist = function(args, kwargs) { dataview = self.dataview; var __left40, __right41; __left40 = "set"; - __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1328: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1328: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); + __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1317: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1317: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); func_name = ((( typeof(__left40) ) == "number") ? (__left40 + __right41) : __add_op(__left40, __right41)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = __get__(lst, "__getitem__", "line 1333: item = lst[i]")([i], __NULL_OBJECT__); + item = __get__(lst, "__getitem__", "line 1322: item = lst[i]")([i], __NULL_OBJECT__); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3518,7 +3526,7 @@ __array_append = function(args, kwargs) { var __left42, __right43; __left42 = self.length; __right43 = 1; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1361: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1350: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3541,12 +3549,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value, __iterator__34; - __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1365: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1354: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__34; __next__34 = __get__(__iterator__34, "next"); while (( __iterator__34.index ) < __iterator__34.length) { value = __next__34(); - __get__(__get__(self, "append", "missing attribute `append` - line 1366: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1355: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3595,7 +3603,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1378: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1367: return self.to_array()"), "__call__")(); } __array_to_list.NAME = "__array_to_list"; @@ -3617,9 +3625,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1382: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1371: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1383: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1372: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 3a39821..d23daa1 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -652,18 +652,6 @@ def func(): @Array.prototype.__getslice__ def func(start, stop, step): - #if start is undefined and stop is undefined: - # arr = [] - # i = 0 - # while i < this.length: - # arr.push( this[i] ) - # i += step - # return arr - #else: - # if stop < 0: - # stop = this.length + stop - # return this.slice(start, stop) - reverse = step < 0 ## in javascript `null<0` and `undefined<0` are false if typeof(step)=='number': if reverse: step = Math.abs(step) @@ -688,9 +676,10 @@ def func(start, stop, step): return arr - @Array.prototype.__setslice__ def func(start, stop, step, items): + if start is undefined: start = 0 + if stop is undefined: stop = this.length arr = [start, stop-start] for item in items: arr.push( item ) this.splice.apply(this, arr ) diff --git a/regtests/list/insert.py b/regtests/list/insert.py new file mode 100644 index 0000000..8596ce4 --- /dev/null +++ b/regtests/list/insert.py @@ -0,0 +1,12 @@ +"""insert""" +def main(): + a = [1,2,3,4] + TestError( len(a)==4 ) + + a.insert(0, 'hi') + TestError( len(a)==5 ) + TestError( a[0]=='hi' ) + + a.insert(1, a.pop(0)) + TestError( a[0]==1 ) + TestError( a[1]=='hi' ) diff --git a/regtests/list/set_slice.py b/regtests/list/set_slice.py index 6dff724..44a6c26 100644 --- a/regtests/list/set_slice.py +++ b/regtests/list/set_slice.py @@ -19,3 +19,12 @@ def main(): TestError( a[9]==7 ) TestError( a[10]==8 ) TestError( a[11]==9 ) + + b = list(range(3)) + c = b [ :2 ] + TestError( c[0]==0 ) + TestError( c[1]==1 ) + + b[ :2 ] = 'ABC' + TestError( len(b)==4 ) + TestError( b[0]=='A' ) \ No newline at end of file diff --git a/regtests/run.py b/regtests/run.py index ecd32cb..d341ca8 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -211,7 +211,14 @@ def run_command(command, returns_stdout_stderr=False, nodewebkit_workaround=Fals if os.path.isfile("%s.errors" % tmpname): os.unlink("%s.errors" % tmpname) f = os.popen(command + " 2>%s.errors" % tmpname, 'r') - stdout = f.read().strip() + + killed = False + try: + stdout = f.read().strip() + except KeyboardInterrupt: + stdout = f.read().strip() + killed = True + f.close() @@ -234,7 +241,11 @@ def run_command(command, returns_stdout_stderr=False, nodewebkit_workaround=Fals if show_details: print('TEST ERROR!') print(stderr) - #sys.exit() + + if killed: + print(stdout) + sys.exit() + if returns_stdout_stderr: return stdout, stderr From 32409d0659ac41ec40d4763ea320511323437f7c Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 10 Jun 2014 08:40:26 -0700 Subject: [PATCH 017/222] dart backend: fixed `range(x,y)` --- pythonjs/pythonjs_to_dart.py | 11 ++++++++--- pythonjs/runtime/dart_builtins.py | 11 +++++++++++ regtests/list/range.py | 12 ++++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 regtests/list/range.py diff --git a/pythonjs/pythonjs_to_dart.py b/pythonjs/pythonjs_to_dart.py index 9f7443b..cfd9aef 100644 --- a/pythonjs/pythonjs_to_dart.py +++ b/pythonjs/pythonjs_to_dart.py @@ -431,15 +431,20 @@ def _visit_call_helper(self, node): else: args = '' + if isinstance(node.func, ast.Name) and node.func.id == 'range' and len(node.args)==2: + func = '__range2' + else: + func = self.visit(node.func) + if node.keywords: kwargs = ','.join( ['%s:%s'%(x.arg, self.visit(x.value)) for x in node.keywords] ) if args: - return '%s(%s, %s)' %( self.visit(node.func), ','.join(args), kwargs ) + return '%s(%s, %s)' %( func, ','.join(args), kwargs ) else: - return '%s( %s )' %( self.visit(node.func), kwargs ) + return '%s( %s )' %( func, kwargs ) else: - return '%s(%s)' % (self.visit(node.func), args) + return '%s(%s)' % (func, args) def _visit_call_helper_list(self, node): name = self.visit(node.func) diff --git a/pythonjs/runtime/dart_builtins.py b/pythonjs/runtime/dart_builtins.py index 55ee89a..78746d5 100644 --- a/pythonjs/runtime/dart_builtins.py +++ b/pythonjs/runtime/dart_builtins.py @@ -79,6 +79,9 @@ def append(self, item): def index(self, obj): return self[...].indexOf(obj) + def pop(self, n): + return self[...].removeAt( n ) + def tuple(a): return list(a) @@ -134,6 +137,14 @@ def range(n): i += 1 return r +def __range2(start, stop): + r = [] + i = start + while i < stop: + r.append( i ) + i += 1 + return r + def len(a): return a.length diff --git a/regtests/list/range.py b/regtests/list/range.py new file mode 100644 index 0000000..a553042 --- /dev/null +++ b/regtests/list/range.py @@ -0,0 +1,12 @@ +"""range""" +def main(): + a = range(10) + TestError( len(a)==10 ) + TestError( a[0] == 0 ) + TestError( a[9] == 9 ) + + b = range(1,10) + TestError( len(b)==9 ) + TestError( b[0] == 1 ) + TestError( b[8] == 9 ) + From a020f44e5bbb5003863392e86a39075ea74b9575 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 10 Jun 2014 09:12:11 -0700 Subject: [PATCH 018/222] dart backend: added list.insert new benchmark fannkuch.py --- pythonjs/runtime/dart_builtins.py | 4 ++ regtests/bench/fannkuch.py | 72 +++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 regtests/bench/fannkuch.py diff --git a/pythonjs/runtime/dart_builtins.py b/pythonjs/runtime/dart_builtins.py index 78746d5..92f3dbc 100644 --- a/pythonjs/runtime/dart_builtins.py +++ b/pythonjs/runtime/dart_builtins.py @@ -82,6 +82,10 @@ def index(self, obj): def pop(self, n): return self[...].removeAt( n ) + def insert(self, i, o): + if i < 0: i = self.length+i + self[...].insert(i,o) + def tuple(a): return list(a) diff --git a/regtests/bench/fannkuch.py b/regtests/bench/fannkuch.py new file mode 100644 index 0000000..4d94d90 --- /dev/null +++ b/regtests/bench/fannkuch.py @@ -0,0 +1,72 @@ +# The Computer Language Benchmarks Game +# http://shootout.alioth.debian.org/ +# +# contributed by Sokolov Yura +# modified by Tupteq +# modified by hartsantler 2014 + +from time import time + +DEFAULT_ARG = 9 + +def main(): + if PYTHON=='PYTHONJS': + pythonjs.configure( direct_operator='+' ) + pass + + times = [] + for i in range(3): + t0 = time() + #res = fannkuch(DEFAULT_ARG) + res = fannkuch(8) + tk = time() + times.append(tk - t0) + avg = sum(times) / len(times) + print(avg) + +def fannkuch(n): + count = range(1, n+1) + max_flips = 0 + m = n-1 + r = n + check = 0 + perm1 = range(n) + perm = range(n) + #perm1_ins = perm1.insert + #perm1_pop = perm1.pop + if PYTHON=='PYTHON3': + count = list(count) + perm1 = list(perm1) + perm = list(perm) + + while True: + if check < 30: + check += 1 + + while r != 1: + count[r-1] = r + r -= 1 + + if perm1[0] != 0 and perm1[m] != m: + perm = perm1[:] + flips_count = 0 + k = perm[0] + while k: + perm[:k+1] = perm[k::-1] + flips_count += 1 + k = perm[0] + + if flips_count > max_flips: + max_flips = flips_count + + while r != n: + #perm1_ins(r, perm1_pop(0)) + perm1.insert(r, perm1.pop(0)) + count[r] -= 1 + if count[r] > 0: + break + r += 1 + else: + return max_flips + + From 3ab21b1d74dfc0564cbe4c850b222bef7b62b816 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 10 Jun 2014 19:42:53 -0700 Subject: [PATCH 019/222] dart backend: fixed list slicing --- pythonjs/python_to_pythonjs.py | 14 ++++++++++ pythonjs/runtime/dart_builtins.py | 44 ++++++++++++++++++++----------- regtests/bench/fannkuch.py | 1 + regtests/list/slice.py | 18 +++++++++++++ regtests/list/slice_reverse.py | 15 +++++++++-- 5 files changed, 75 insertions(+), 17 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index e60ca0a..8b45d39 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -157,6 +157,7 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._with_webworker = False self._with_rpc = None self._with_rpc_name = None + self._with_direct_keys = False self._source = source.splitlines() self._classes = dict() ## class name : [method names] @@ -1458,6 +1459,9 @@ def visit_Subscript(self, node): elif isinstance(node.slice, ast.Index) and isinstance(node.slice.value, ast.BinOp): return '%s[ %s ]' %(name, self.visit(node.slice)) + elif self._with_direct_keys: + return '%s[ %s ]' %(name, self.visit(node.slice)) + else: ## ------------------ javascript mode ------------------------ s = self.visit(node.slice) return '%s[ __ternary_operator__(%s.__uid__, %s) ]' %(name, s, s) @@ -1595,6 +1599,8 @@ def _visit_assign_helper(self, node, target): s = self.visit(target.slice.value) if isinstance(target.slice.value, ast.Num) or isinstance(target.slice.value, ast.BinOp): code = '%s[ %s ] = %s' % (self.visit(target.value), s, self.visit(node.value)) + elif self._with_direct_keys: + code = '%s[ %s ] = %s' % (self.visit(target.value), s, self.visit(node.value)) else: code = '%s[ __ternary_operator__(%s.__uid__, %s) ] = %s' % (self.visit(target.value), s, s, self.visit(node.value)) @@ -1935,6 +1941,14 @@ def visit_Call(self, node): else: raise SyntaxError( self.format_error(node) ) + elif kw.arg == 'direct_keys': + if kw.value.id == 'True': + self._with_direct_keys = True + elif kw.value.id == 'False': + self._with_direct_keys = False + else: + raise SyntaxError( self.format_error(node) ) + elif kw.arg == 'direct_operator': if kw.value.s.lower() == 'none': self._direct_operators = set() diff --git a/pythonjs/runtime/dart_builtins.py b/pythonjs/runtime/dart_builtins.py index 92f3dbc..b422603 100644 --- a/pythonjs/runtime/dart_builtins.py +++ b/pythonjs/runtime/dart_builtins.py @@ -51,23 +51,36 @@ def __setitem__(self, index, value): self[...][index] = value def __getslice__(self, start, stop, step): - if step == -1: - return list( self[...].reversed ) - elif stop == null and step == null: + + if start == null and stop == null and step == null: return list( self[...] ) - elif stop == null: - return list( self[...].sublist(start) ) - elif stop < 0: - stop = self[...].length + stop - if start != null: - return list( self[...].sublist(start, stop) ) - else: - return list( self[...].sublist(0, stop) ) else: - if start != null: - return list( self[...].sublist(start, stop) ) + if step == null: step = 1 + reverse = False + if step < 0: + step = step.abs() + reverse = True + + a = new( List() ) + i = 0 + while i < self[...].length: + a.add( self[...][i] ) + i += step + + if start == null: start = 0 + if stop == null: stop = a.length + if start < 0: + start = a.length + start + if stop < 0: + stop = a.length + stop + + if reverse: + b = new( List() ) + b.addAll( a.reversed ) + return list( b.sublist(a.length-(start+1), stop) ) else: - return list( self[...].sublist(0, stop) ) + return list( a.sublist(start, stop) ) + def __add__(self, other): self[...].addAll( other[...] ) @@ -184,7 +197,8 @@ def __getslice__(a, start, stop, step): return b else: - return list.____getslice__(a, start, stop, step) + #return list.____getslice__(a, start, stop, step) + return a.__getslice__(start, stop, step) def __reverse__(a): if instanceof(a, String): diff --git a/regtests/bench/fannkuch.py b/regtests/bench/fannkuch.py index 4d94d90..6c65df7 100644 --- a/regtests/bench/fannkuch.py +++ b/regtests/bench/fannkuch.py @@ -12,6 +12,7 @@ def main(): if PYTHON=='PYTHONJS': pythonjs.configure( direct_operator='+' ) + pythonjs.configure( direct_keys=True ) pass times = [] diff --git a/regtests/list/slice.py b/regtests/list/slice.py index e945967..11b12f3 100644 --- a/regtests/list/slice.py +++ b/regtests/list/slice.py @@ -11,6 +11,12 @@ def main(): TestError( len(a)==5 ) TestError( a[4]==4 ) + #if BACKEND=='DART': + # print(a[...]) + #else: + # print(a) + + b = range(10)[::2] TestError( len(b)==5 ) TestError( b[0]==0 ) @@ -19,8 +25,20 @@ def main(): TestError( b[3]==6 ) TestError( b[4]==8 ) + #if BACKEND=='DART': + # print(b[...]) + #else: + # print(b) + + c = range(20) d = c[ len(b) : ] + + #if BACKEND=='DART': + # print(d[...]) + #else: + # print(d) + TestError( len(d)==15 ) x = XXX() diff --git a/regtests/list/slice_reverse.py b/regtests/list/slice_reverse.py index fa3621f..dfe0a2d 100644 --- a/regtests/list/slice_reverse.py +++ b/regtests/list/slice_reverse.py @@ -4,7 +4,13 @@ def main(): a = range(10) b = a[ 4::-1 ] - #print(b) + + #if BACKEND=='DART': + # print(b[...]) + #else: + # print(b) + + TestError( b[0]==4 ) TestError( b[1]==3 ) TestError( b[2]==2 ) @@ -13,7 +19,12 @@ def main(): c = range(20) d = c[ 2::-1 ] - #print(d) + + #if BACKEND=='DART': + # print(d[...]) + #else: + # print(d) + TestError( d[0]==2 ) TestError( d[1]==1 ) TestError( d[2]==0 ) From 7743364bad30d4535efa99b4e272cd77e61939bb Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 10 Jun 2014 23:15:35 -0700 Subject: [PATCH 020/222] dart backend: __setslice__ `list[ n:n ] = iterable` --- pythonjs/runtime/dart_builtins.py | 12 ++++++++++++ regtests/list/set_slice.py | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/pythonjs/runtime/dart_builtins.py b/pythonjs/runtime/dart_builtins.py index b422603..0873b62 100644 --- a/pythonjs/runtime/dart_builtins.py +++ b/pythonjs/runtime/dart_builtins.py @@ -82,6 +82,18 @@ def __getslice__(self, start, stop, step): return list( a.sublist(start, stop) ) + def __setslice__(self, start, stop, step, items): + if start == null: start = 0 + if stop == null: stop = self[...].length + stop -= start + while stop != 0: + self[...].removeAt(start) + stop -= 1 + if instanceof(items, String): + items = items.split('') + self[...].insertAll(start, items) + + def __add__(self, other): self[...].addAll( other[...] ) return self diff --git a/regtests/list/set_slice.py b/regtests/list/set_slice.py index 44a6c26..ce6fa4f 100644 --- a/regtests/list/set_slice.py +++ b/regtests/list/set_slice.py @@ -5,6 +5,11 @@ def main(): a = list(range(10)) a[ 2:4 ] = 'XXXY' + #if BACKEND=='DART': + # print(a[...]) + #else: + # print(a) + TestError( a[0]==0 ) TestError( a[1]==1 ) From 7bc5b7349939e2e406644b9e313c15ddf52719f4 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 11 Jun 2014 02:51:08 -0700 Subject: [PATCH 021/222] optimized __getslice__, about 20 percent faster. --- pythonjs/pythonjs.js | 227 +++++++++++------------------- pythonjs/pythonjs.py | 13 +- pythonjs/runtime/builtins.py | 88 +++++++++--- pythonjs/runtime/dart_builtins.py | 2 + regtests/bench/fannkuch.py | 5 +- regtests/run.py | 2 +- 6 files changed, 168 insertions(+), 169 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 237864b..a131a53 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -969,10 +969,7 @@ __sprintf = function(fmt, args) { arr.append(item); } else { if (( typeof(item) ) == "number") { - var __left0, __right1; - __left0 = ""; - __right1 = item; - arr.append(((( typeof(__left0) ) == "number") ? (__left0 + __right1) : __add_op(__left0, __right1))); + arr.append(("" + item)); } else { arr.append(Object.prototype.toString.call(item)); } @@ -1219,8 +1216,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 406: while i < bases.length:")) { - if (__test_if_true__(issubclass([__get__(bases, "__getitem__", "line 407: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 408: while i < bases.length:")) { + if (__test_if_true__(issubclass([__get__(bases, "__getitem__", "line 409: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1331,23 +1328,14 @@ round = function(args, kwargs) { __args__ = __getargs__("round", __sig__, args, kwargs); var a = __args__['a']; var places = __args__['places']; - var __left2, __right3; - __left2 = ""; - __right3 = a; - b = ((( typeof(__left2) ) == "number") ? (__left2 + __right3) : __add_op(__left2, __right3)); + b = ("" + a); if (( b.indexOf(".") ) == -1) { return a; } else { c = b.split("."); x = c[0]; y = c[1].substring(0, places); - var __left4, __right5; - __left4 = x; - __right5 = "."; - var __left6, __right7; - __left6 = ((( typeof(__left4) ) == "number") ? (__left4 + __right5) : __add_op(__left4, __right5)); - __right7 = y; - return parseFloat(((( typeof(__left6) ) == "number") ? (__left6 + __right7) : __add_op(__left6, __right7))); + return parseFloat(((x + ".") + y)); } } @@ -1367,10 +1355,7 @@ str = function(args, kwargs) { } __args__ = __getargs__("str", __sig__, args, kwargs); var s = __args__['s']; - var __left8, __right9; - __left8 = ""; - __right9 = s; - return ((( typeof(__left8) ) == "number") ? (__left8 + __right9) : __add_op(__left8, __right9)); + return ("" + s); } str.NAME = "str"; @@ -1395,10 +1380,7 @@ _setup_str_prototype = function(args, kwargs) { Object.defineProperty(String.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(index) { if (( index ) < 0) { - var __left10, __right11; - __left10 = this.length; - __right11 = index; - return this[((( typeof(__left10) ) == "number") ? (__left10 + __right11) : __add_op(__left10, __right11))]; + return this[(this.length + index)]; } else { return this[((index.__uid__) ? index.__uid__ : index)]; } @@ -1420,10 +1402,7 @@ _setup_str_prototype = function(args, kwargs) { Object.defineProperty(String.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(idx) { if (( idx ) < 0) { - var __left12, __right13; - __left12 = this.length; - __right13 = idx; - return this[((( typeof(__left12) ) == "number") ? (__left12 + __right13) : __add_op(__left12, __right13))]; + return this[(this.length + idx)]; } else { return this[((idx.__uid__) ? idx.__uid__ : idx)]; } @@ -1449,10 +1428,7 @@ _setup_str_prototype = function(args, kwargs) { return this.split("").reverse().join(""); } else { if (( stop ) < 0) { - var __left14, __right15; - __left14 = this.length; - __right15 = stop; - stop = ((( typeof(__left14) ) == "number") ? (__left14 + __right15) : __add_op(__left14, __right15)); + stop = (this.length + stop); } return this.substring(start, stop); } @@ -1556,10 +1532,7 @@ _setup_str_prototype = function(args, kwargs) { var i; i = this.indexOf(a); if (( i ) == -1) { - var __left16, __right17; - __left16 = a; - __right17 = " - not in string"; - throw new ValueError(((( typeof(__left16) ) == "number") ? (__left16 + __right17) : __add_op(__left16, __right17))); + throw new ValueError((a + " - not in string")); } return i; } @@ -1727,10 +1700,7 @@ _setup_array_prototype = function(args, kwargs) { var __getitem__ = function(index) { ; if (( index ) < 0) { - var __left18, __right19; - __left18 = this.length; - __right19 = index; - index = ((( typeof(__left18) ) == "number") ? (__left18 + __right19) : __add_op(__left18, __right19)); + index = (this.length + index); } return this[((index.__uid__) ? index.__uid__ : index)]; } @@ -1743,10 +1713,7 @@ _setup_array_prototype = function(args, kwargs) { var __setitem__ = function(index, value) { ; if (( index ) < 0) { - var __left20, __right21; - __left20 = this.length; - __right21 = index; - index = ((( typeof(__left20) ) == "number") ? (__left20 + __right21) : __add_op(__left20, __right21)); + index = (this.length + index); } this[((index.__uid__) ? index.__uid__ : index)] = value; } @@ -1766,37 +1733,42 @@ _setup_array_prototype = function(args, kwargs) { func.types_signature = { }; Object.defineProperty(Array.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(start, stop, step) { - var i, reverse, arr; - reverse = ( step ) < 0; - if (( typeof(step) ) == "number") { - if (__test_if_true__(reverse)) { - step = Math.abs(step); - } - } else { - step = 1; - } + var i, arr, n; arr = []; - i = 0; - while (( i ) < this.length) { - arr.push(this[((i.__uid__) ? i.__uid__ : i)]); - i += step; + start = (start | 0); + stop = (stop | this.length); + if (( start ) < 0) { + start = (this.length + start); } - if (__test_if_true__(( start ) === undefined && ( stop ) === undefined)) { - if (__test_if_true__(reverse)) { - arr.reverse(); + if (( stop ) < 0) { + stop = (this.length + stop); + } + if (( typeof(step) ) == "number") { + if (( step ) < 0) { + i = start; + while (( i ) >= 0) { + arr.push(this[((i.__uid__) ? i.__uid__ : i)]); + i += step; + } + return arr; + } else { + i = start; + n = stop; + while (( i ) < n) { + arr.push(this[((i.__uid__) ? i.__uid__ : i)]); + i += step; + } + return arr; } } else { - if (__test_if_true__(reverse)) { - var __left22, __right23; - __left22 = start; - __right23 = 1; - arr = arr.slice(stop, ((( typeof(__left22) ) == "number") ? (__left22 + __right23) : __add_op(__left22, __right23))); - arr.reverse(); - } else { - arr = arr.slice(start, stop); + i = start; + n = stop; + while (( i ) < n) { + arr.push(this[((i.__uid__) ? i.__uid__ : i)]); + i += 1; } + return arr; } - return arr; } func.NAME = "func"; @@ -1820,7 +1792,6 @@ _setup_array_prototype = function(args, kwargs) { arr.push(item); } this.splice.apply(this, arr); - return this; } func.NAME = "func"; @@ -1867,10 +1838,7 @@ _setup_array_prototype = function(args, kwargs) { var insert = function(index, obj) { ; if (( index ) < 0) { - var __left24, __right25; - __left24 = this.length; - __right25 = index; - index = ((( typeof(__left24) ) == "number") ? (__left24 + __right25) : __add_op(__left24, __right25)); + index = (this.length + index); } this.splice(index, 0, obj); } @@ -1917,18 +1885,12 @@ _setup_array_prototype = function(args, kwargs) { high = this.length; } while (( low ) < high) { - var __left26, __right27; - __left26 = low; - __right27 = high; - a = ((( typeof(__left26) ) == "number") ? (__left26 + __right27) : __add_op(__left26, __right27)); + a = (low + high); mid = Math.floor((a / 2)); if (( x ) < this[((mid.__uid__) ? mid.__uid__ : mid)]) { high = mid; } else { - var __left28, __right29; - __left28 = mid; - __right29 = 1; - low = ((( typeof(__left28) ) == "number") ? (__left28 + __right29) : __add_op(__left28, __right29)); + low = (mid + 1); } } return low; @@ -2037,10 +1999,7 @@ _setup_nodelist_prototype = function(args, kwargs) { var __getitem__ = function(index) { ; if (( index ) < 0) { - var __left30, __right31; - __left30 = this.length; - __right31 = index; - index = ((( typeof(__left30) ) == "number") ? (__left30 + __right31) : __add_op(__left30, __right31)); + index = (this.length + index); } return this[((index.__uid__) ? index.__uid__ : index)]; } @@ -2053,10 +2012,7 @@ _setup_nodelist_prototype = function(args, kwargs) { var __setitem__ = function(index, value) { ; if (( index ) < 0) { - var __left32, __right33; - __left32 = this.length; - __right33 = index; - index = ((( typeof(__left32) ) == "number") ? (__left32 + __right33) : __add_op(__left32, __right33)); + index = (this.length + index); } this[((index.__uid__) ? index.__uid__ : index)] = value; } @@ -2188,7 +2144,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b, __iterator__20; - __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 827: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 873: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__20; __next__20 = __get__(__iterator__20, "next"); while (( __iterator__20.index ) < __iterator__20.length) { @@ -2231,7 +2187,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 847: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 893: return ob.__len__()"), "__call__")(); } } } @@ -2254,7 +2210,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 851: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 897: return obj.next()"), "__call__")(); } next.NAME = "next"; @@ -2277,7 +2233,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__21; - __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 856: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 902: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__21; __next__21 = __get__(__iterator__21, "next"); while (( __iterator__21.index ) < __iterator__21.length) { @@ -2308,7 +2264,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__22; - __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 864: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 910: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__22; __next__22 = __get__(__iterator__22, "next"); while (( __iterator__22.index ) < __iterator__22.length) { @@ -2339,7 +2295,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__23; - __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 873: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 919: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__23; __next__23 = __get__(__iterator__23, "next"); while (( __iterator__23.index ) < __iterator__23.length) { @@ -2374,7 +2330,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__24; - __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 880: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 926: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__24; __next__24 = __get__(__iterator__24, "next"); while (( __iterator__24.index ) < __iterator__24.length) { @@ -2499,7 +2455,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 915: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 961: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.NAME = "__Iterator___init__"; @@ -2624,27 +2580,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o, __iterator__25; - __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 970: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 1016: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__25; __next__25 = __get__(__iterator__25, "next"); while (( __iterator__25.index ) < __iterator__25.length) { o = __next__25(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 972: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 972: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 972: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1018: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 1018: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 1018: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 974: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 974: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 974: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1020: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 1020: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 1020: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key, __iterator__26; - __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 976: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1022: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { key = __next__26(); - value = __get__(ob, "__getitem__", "line 977: value = ob[ key ]")([key], __NULL_OBJECT__); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 978: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = __get__(ob, "__getitem__", "line 1023: value = ob[ key ]")([key], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1024: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2675,15 +2631,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key, __iterator__27; - __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 986: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 1032: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); while (( __iterator__27.index ) < __iterator__27.length) { key = __next__27(); - value = __get__(self["$wrapped"], "__getitem__", "line 987: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1033: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 990: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1036: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2756,7 +2712,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1006: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1052: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2784,12 +2740,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key, __iterator__28; - __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 1014: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 1060: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { key = __next__28(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1015: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 1015: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1061: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 1061: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); } } @@ -2813,12 +2769,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key, __iterator__29; - __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1019: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1065: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__29; __next__29 = __get__(__iterator__29, "next"); while (( __iterator__29.index ) < __iterator__29.length) { key = __next__29(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1020: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1066: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2869,7 +2825,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1030: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1076: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.NAME = "__dict_set"; @@ -3216,7 +3172,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1231: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1231: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1277: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1277: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3240,7 +3196,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1255: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1301: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.NAME = "__array___init__"; @@ -3282,7 +3238,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1263: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1309: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3312,10 +3268,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = __mul_op(step, index); dataview = self.dataview; - var __left34, __right35; - __left34 = "get"; - __right35 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1273: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1273: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); - func_name = ((( typeof(__left34) ) == "number") ? (__left34 + __right35) : __add_op(__left34, __right35)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1319: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1319: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3354,17 +3307,11 @@ __array___setitem__ = function(args, kwargs) { var value = __args__['value']; step = self.itemsize; if (( index ) < 0) { - var __left36, __right37; - __left36 = self.length; - __right37 = index; - index = (((( typeof(__left36) ) == "number") ? (__left36 + __right37) : __add_op(__left36, __right37)) - 1); + index = ((self.length + index) - 1); } offset = __mul_op(step, index); dataview = self.dataview; - var __left38, __right39; - __left38 = "set"; - __right39 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1292: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1292: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__); - func_name = ((( typeof(__left38) ) == "number") ? (__left38 + __right39) : __add_op(__left38, __right39)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1338: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1338: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3446,16 +3393,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = __mul_op(length, step); dataview = self.dataview; - var __left40, __right41; - __left40 = "set"; - __right41 = __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1317: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1317: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__); - func_name = ((( typeof(__left40) ) == "number") ? (__left40 + __right41) : __add_op(__left40, __right41)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1363: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1363: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = __get__(lst, "__getitem__", "line 1322: item = lst[i]")([i], __NULL_OBJECT__); + item = __get__(lst, "__getitem__", "line 1368: item = lst[i]")([i], __NULL_OBJECT__); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3523,10 +3467,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - var __left42, __right43; - __left42 = self.length; - __right43 = 1; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1350: self.resize( self.length + 1 )"), "__call__")([((( typeof(__left42) ) == "number") ? (__left42 + __right43) : __add_op(__left42, __right43))], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1396: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3549,12 +3490,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value, __iterator__34; - __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1354: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1400: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__34; __next__34 = __get__(__iterator__34, "next"); while (( __iterator__34.index ) < __iterator__34.length) { value = __next__34(); - __get__(__get__(self, "append", "missing attribute `append` - line 1355: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1401: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3603,7 +3544,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1367: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1413: return self.to_array()"), "__call__")(); } __array_to_list.NAME = "__array_to_list"; @@ -3625,9 +3566,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1371: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1417: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1372: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1418: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index e9c5ef5..5f3899e 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -51,7 +51,16 @@ def visit_Assign(self, node): return code def visit_AugAssign(self, node): - a = '%s %s= %s;' %(self.visit(node.target), self.visit(node.op), self.visit(node.value)) + ## n++ and n-- are slightly faster than n+=1 and n-=1 + target = self.visit(node.target) + op = self.visit(node.op) + value = self.visit(node.value) + if op=='+' and isinstance(node.value, ast.Num) and node.value.n == 1: + a = '%s ++;' %target + if op=='-' and isinstance(node.value, ast.Num) and node.value.n == 1: + a = '%s --;' %target + else: + a = '%s %s= %s;' %(target, op, value) return a def visit_Module(self, node): @@ -66,7 +75,7 @@ def visit_Module(self, node): if self._insert_runtime: dirname = os.path.dirname(os.path.abspath(__file__)) runtime = open( os.path.join(dirname, 'pythonjs.js') ).read() - lines.append( runtime.replace('\n', ';') ) + lines.append( runtime ) #.replace('\n', ';') ) for b in node.body: line = self.visit(b) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index d23daa1..b62aeb7 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -3,6 +3,8 @@ # License: "New BSD" pythonjs.configure(runtime_exceptions=False) +pythonjs.configure( direct_operator='+' ) +pythonjs.configure( direct_operator='*' ) _PythonJS_UID = 0 @@ -652,29 +654,74 @@ def func(): @Array.prototype.__getslice__ def func(start, stop, step): - reverse = step < 0 ## in javascript `null<0` and `undefined<0` are false + arr = [] #new(Array(this.length)) + + start = start | 0 + stop = stop | this.length + + if start < 0: + start = this.length + start + if stop < 0: + stop = this.length + stop + + #reverse = step < 0 ## in javascript `null<0` and `undefined<0` are false + #reverse = False + if typeof(step)=='number': - if reverse: step = Math.abs(step) - else: - step = 1 + #reverse = step < 0 + #if reverse: + if step < 0: + #step = Math.abs(step) + i = start + while i >= 0: + arr.push( this[i] ) + i += step + return arr - arr = [] - i = 0 - while i < this.length: - arr.push( this[i] ) - i += step - - if start is undefined and stop is undefined: - if reverse: arr.reverse() - elif reverse: - arr = arr.slice(stop, start+1) - arr.reverse() - else: - #if stop < 0: ## mozilla spec says negative indices are supported - # stop = arr.length + stop - arr = arr.slice(start, stop) + else: + i = start + n = stop + while i < n: + arr.push( this[i] ) + i += step + return arr - return arr + else: + i = start + n = stop + while i < n: + #arr[ i ] = this[i] ## slower in chrome + arr.push( this[i] ) + i += 1 ## this gets optimized to i++ + return arr + + #if reverse: + # arr.reverse() + + #if step == 1: + # arr = new(Array(this.length)) + # i = 0 + # while i < this.length: + # arr[ i ] = this[i] + # i += 1 ## this gets optimized to i++ + #else: + # arr = [] + # i = 0 + # while i < this.length: + # arr.push( this[i] ) + # i += step + + #if start is undefined and stop is undefined: + # if reverse: arr.reverse() + #elif reverse: + # arr = arr.slice(stop, start+1) + # arr.reverse() + #else: + # #if stop < 0: ## mozilla spec says negative indices are supported + # # stop = arr.length + stop + # arr = arr.slice(start, stop) + + #return arr @Array.prototype.__setslice__ def func(start, stop, step, items): @@ -683,7 +730,6 @@ def func(start, stop, step, items): arr = [start, stop-start] for item in items: arr.push( item ) this.splice.apply(this, arr ) - return this @Array.prototype.append def func(item): diff --git a/pythonjs/runtime/dart_builtins.py b/pythonjs/runtime/dart_builtins.py index 0873b62..670eeb1 100644 --- a/pythonjs/runtime/dart_builtins.py +++ b/pythonjs/runtime/dart_builtins.py @@ -91,6 +91,8 @@ def __setslice__(self, start, stop, step, items): stop -= 1 if instanceof(items, String): items = items.split('') + elif instanceof(items, list): + items = items[...] self[...].insertAll(start, items) diff --git a/regtests/bench/fannkuch.py b/regtests/bench/fannkuch.py index 6c65df7..222695f 100644 --- a/regtests/bench/fannkuch.py +++ b/regtests/bench/fannkuch.py @@ -16,7 +16,7 @@ def main(): pass times = [] - for i in range(3): + for i in range(4): t0 = time() #res = fannkuch(DEFAULT_ARG) res = fannkuch(8) @@ -52,7 +52,8 @@ def fannkuch(n): perm = perm1[:] flips_count = 0 k = perm[0] - while k: + #while k: ## TODO fix for dart + while k != 0: perm[:k+1] = perm[k::-1] flips_count += 1 k = perm[0] diff --git a/regtests/run.py b/regtests/run.py index d341ca8..3a58861 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -156,7 +156,7 @@ def run_pypy_test_on(filename): nodewebkit = os.path.expanduser('~/node-webkit-v0.8.4-linux-x64/nw') if os.path.isfile( nodewebkit ): nodewebkit_runnable = True -if not show_details: +if not show_details or '--no-nodewebkit' in sys.argv: nodewebkit_runnable = False #dart2js = os.path.expanduser( '~/dart-sdk-1.0/dart-sdk/bin/dart2js') ## TODO support dart-sdk-1.3+ From dd172c04e59ffcb5c40597ac937d04879e729fa8 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 11 Jun 2014 05:21:26 -0700 Subject: [PATCH 022/222] optimized unpack assignment by using ternary to check if the container is an Array. --- pythonjs/python_to_pythonjs.py | 20 +++- pythonjs/pythonjs.js | 194 ++++++++++++++++++--------------- pythonjs/runtime/builtins.py | 14 ++- regtests/bench/copy_list.py | 29 +++++ regtests/bench/float.py | 4 +- regtests/bench/nbody.py | 6 +- regtests/bench/new_list.py | 23 ++++ regtests/bench/pystone.py | 9 +- 8 files changed, 196 insertions(+), 103 deletions(-) create mode 100644 regtests/bench/copy_list.py create mode 100644 regtests/bench/new_list.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 8b45d39..a325378 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -142,7 +142,7 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._line = None self._line_number = 0 - self._direct_operators = set() ## optimize "+" operator + self._direct_operators = set() ## optimize "+" and "*" operator self._with_ll = False ## lowlevel self._with_lua = lua self._with_coffee = coffee @@ -197,6 +197,8 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._comprehensions = [] self._generator_functions = set() + self._in_loop_with_else = False + self._custom_operators = {} self._injector = [] ## advanced meta-programming hacks self._in_class = None @@ -1212,6 +1214,9 @@ def visit_BinOp(self, node): power = POWER_OF_TWO.index( node.right.n ) return '%s >> %s'%(left, power) + elif not self._with_dart and op == '*' and '*' in self._direct_operators: + return '(%s * %s)'%(left, right) + elif not self._with_dart and not self._with_js and op == '*': if left in self._typedef_vars and self._typedef_vars[left] in typedpython.native_number_types: return '(%s * %s)'%(left, right) @@ -1442,7 +1447,10 @@ def visit_Subscript(self, node): ## this is required because we need to support slices on String ## return '__getslice__(%s, %s)'%(name, self.visit(node.slice)) else: - return '%s.__getslice__(%s)'%(name, self.visit(node.slice)) + if not node.slice.lower and not node.slice.upper and not node.slice.step: + return '%s.copy()' %name + else: + return '%s.__getslice__(%s)'%(name, self.visit(node.slice)) elif isinstance(node.slice, ast.Index) and isinstance(node.slice.value, ast.Num): @@ -1769,7 +1777,8 @@ def _visit_assign_helper(self, node, target): elif self._with_js or self._with_dart: writer.write("%s = %s[%s]" % (self.visit(target), r, i)) else: - writer.write("%s = __get__(__get__(%s, '__getitem__'), '__call__')([%s], __NULL_OBJECT__)" % (self.visit(target), r, i)) + fallback = "__get__(__get__(%s, '__getitem__'), '__call__')([%s], __NULL_OBJECT__)" %(r, i) + writer.write("%s = __ternary_operator__(instanceof(%s,Array), %s[%s], %s)" % (self.visit(target), r, r,i, fallback )) def visit_Print(self, node): writer.write('print %s' % ', '.join(map(self.visit, node.values))) @@ -2915,7 +2924,8 @@ def visit_Continue(self, node): return '' def visit_Break(self, node): - writer.write('__break__ = True') + if self._in_loop_with_else: + writer.write('__break__ = True') writer.write('break') def visit_For(self, node): @@ -3158,6 +3168,7 @@ def visit_While(self, node): self._call_ids += 1 if node.orelse: + self._in_loop_with_else = True writer.write('var(__break__)') writer.write('__break__ = False') @@ -3169,6 +3180,7 @@ def visit_While(self, node): writer.pull() if node.orelse: + self._in_loop_with_else = False writer.write('if __break__ == False:') writer.push() map(self.visit, node.orelse) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index a131a53..a9f2e7f 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -486,8 +486,8 @@ try { } catch(__exception__) { console.trace(); console.error(__exception__, __exception__.message); -console.error("line 5: pythonjs.configure(runtime_exceptions=False)"); -throw new RuntimeError("line 5: pythonjs.configure(runtime_exceptions=False)"); +console.error("line 5: pythonjs.configure( runtime_exceptions=False )"); +throw new RuntimeError("line 5: pythonjs.configure( runtime_exceptions=False )"); } _PythonJS_UID = 0; @@ -739,7 +739,7 @@ __jsdict = function(items) { if (__test_if_true__(key.__uid__)) { key = key.__uid__; } - d[((key.__uid__) ? key.__uid__ : key)] = item[1]; + d[key] = item[1]; } return d; } @@ -751,7 +751,7 @@ __jsdict.types_signature = { }; __jsdict_get = function(ob, key, default_value) { if (__test_if_true__(ob instanceof Object)) { if (__test_if_true__(key in ob)) { - return ob[((key.__uid__) ? key.__uid__ : key)]; + return ob[key]; } return default_value; } else { @@ -769,7 +769,7 @@ __jsdict_get.kwargs_signature = { }; __jsdict_get.types_signature = { }; __jsdict_set = function(ob, key, value) { if (__test_if_true__(ob instanceof Object)) { - ob[((key.__uid__) ? key.__uid__ : key)] = value; + ob[key] = value; } else { ob.set(key,value); } @@ -800,7 +800,7 @@ __jsdict_values = function(ob) { for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { var key = __iter3[ __idx3 ]; if (__test_if_true__(ob.hasOwnProperty(key))) { - value = ob[((key.__uid__) ? key.__uid__ : key)]; + value = ob[key]; arr.push(value); } } @@ -823,7 +823,7 @@ __jsdict_items = function(ob) { for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { var key = __iter4[ __idx4 ]; if (__test_if_true__(Object.hasOwnProperty.call(ob, key))) { - value = ob[((key.__uid__) ? key.__uid__ : key)]; + value = ob[key]; arr.push([key, value]); } } @@ -856,7 +856,7 @@ __jsdict_pop = function(ob, key, _kwargs_) { } else { if (__test_if_true__(ob instanceof Object)) { if (__test_if_true__(key in ob)) { - v = ob[((key.__uid__) ? key.__uid__ : key)]; + v = ob[key]; delete ob[key]; return v; } else { @@ -895,12 +895,12 @@ __bind_property_descriptors__ = function(o, klass) { for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { var name = __iter5[ __idx5 ]; desc = __jsdict([["enumerable", true]]); - prop = klass.__properties__[((name.__uid__) ? name.__uid__ : name)]; - if (__test_if_true__(prop[(("get".__uid__) ? "get".__uid__ : "get")])) { - desc[(("get".__uid__) ? "get".__uid__ : "get")] = __generate_getter__(klass, o, name); + prop = klass.__properties__[name]; + if (__test_if_true__(prop["get"])) { + desc["get"] = __generate_getter__(klass, o, name); } - if (__test_if_true__(prop[(("set".__uid__) ? "set".__uid__ : "set")])) { - desc[(("set".__uid__) ? "set".__uid__ : "set")] = __generate_setter__(klass, o, name); + if (__test_if_true__(prop["set"])) { + desc["set"] = __generate_setter__(klass, o, name); } Object.defineProperty(o, name, desc); } @@ -918,7 +918,7 @@ __bind_property_descriptors__.kwargs_signature = { }; __bind_property_descriptors__.types_signature = { }; __generate_getter__ = function(klass, o, n) { var __lambda__ = function() { - return klass.__properties__[((n.__uid__) ? n.__uid__ : n)][(("get".__uid__) ? "get".__uid__ : "get")]([o], __jsdict([])); + return klass.__properties__[n]["get"]([o], __jsdict([])); } __lambda__.NAME = "__lambda__"; @@ -934,7 +934,7 @@ __generate_getter__.kwargs_signature = { }; __generate_getter__.types_signature = { }; __generate_setter__ = function(klass, o, n) { var __lambda__ = function(v) { - return klass.__properties__[((n.__uid__) ? n.__uid__ : n)][(("set".__uid__) ? "set".__uid__ : "set")]([o, v], __jsdict([])); + return klass.__properties__[n]["set"]([o, v], __jsdict([])); } __lambda__.NAME = "__lambda__"; @@ -964,7 +964,7 @@ __sprintf = function(fmt, args) { __break__ = true; break; } - item = args[((i.__uid__) ? i.__uid__ : i)]; + item = args[i]; if (( typeof(item) ) == "string") { arr.append(item); } else { @@ -1000,23 +1000,23 @@ __create_class__ = function(class_name, parents, attrs, props) { if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { var key = __iter8[ __idx8 ]; - if (( typeof(attrs[((key.__uid__) ? key.__uid__ : key)]) ) == "function") { + if (( typeof(attrs[key]) ) == "function") { klass.__all_method_names__.push(key); - f = attrs[((key.__uid__) ? key.__uid__ : key)]; + f = attrs[key]; if (__test_if_true__(hasattr(f, "is_classmethod") && f.is_classmethod)) { /*pass*/ } else { if (__test_if_true__(hasattr(f, "is_staticmethod") && f.is_staticmethod)) { /*pass*/ } else { - klass.__unbound_methods__[((key.__uid__) ? key.__uid__ : key)] = attrs[((key.__uid__) ? key.__uid__ : key)]; + klass.__unbound_methods__[key] = attrs[key]; } } } if (( key ) == "__getattribute__") { continue } - klass[((key.__uid__) ? key.__uid__ : key)] = attrs[((key.__uid__) ? key.__uid__ : key)]; + klass[key] = attrs[key]; } klass.__setters__ = []; klass.__getters__ = []; @@ -1024,9 +1024,9 @@ __create_class__ = function(class_name, parents, attrs, props) { if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { var name = __iter9[ __idx9 ]; - prop = klass.__properties__[((name.__uid__) ? name.__uid__ : name)]; + prop = klass.__properties__[name]; klass.__getters__.push(name); - if (__test_if_true__(prop[(("set".__uid__) ? "set".__uid__ : "set")])) { + if (__test_if_true__(prop["set"])) { klass.__setters__.push(name); } } @@ -1151,8 +1151,8 @@ getattr = function(args, kwargs) { var property = __args__['property']; if (__test_if_true__(property)) { prop = _get_upstream_property(ob.__class__, attr); - if (__test_if_true__(prop && prop[(("get".__uid__) ? "get".__uid__ : "get")])) { - return prop[(("get".__uid__) ? "get".__uid__ : "get")]([ob], __jsdict([])); + if (__test_if_true__(prop && prop["get"])) { + return prop["get"]([ob], __jsdict([])); } else { console.log("ERROR: getattr property error", prop); } @@ -1183,8 +1183,8 @@ setattr = function(args, kwargs) { var property = __args__['property']; if (__test_if_true__(property)) { prop = _get_upstream_property(ob.__class__, attr); - if (__test_if_true__(prop && prop[(("set".__uid__) ? "set".__uid__ : "set")])) { - prop[(("set".__uid__) ? "set".__uid__ : "set")]([ob, value], __jsdict([])); + if (__test_if_true__(prop && prop["set"])) { + prop["set"]([ob, value], __jsdict([])); } else { console.log("ERROR: setattr property error", prop); } @@ -1216,8 +1216,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 408: while i < bases.length:")) { - if (__test_if_true__(issubclass([__get__(bases, "__getitem__", "line 409: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 409: while i < bases.length:")) { + if (__test_if_true__(issubclass([__get__(bases, "__getitem__", "line 410: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1382,7 +1382,7 @@ _setup_str_prototype = function(args, kwargs) { if (( index ) < 0) { return this[(this.length + index)]; } else { - return this[((index.__uid__) ? index.__uid__ : index)]; + return this[index]; } } @@ -1404,7 +1404,7 @@ _setup_str_prototype = function(args, kwargs) { if (( idx ) < 0) { return this[(this.length + idx)]; } else { - return this[((idx.__uid__) ? idx.__uid__ : idx)]; + return this[idx]; } } @@ -1598,7 +1598,7 @@ _setup_str_prototype = function(args, kwargs) { if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { var key = __iter14[ __idx14 ]; - r = r.split(key).join(fmt[((key.__uid__) ? key.__uid__ : key)]); + r = r.split(key).join(fmt[key]); } r = r.split("{").join("").split("}").join(""); return r; @@ -1650,10 +1650,10 @@ _setup_array_prototype = function(args, kwargs) { var i, item; i = 0; while (( i ) < this.length) { - item = this[((i.__uid__) ? i.__uid__ : i)]; + item = this[i]; if (( typeof(item) ) == "object") { if (__test_if_true__(item.jsify)) { - this[((i.__uid__) ? i.__uid__ : i)] = item.jsify(); + this[i] = item.jsify(); } } i += 1; @@ -1689,7 +1689,7 @@ _setup_array_prototype = function(args, kwargs) { func.types_signature = { }; Object.defineProperty(Array.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(index) { - return this[((index.__uid__) ? index.__uid__ : index)]; + return this[index]; } func.NAME = "func"; @@ -1702,7 +1702,7 @@ _setup_array_prototype = function(args, kwargs) { if (( index ) < 0) { index = (this.length + index); } - return this[((index.__uid__) ? index.__uid__ : index)]; + return this[index]; } __getitem__.NAME = "__getitem__"; @@ -1715,7 +1715,7 @@ _setup_array_prototype = function(args, kwargs) { if (( index ) < 0) { index = (this.length + index); } - this[((index.__uid__) ? index.__uid__ : index)] = value; + this[index] = value; } __setitem__.NAME = "__setitem__"; @@ -1747,7 +1747,7 @@ _setup_array_prototype = function(args, kwargs) { if (( step ) < 0) { i = start; while (( i ) >= 0) { - arr.push(this[((i.__uid__) ? i.__uid__ : i)]); + arr.push(this[i]); i += step; } return arr; @@ -1755,7 +1755,7 @@ _setup_array_prototype = function(args, kwargs) { i = start; n = stop; while (( i ) < n) { - arr.push(this[((i.__uid__) ? i.__uid__ : i)]); + arr.push(this[i]); i += step; } return arr; @@ -1764,7 +1764,7 @@ _setup_array_prototype = function(args, kwargs) { i = start; n = stop; while (( i ) < n) { - arr.push(this[((i.__uid__) ? i.__uid__ : i)]); + arr.push(this[i]); i += 1; } return arr; @@ -1887,7 +1887,7 @@ _setup_array_prototype = function(args, kwargs) { while (( low ) < high) { a = (low + high); mid = Math.floor((a / 2)); - if (( x ) < this[((mid.__uid__) ? mid.__uid__ : mid)]) { + if (( x ) < this[mid]) { high = mid; } else { low = (mid + 1); @@ -1956,6 +1956,22 @@ _setup_array_prototype = function(args, kwargs) { func.kwargs_signature = { }; func.types_signature = { }; Object.defineProperty(Array.prototype, "issubset", { enumerable:false,value:func,writeable:true,configurable:true }); + var func = function() { + var i, arr; + arr = []; + i = 0; + while (( i ) < this.length) { + arr.push(this[i]); + i += 1; + } + return arr; + } + + func.NAME = "func"; + func.args_signature = []; + func.kwargs_signature = { }; + func.types_signature = { }; + Object.defineProperty(Array.prototype, "copy", { enumerable:false,value:func,writeable:true,configurable:true }); } _setup_array_prototype.NAME = "_setup_array_prototype"; @@ -1988,7 +2004,7 @@ _setup_nodelist_prototype = function(args, kwargs) { func.types_signature = { }; Object.defineProperty(NodeList.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(index) { - return this[((index.__uid__) ? index.__uid__ : index)]; + return this[index]; } func.NAME = "func"; @@ -2001,7 +2017,7 @@ _setup_nodelist_prototype = function(args, kwargs) { if (( index ) < 0) { index = (this.length + index); } - return this[((index.__uid__) ? index.__uid__ : index)]; + return this[index]; } __getitem__.NAME = "__getitem__"; @@ -2014,7 +2030,7 @@ _setup_nodelist_prototype = function(args, kwargs) { if (( index ) < 0) { index = (this.length + index); } - this[((index.__uid__) ? index.__uid__ : index)] = value; + this[index] = value; } __setitem__.NAME = "__setitem__"; @@ -2144,7 +2160,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b, __iterator__20; - __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 873: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 885: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__20; __next__20 = __get__(__iterator__20, "next"); while (( __iterator__20.index ) < __iterator__20.length) { @@ -2187,7 +2203,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 893: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 905: return ob.__len__()"), "__call__")(); } } } @@ -2210,7 +2226,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 897: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 909: return obj.next()"), "__call__")(); } next.NAME = "next"; @@ -2233,7 +2249,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__21; - __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 902: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 914: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__21; __next__21 = __get__(__iterator__21, "next"); while (( __iterator__21.index ) < __iterator__21.length) { @@ -2264,7 +2280,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob, __iterator__22; - __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 910: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 922: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__22; __next__22 = __get__(__iterator__22, "next"); while (( __iterator__22.index ) < __iterator__22.length) { @@ -2295,7 +2311,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__23; - __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 919: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 931: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__23; __next__23 = __get__(__iterator__23, "next"); while (( __iterator__23.index ) < __iterator__23.length) { @@ -2330,7 +2346,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value, __iterator__24; - __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 926: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 938: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__24; __next__24 = __get__(__iterator__24, "next"); while (( __iterator__24.index ) < __iterator__24.length) { @@ -2455,7 +2471,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 961: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 973: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.NAME = "__Iterator___init__"; @@ -2580,27 +2596,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o, __iterator__25; - __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 1016: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 1028: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__25; __next__25 = __get__(__iterator__25, "next"); while (( __iterator__25.index ) < __iterator__25.length) { o = __next__25(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1018: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 1018: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 1018: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1030: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 1030: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 1030: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1020: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 1020: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 1020: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1032: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 1032: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 1032: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key, __iterator__26; - __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1022: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1034: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { key = __next__26(); - value = __get__(ob, "__getitem__", "line 1023: value = ob[ key ]")([key], __NULL_OBJECT__); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1024: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = __get__(ob, "__getitem__", "line 1035: value = ob[ key ]")([key], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1036: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2631,15 +2647,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key, __iterator__27; - __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 1032: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 1044: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); while (( __iterator__27.index ) < __iterator__27.length) { key = __next__27(); - value = __get__(self["$wrapped"], "__getitem__", "line 1033: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1045: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1036: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1048: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2712,7 +2728,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1052: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1064: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2740,12 +2756,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key, __iterator__28; - __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 1060: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 1072: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { key = __next__28(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1061: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 1061: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1073: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 1073: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); } } @@ -2769,12 +2785,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key, __iterator__29; - __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1065: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1077: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__29; __next__29 = __get__(__iterator__29, "next"); while (( __iterator__29.index ) < __iterator__29.length) { key = __next__29(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1066: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1078: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2825,7 +2841,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1076: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1088: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.NAME = "__dict_set"; @@ -2988,7 +3004,7 @@ __dict_values = function(args, kwargs) { if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { var key = __iter19[ __idx19 ]; - out.push(self["$wrapped"][((key.__uid__) ? key.__uid__ : key)]); + out.push(self["$wrapped"][key]); } return out; } @@ -3091,7 +3107,7 @@ set = function(args, kwargs) { var b = __iter20[ __idx20 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); - hashtable[((key.__uid__) ? key.__uid__ : key)] = b; + hashtable[key] = b; keys.push(key); } else { fallback = true; @@ -3118,7 +3134,7 @@ set = function(args, kwargs) { if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { var key = __iter22[ __idx22 ]; - s.push(hashtable[((key.__uid__) ? key.__uid__ : key)]); + s.push(hashtable[key]); } } return s; @@ -3172,7 +3188,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1277: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1277: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1289: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1289: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3196,7 +3212,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1301: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1313: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.NAME = "__array___init__"; @@ -3238,7 +3254,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1309: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1321: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3268,7 +3284,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = __mul_op(step, index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1319: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1319: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1331: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1331: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3311,7 +3327,7 @@ __array___setitem__ = function(args, kwargs) { } offset = __mul_op(step, index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1338: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1338: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1350: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1350: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3393,13 +3409,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = __mul_op(length, step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1363: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1363: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1375: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1375: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = __get__(lst, "__getitem__", "line 1368: item = lst[i]")([i], __NULL_OBJECT__); + item = __get__(lst, "__getitem__", "line 1380: item = lst[i]")([i], __NULL_OBJECT__); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3467,7 +3483,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1396: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1408: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3490,12 +3506,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value, __iterator__34; - __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1400: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1412: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__34; __next__34 = __get__(__iterator__34, "next"); while (( __iterator__34.index ) < __iterator__34.length) { value = __next__34(); - __get__(__get__(self, "append", "missing attribute `append` - line 1401: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1413: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3544,7 +3560,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1413: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1425: return self.to_array()"), "__call__")(); } __array_to_list.NAME = "__array_to_list"; @@ -3566,9 +3582,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1417: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1429: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1418: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1430: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3731,8 +3747,8 @@ __get_other_workers_with_shared_arg = function(worker, ob) { if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { var b = __iter23[ __idx23 ]; - other = b[(("worker".__uid__) ? "worker".__uid__ : "worker")]; - args = b[(("args".__uid__) ? "args".__uid__ : "args")]; + other = b["worker"]; + args = b["args"]; if (( other ) !== worker) { var __iter24 = args; if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } @@ -3765,13 +3781,13 @@ __start_new_thread = function(f, args) { worker.terminate(); } else { if (( event.data.type ) == "call") { - res = __module__[((event.data.function.__uid__) ? event.data.function.__uid__ : event.data.function)].apply(null, event.data.args); + res = __module__[event.data.function].apply(null, event.data.args); if (__test_if_true__(( res ) !== null && ( res ) !== undefined)) { worker.postMessage(__jsdict([["type", "return_to_blocking_callback"], ["result", res]])); } } else { if (( event.data.type ) == "append") { - a = args[((event.data.argindex.__uid__) ? event.data.argindex.__uid__ : event.data.argindex)]; + a = args[event.data.argindex]; a.push(event.data.value); var __iter25 = __get_other_workers_with_shared_arg(worker, a); if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } @@ -3781,12 +3797,12 @@ __start_new_thread = function(f, args) { } } else { if (( event.data.type ) == "__setitem__") { - a = args[((event.data.argindex.__uid__) ? event.data.argindex.__uid__ : event.data.argindex)]; + a = args[event.data.argindex]; value = event.data.value; if (__test_if_true__(a.__setitem__)) { a.__setitem__(event.data.index, value); } else { - a[((event.data.index.__uid__) ? event.data.index.__uid__ : event.data.index)] = value; + a[event.data.index] = value; } var __iter26 = __get_other_workers_with_shared_arg(worker, a); if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } @@ -3875,7 +3891,7 @@ __webworker_wrap = function(ob, argindex) { if (( typeof(ob) ) == "object") { var func = function(key, item) { postMessage(__jsdict([["type", "__setitem__"], ["index", key], ["value", item], ["argindex", argindex]])); - ob[((key.__uid__) ? key.__uid__ : key)] = item; + ob[key] = item; } func.NAME = "func"; diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index b62aeb7..10cdf79 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -2,9 +2,10 @@ # by Amirouche Boubekki and Brett Hartshorn - copyright 2013 # License: "New BSD" -pythonjs.configure(runtime_exceptions=False) +pythonjs.configure( runtime_exceptions=False ) pythonjs.configure( direct_operator='+' ) pythonjs.configure( direct_operator='*' ) +pythonjs.configure( direct_keys=True ) _PythonJS_UID = 0 @@ -798,6 +799,17 @@ def func(other): return False return True + ## non-standard utils ## + @Array.prototype.copy + def func(): + arr = [] + i = 0 + while i < this.length: + arr.push( this[i] ) + i += 1 + return arr + + _setup_array_prototype() diff --git a/regtests/bench/copy_list.py b/regtests/bench/copy_list.py new file mode 100644 index 0000000..02a2c71 --- /dev/null +++ b/regtests/bench/copy_list.py @@ -0,0 +1,29 @@ +'''copy list micro benchmark''' + +from time import time + +def main(): + if PYTHON=='PYTHONJS': + pythonjs.configure( direct_operator='+' ) + pythonjs.configure( direct_keys=True ) + pass + + a = list(range(1000)) + times = [] + for i in range(4): + t0 = time() + res = copy_list(a, 10000) + tk = time() + times.append(tk - t0) + avg = sum(times) / len(times) + print(avg) + +def copy_list( a, n ): + x = [] + for i in range(n): + b = a[:] + for j in range(10): + b.append( j ) + x.append( b ) + return x + diff --git a/regtests/bench/float.py b/regtests/bench/float.py index ded3ece..f3869e2 100644 --- a/regtests/bench/float.py +++ b/regtests/bench/float.py @@ -6,8 +6,10 @@ from math import sin, cos, sqrt def main(): - if PYTHON=='PYTHONJS': ## about 25% faster with normal and javascript backends + if PYTHON=='PYTHONJS': pythonjs.configure( direct_operator='+' ) + pythonjs.configure( direct_operator='*' ) + pythonjs.configure( direct_keys=True ) pass times = test( 3 ) diff --git a/regtests/bench/nbody.py b/regtests/bench/nbody.py index 3735526..8f9a843 100644 --- a/regtests/bench/nbody.py +++ b/regtests/bench/nbody.py @@ -9,8 +9,10 @@ def main(): - if PYTHON=='PYTHONJS': - pythonjs.configure( direct_operator='+' ) ## about 25% faster with normal and javascript backends + if PYTHON=='PYTHONJS': + pythonjs.configure( direct_operator='+' ) + pythonjs.configure( direct_operator='*' ) + pythonjs.configure( direct_keys=True ) pass times = test_nbody( 3 ) diff --git a/regtests/bench/new_list.py b/regtests/bench/new_list.py new file mode 100644 index 0000000..316466c --- /dev/null +++ b/regtests/bench/new_list.py @@ -0,0 +1,23 @@ +'''new list micro benchmark''' + +from time import time + +def main(): + if PYTHON=='PYTHONJS': + pythonjs.configure( direct_operator='+' ) + pythonjs.configure( direct_keys=True ) + pass + + times = [] + a = [] + for i in range(10): + t0 = time() + for j in range(100000): + b = [1,2,3,4,5,6,7,8,9] + a.append( b ) + tk = time() + times.append(tk - t0) + avg = sum(times) / len(times) + print(avg) + + diff --git a/regtests/bench/pystone.py b/regtests/bench/pystone.py index dfd4b8a..bea191e 100644 --- a/regtests/bench/pystone.py +++ b/regtests/bench/pystone.py @@ -9,8 +9,9 @@ def main(): LOOPS = 100000 if PYTHON=='PYTHONJS': - pythonjs.configure( direct_operator='+' ) ## about 25% faster with normal and javascript backends - #pythonjs.configure( inline=True ) ## TODO fix dart backend + pythonjs.configure( direct_operator='+' ) + pythonjs.configure( direct_operator='*' ) + pythonjs.configure( direct_keys=True ) pass a = pystones( LOOPS ) benchtime = a[0] @@ -68,10 +69,6 @@ def create_array2glob(n): - - - - def Proc0(loops): global IntGlob global BoolGlob From 83198677f7d4c20c89b5cb182f541187d4e7e22b Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 11 Jun 2014 16:44:36 -0700 Subject: [PATCH 023/222] optimized inplace list assignment `list[n] += v` --- pythonjs/python_to_pythonjs.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index a325378..6a5f95f 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -701,8 +701,21 @@ def visit_AugAssign(self, node): # writer.write(a %(name, slice, op, self.visit(node.value))) #else: op = self.visit(node.op) - a = '__get__(%s, "__setitem__")( [%s, __get__(%s, "__getitem__")([%s], {}) %s (%s)], {} )' - writer.write(a %(name, slice, name, slice, op, self.visit(node.value))) + value = self.visit(node.value) + #a = '__get__(%s, "__setitem__")( [%s, __get__(%s, "__getitem__")([%s], {}) %s (%s)], {} )' + fallback = '__get__(%s, "__setitem__")( [%s, __get__(%s, "__getitem__")([%s], {}) %s (%s)], {} )'%(name, slice, name, slice, op, value) + if isinstance(node.target.value, ast.Name): + ## TODO also check for arr.remote (RPC) if defined then __setitem__ can not be bypassed + + ## the overhead of checking if target is an array, + ## and calling __setitem__ directly bypassing a single __get__, + ## is greather than simply calling the fallback + #writer.write('if instanceof(%s, Array): %s.__setitem__([%s, %s[%s] %s (%s) ], __NULL_OBJECT__)' %(name, name, slice, name,slice, op, value)) + + writer.write('if instanceof(%s, Array): %s[%s] %s= %s' %(name, name,slice, op, value)) + writer.write('else: %s' %fallback) + else: + writer.write(fallback) else: ## TODO extra checks to make sure the operator type is valid in this context From 42b5c7af897052b82b6250aa513ef04cab616ecb Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 11 Jun 2014 17:55:50 -0700 Subject: [PATCH 024/222] optimized get list item --- pythonjs/python_to_pythonjs.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 6a5f95f..ccea84a 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1513,11 +1513,13 @@ def visit_Subscript(self, node): src = src.replace('"', '\\"') err = 'line %s: %s' %(node.lineno, src.strip()) - return '__get__(%s, "__getitem__", "%s")([%s], __NULL_OBJECT__)' % ( - self.visit(node.value), - err, - self.visit(node.slice) - ) + value = self.visit(node.value) + slice = self.visit(node.slice) + fallback = '__get__(%s, "__getitem__", "%s")([%s], __NULL_OBJECT__)' % (value, err, slice) + if not self._with_lua and isinstance(node.value, ast.Name): + return '__ternary_operator__(instanceof(%s, Array), %s[%s], %s)' %(value, value,slice, fallback) + else: + return fallback def visit_Slice(self, node): if self._with_dart: From 72ce21677598a9f8ba6854cb93fb7a1b06c85bf2 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 11 Jun 2014 18:11:39 -0700 Subject: [PATCH 025/222] run regression tests on both old and new pypy --- regtests/list/set_slice.py | 9 ++++++++- regtests/run.py | 19 +++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/regtests/list/set_slice.py b/regtests/list/set_slice.py index ce6fa4f..c09c62d 100644 --- a/regtests/list/set_slice.py +++ b/regtests/list/set_slice.py @@ -32,4 +32,11 @@ def main(): b[ :2 ] = 'ABC' TestError( len(b)==4 ) - TestError( b[0]=='A' ) \ No newline at end of file + TestError( b[0]=='A' ) + + d = list(range(10)) + d[ 2:4 ] = [99, 100] + TestError( d[0]==0 ) + TestError( d[1]==1 ) + TestError( d[2]==99 ) + TestError( d[3]==100 ) diff --git a/regtests/run.py b/regtests/run.py index 3a58861..bbf6090 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -118,9 +118,14 @@ def run_pypy_test_on(filename): write("%s.py" % tmpname, patch_python(filename, python='PYPY')) return run_command("%s %s.py %s" % (pypy_exe, tmpname, display_errors)) +def run_old_pypy_test_on(filename): + """PyPy 1.9""" + write("%s.py" % tmpname, patch_python(filename, python='PYPY')) + return run_command("%s %s.py %s" % (old_pypy_exe, tmpname, display_errors)) + -pypy_runnable = False -pypy_exe = None +old_pypy_runnable = pypy_runnable = False +old_pypy_exe = pypy_exe = None if os.path.isfile( os.path.expanduser('~/pypy-2.3.1-linux64/bin/pypy') ): pypy_runnable = True pypy_exe = os.path.expanduser('~/pypy-2.3.1-linux64/bin/pypy') @@ -133,6 +138,10 @@ def run_pypy_test_on(filename): pypy_runnable = True pypy_exe = 'pypy' +if os.path.isfile( os.path.expanduser('~/pypy-1.9/bin/pypy') ): + old_pypy_runnable = True + old_pypy_exe = os.path.expanduser('~/pypy-1.9/bin/pypy') + ## rhino is not run by default because it simply freezes up on maximum callstack errors @@ -704,6 +713,8 @@ def display(function): display(run_python3_test_on) if pypy_runnable: display(run_pypy_test_on) + if old_pypy_runnable: + display(run_old_pypy_test_on) global js js = translate_js( @@ -763,6 +774,10 @@ def run(): headers = ["Py-\nthon2", "Py-\nthon3"] if pypy_runnable: headers.append("PyPy\n") + + if old_pypy_runnable: + headers.append("PyPy\n1.9") + if rhino_runnable: headers.append("JS\nRhino") if node_runnable: From 8073bd21b868888a12355cc8b7ce39231b427152 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 12 Jun 2014 18:03:29 -0700 Subject: [PATCH 026/222] dart backend: fixed multi-assignment `x=y=z=1` and run tests in dart VM. --- pythonjs/ast_utils.py | 24 +++++++++++++++++++----- regtests/run.py | 24 ++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/pythonjs/ast_utils.py b/pythonjs/ast_utils.py index 7fa2b79..801aca7 100644 --- a/pythonjs/ast_utils.py +++ b/pythonjs/ast_utils.py @@ -25,11 +25,25 @@ def retrieve_vars(body): local_vars = set() global_vars = set() for n in body: - if isinstance(n, ast.Assign) and isinstance(n.targets[0], ast.Name): ## assignment to local - TODO support `a=b=c` - local_vars.add( n.targets[0].id ) - elif isinstance(n, ast.Assign) and isinstance(n.targets[0], ast.Tuple): - for c in n.targets[0].elts: - local_vars.add( c.id ) + #if isinstance(n, ast.Assign) and isinstance(n.targets[0], ast.Name): ## assignment to local - TODO support `a=b=c` + # local_vars.add( n.targets[0].id ) + #elif isinstance(n, ast.Assign) and isinstance(n.targets[0], ast.Tuple): + # for c in n.targets[0].elts: + # local_vars.add( c.id ) + if isinstance(n, ast.Assign): + for u in n.targets: + if isinstance(u, ast.Name): + local_vars.add( u.id ) + elif isinstance(u, ast.Tuple): + for uu in u.elts: + if isinstance(uu, ast.Name): + local_vars.add( uu.id ) + else: + raise NotImplementedError(uu) + else: + #raise NotImplementedError(u) + pass ## skips assignment to an attribute `a.x = y` + elif isinstance(n, ast.Global): global_vars.update( n.names ) elif hasattr(n, 'body') and not isinstance(n, ast.FunctionDef): diff --git a/regtests/run.py b/regtests/run.py index bbf6090..ec46e7a 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -170,8 +170,11 @@ def run_old_pypy_test_on(filename): #dart2js = os.path.expanduser( '~/dart-sdk-1.0/dart-sdk/bin/dart2js') ## TODO support dart-sdk-1.3+ dart2js = os.path.expanduser( '~/dart-sdk/bin/dart2js') # tested with dart 1.3 - dart2js_runnable = runnable( dart2js + ' -h' ) + +dart_exe = os.path.expanduser( '~/dart-sdk/bin/dart') +dart_runnable = os.path.isfile( dart_exe ) + coffee_runnable = runnable( "coffee -v" ) and '--all-backends' in sys.argv lua_runnable = runnable( "lua -v" ) and '--all-backends' in sys.argv luajit_runnable = runnable( "luajit -v" ) @@ -625,7 +628,7 @@ def run_js_nodewebkit(content): def run_pythonjs_dart_test_on_node(dummy_filename): - """PythonJS (Dart backend)""" + """PythonJS (Dart backend - dart2js)""" return run_if_no_error(run_dart2js_node) def run_dart2js_node(content): @@ -633,6 +636,16 @@ def run_dart2js_node(content): write("%s.js" % tmpname, content) return run_command("node %s.js" % tmpname) +def run_pythonjs_dart_test_on_dart(dummy_filename): + """PythonJS (Dart backend - Dart VM)""" + return run_if_no_error(run_dart) + +def run_dart(content): + """Run Dart2js using Node""" + #write("%s.js" % tmpname, content) + return run_command("%s %s" % (dart_exe, "/tmp/dart2js-input.dart")) + + def run_pythonjs_coffee_test_on_node(dummy_filename): """PythonJS (CoffeeScript)""" return run_if_no_error(run_coffee_node) @@ -744,6 +757,10 @@ def display(function): if 'requirejs' not in filename: + if dart_runnable: + js = translate_js(filename, javascript=False, dart=True) + display(run_pythonjs_dart_test_on_dart) + if dart2js_runnable and node_runnable: js = translate_js(filename, javascript=False, dart=True) display(run_pythonjs_dart_test_on_node) @@ -795,6 +812,9 @@ def run(): if nodewebkit_runnable: headers.append("JSJS\nWebkit") + if dart_runnable: + headers.append("Dart\nDart") + if node_runnable: if dart2js_runnable: From 1cf30a16de3311cd2a1453a89e2b54e6eadebb7f Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 12 Jun 2014 18:13:01 -0700 Subject: [PATCH 027/222] fixed typed int used in while or if `while i Date: Thu, 12 Jun 2014 20:37:05 -0700 Subject: [PATCH 028/222] pass typedef information to dart. --- pythonjs/ast_utils.py | 23 ++++++++++-- pythonjs/python_to_pythonjs.py | 67 +++++++++++++++++++++++----------- pythonjs/pythonjs.py | 14 ++++--- pythonjs/pythonjs_to_dart.py | 29 +++++++++++++++ pythonjs/pythonjs_to_lua.py | 2 + 5 files changed, 104 insertions(+), 31 deletions(-) diff --git a/pythonjs/ast_utils.py b/pythonjs/ast_utils.py index 801aca7..1e0dea6 100644 --- a/pythonjs/ast_utils.py +++ b/pythonjs/ast_utils.py @@ -1,4 +1,5 @@ import ast +import typedpython class CollectNames(ast.NodeVisitor): _names_ = [] @@ -31,9 +32,22 @@ def retrieve_vars(body): # for c in n.targets[0].elts: # local_vars.add( c.id ) if isinstance(n, ast.Assign): - for u in n.targets: + user_typedef = None + #targets = list(n.targets) + #targets.reverse() + for i,u in enumerate(n.targets): if isinstance(u, ast.Name): - local_vars.add( u.id ) + if i==0: + if u.id in typedpython.types: + user_typedef = u.id + else: + local_vars.add( u.id ) + elif user_typedef: + local_vars.add( '%s=%s' %(user_typedef, u.id) ) + user_typedef = None + else: + local_vars.add( u.id ) + elif isinstance(u, ast.Tuple): for uu in u.elts: if isinstance(uu, ast.Name): @@ -41,9 +55,12 @@ def retrieve_vars(body): else: raise NotImplementedError(uu) else: - #raise NotImplementedError(u) pass ## skips assignment to an attribute `a.x = y` + if user_typedef: ## `int x` + assert isinstance(n.value, ast.Name) + local_vars.add( '%s=%s' %(user_typedef, n.value.id)) + elif isinstance(n, ast.Global): global_vars.update( n.names ) elif hasattr(n, 'body') and not isinstance(n, ast.FunctionDef): diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 495af6b..d61c268 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -38,11 +38,6 @@ def log(txt): POWER_OF_TWO = [ 2**i for i in range(32) ] -GLOBAL_VARIABLE_SCOPE = False ## Python style -if '--global-variable-scope' in sys.argv: ## JavaScript style - GLOBAL_VARIABLE_SCOPE = True - log('not using python style variable scope') - writer = writer_main = code_writer.Writer() __webworker_writers = dict() @@ -679,9 +674,13 @@ def visit_AugAssign(self, node): raise NotImplementedError b = '%s %s %s' %(target, op, self.visit(node.value)) - ## dart2js is smart enough to optimize this if/else away ## - writer.write('if instanceof(%s, Number) or instanceof(%s, String): %s' %(target,target,b) ) - writer.write('else: %s' %a) + if isinstance( node.target, ast.Name ) and node.target.id in self._typedef_vars and self._typedef_vars[node.target.id] in typedpython.native_number_types: + writer.write(b) + + else: + ## dart2js is smart enough to optimize this if/else away ## + writer.write('if instanceof(%s, Number) or instanceof(%s, String): %s' %(target,target,b) ) + writer.write('else: %s' %a) elif self._with_js: ## no operator overloading in with-js mode a = '%s %s %s' %(target, op, self.visit(node.value)) @@ -2063,6 +2062,8 @@ def visit_Call(self, node): if args: if node.starargs: a = ( method, ctx, ','.join(args), self.visit(node.starargs), ','.join(kwargs) ) + ## note: this depends on the fact that [].extend in PythonJS returns self (this), + ## which is different from regular python where list.extend returns None return '%s.apply( %s, [].extend([%s]).extend(%s).append({%s}) )' %a else: return '%s(%s, {%s})' %( method, ','.join(args), ','.join(kwargs) ) @@ -2490,6 +2491,36 @@ def visit_FunctionDef(self, node): writer.write('self.onmessage = onmessage' ) + ## force python variable scope, and pass user type information to second stage of translation. + ## the dart backend can use this extra type information. + vars = [] + local_typedefs = [] + if not self._with_coffee: + local_vars, global_vars = retrieve_vars(node.body) + local_vars = local_vars-global_vars + if local_vars: + args_typedefs = [] + args = [ a.id for a in node.args.args ] + + for v in local_vars: + usertype = None + if '=' in v: + t,n = v.split('=') ## unpack type and name + v = '%s=%s' %(n,t) ## reverse + if t == 'long': + writer.write('''inline("if (__NODEJS__==true) var long = require('long')")''') ## this is ugly + + if n in args: + args_typedefs.append( v ) + else: + local_typedefs.append( v ) + elif v in args: pass + else: vars.append( v ) + + if args_typedefs: + writer.write('@__typedef__(%s)' %','.join(args_typedefs)) + + if self._with_dart: ## dart supports optional positional params [x=1, y=2], or optional named {x:1, y:2} ## but not both at the same time. @@ -2547,22 +2578,14 @@ def visit_FunctionDef(self, node): writer.write('def %s(args, kwargs):' % node.name) writer.push() - ## the user will almost always want to use Python-style variable scope, - ## this is kept here as an option to be sure we are compatible with the - ## old-style code in runtime/pythonpythonjs.py and runtime/builtins.py - if not GLOBAL_VARIABLE_SCOPE and not self._with_coffee: - local_vars, global_vars = retrieve_vars(node.body) - if local_vars-global_vars: - vars = [] - args = [ a.id for a in node.args.args ] - for v in local_vars-global_vars: - if v in args: pass - elif v == 'long': writer.write('''inline("if (__NODEJS__==true) var long = require('long')")''') ## this is ugly - else: vars.append( v ) - a = ','.join( vars ) - writer.write('var(%s)' %a) + ## write local typedefs and var scope ## + a = ','.join( vars ) + if local_typedefs: + if a: a += ',' + a += ','.join(local_typedefs) + writer.write('var(%s)' %a) ##################################################################### if self._with_dart: diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 5f3899e..41060d6 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -173,10 +173,10 @@ def visit_FunctionDef(self, node): def _visit_function(self, node): args = self.visit(node.args) - if len(node.decorator_list): - assert len(node.decorator_list)==1 + if len(node.decorator_list)==1 and not ( isinstance(node.decorator_list[0], ast.Call) and node.decorator_list[0].func.id == '__typedef__' ): dec = self.visit(node.decorator_list[0]) buffer = self.indent() + '%s.%s = function(%s) {\n' % (dec,node.name, ', '.join(args)) + elif len(self._function_stack) == 1: ## this style will not make function global to the eval context in NodeJS ## #buffer = self.indent() + 'function %s(%s) {\n' % (node.name, ', '.join(args)) @@ -398,12 +398,14 @@ def _visit_call_helper_var(self, node): for arg in rem: args.remove( arg ) + out = [] + if args: - out = ', '.join(args) - return 'var %s' % out - else: - return '' + out.append( 'var ' + ','.join(args) ) + if node.keywords: + out.append( 'var ' + ','.join([key.value.id for key in node.keywords]) ) + return ';'.join(out) def _inline_code_helper(self, s): s = s.replace('\n', '\\n').replace('\0', '\\0') ## AttributeError: 'BinOp' object has no attribute 's' - this is caused by bad quotes diff --git a/pythonjs/pythonjs_to_dart.py b/pythonjs/pythonjs_to_dart.py index cfd9aef..7903be5 100644 --- a/pythonjs/pythonjs_to_dart.py +++ b/pythonjs/pythonjs_to_dart.py @@ -355,11 +355,15 @@ def visit_Assign(self, node): def _visit_function(self, node): getter = False setter = False + args_typedefs = {} for decor in node.decorator_list: if isinstance(decor, ast.Name) and decor.id == 'property': getter = True elif isinstance(decor, ast.Attribute) and isinstance(decor.value, ast.Name) and decor.attr == 'setter': setter = True + elif isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == '__typedef__': + for key in decor.keywords: + args_typedefs[ key.arg ] = key.value.id else: raise SyntaxError @@ -370,6 +374,8 @@ def _visit_function(self, node): varargs_name = None for i, arg in enumerate(node.args.args): a = arg.id + if a in args_typedefs: + a = '%s %s' %(args_typedefs[a], a) dindex = i - offset if a.startswith('__variable_args__'): varargs_name = a.split('__')[-1] @@ -446,6 +452,29 @@ def _visit_call_helper(self, node): else: return '%s(%s)' % (func, args) + def _visit_call_helper_var(self, node): + args = [ self.visit(a) for a in node.args ] + if self._function_stack: + fnode = self._function_stack[-1] + rem = [] + for arg in args: + if arg in fnode._local_vars: + rem.append( arg ) + else: + fnode._local_vars.add( arg ) + for arg in rem: + args.remove( arg ) + + out = [] + + if args: + out.append( 'var ' + ','.join(args) ) + if node.keywords: + for key in node.keywords: + out.append( '%s %s' %(key.arg, key.value.id) ) + + return ';'.join(out) + def _visit_call_helper_list(self, node): name = self.visit(node.func) if node.args: diff --git a/pythonjs/pythonjs_to_lua.py b/pythonjs/pythonjs_to_lua.py index 8342863..5a0e7cf 100644 --- a/pythonjs/pythonjs_to_lua.py +++ b/pythonjs/pythonjs_to_lua.py @@ -241,6 +241,8 @@ def _visit_function(self, node): setter = True elif isinstance(decor, ast.Attribute) and isinstance(decor.value, ast.Name) and decor.attr == 'prototype': klass = self.visit(decor) + elif isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == '__typedef__': + pass else: raise SyntaxError(decor) From 95fae01321ea9f1cd791140078a643054decc325 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 12 Jun 2014 21:59:36 -0700 Subject: [PATCH 029/222] dart backend: fixed passing type info and started on prototype for SIMD support. --- pythonjs/ast_utils.py | 6 ++++++ pythonjs/python_to_pythonjs.py | 6 +++++- pythonjs/pythonjs.py | 2 +- pythonjs/pythonjs_to_dart.py | 2 +- pythonjs/runtime/dart_builtins.py | 1 + pythonjs/typedpython.py | 3 +++ 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/pythonjs/ast_utils.py b/pythonjs/ast_utils.py index 1e0dea6..1d4ff2a 100644 --- a/pythonjs/ast_utils.py +++ b/pythonjs/ast_utils.py @@ -46,6 +46,12 @@ def retrieve_vars(body): local_vars.add( '%s=%s' %(user_typedef, u.id) ) user_typedef = None else: + #add = True ## TODO this should work?! + #for x in local_vars: + # if u.id == x or ('=' in x and x.split('=')[-1] == u.id): + # add = False + # break + #if add: local_vars.add( u.id ) elif isinstance(u, ast.Tuple): diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index d61c268..68f4e2a 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2495,6 +2495,7 @@ def visit_FunctionDef(self, node): ## the dart backend can use this extra type information. vars = [] local_typedefs = [] + local_typedef_names = set() if not self._with_coffee: local_vars, global_vars = retrieve_vars(node.body) local_vars = local_vars-global_vars @@ -2506,7 +2507,10 @@ def visit_FunctionDef(self, node): usertype = None if '=' in v: t,n = v.split('=') ## unpack type and name + if self._with_dart and t in typedpython.simd_types: + t = t[0].upper() + t[1:] v = '%s=%s' %(n,t) ## reverse + local_typedef_names.add( n ) if t == 'long': writer.write('''inline("if (__NODEJS__==true) var long = require('long')")''') ## this is ugly @@ -2514,7 +2518,7 @@ def visit_FunctionDef(self, node): args_typedefs.append( v ) else: local_typedefs.append( v ) - elif v in args: pass + elif v in args or v in local_typedef_names: pass else: vars.append( v ) if args_typedefs: diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 41060d6..94cb3ef 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -403,7 +403,7 @@ def _visit_call_helper_var(self, node): if args: out.append( 'var ' + ','.join(args) ) if node.keywords: - out.append( 'var ' + ','.join([key.value.id for key in node.keywords]) ) + out.append( 'var ' + ','.join([key.arg for key in node.keywords]) ) return ';'.join(out) diff --git a/pythonjs/pythonjs_to_dart.py b/pythonjs/pythonjs_to_dart.py index 7903be5..e703e86 100644 --- a/pythonjs/pythonjs_to_dart.py +++ b/pythonjs/pythonjs_to_dart.py @@ -471,7 +471,7 @@ def _visit_call_helper_var(self, node): out.append( 'var ' + ','.join(args) ) if node.keywords: for key in node.keywords: - out.append( '%s %s' %(key.arg, key.value.id) ) + out.append( '%s %s' %(key.value.id, key.arg) ) return ';'.join(out) diff --git a/pythonjs/runtime/dart_builtins.py b/pythonjs/runtime/dart_builtins.py index 670eeb1..2748f7a 100644 --- a/pythonjs/runtime/dart_builtins.py +++ b/pythonjs/runtime/dart_builtins.py @@ -3,6 +3,7 @@ # License: "New BSD" dart_import('dart:collection') +dart_import('dart:typed_data') dart_import('dart:math', 'Math') #@dart.extends diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index ec96a30..b4cba0c 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -1,10 +1,13 @@ whitespace = [' ', '\t'] native_number_types = ['int', 'float', 'double'] ## float and double are the same +simd_types = ['float32x4', 'int32x4'] +vector_types = simd_types ## TODO support non-simd vec types like vec3f? number_types = ['long'] ## requires https://github.com/dcodeIO/Long.js number_types.extend( native_number_types ) types = ['str', 'list', 'dict'] types.extend( number_types) +types.extend( vector_types ) def transform_source( source, strip=False ): From c08bda9aef6ac3e67c872c53a40ca53dd258be4a Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 12 Jun 2014 22:53:03 -0700 Subject: [PATCH 030/222] working prototype of SIMD float32x4 using dart backend. --- pythonjs/python_to_pythonjs.py | 12 +++++++++++- pythonjs/pythonjs.py | 5 +++++ pythonjs/pythonjs_to_dart.py | 13 +++++++++++++ regtests/typed/float32x4.py | 21 +++++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 regtests/typed/float32x4.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 68f4e2a..5c7a695 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -343,6 +343,8 @@ def visit_Import(self, node): pass ## pythonjs/fakelibs/sys.py elif alias.name == 'subprocess': pass ## pythonjs/fakelibs/subprocess.py + elif alias.name == 'numpy': + pass elif alias.name == 'json' or alias.name == 'os': pass ## part of builtins.py @@ -1911,7 +1913,15 @@ def visit_Call(self, node): return '__js_typed_array(%s)' %','.join(args) ######################################### - if isinstance(node.func, ast.Attribute) and isinstance(node.func.value, Name) and node.func.value.id == 'pythonjs' and node.func.attr == 'configure': + if isinstance(node.func, ast.Attribute) and isinstance(node.func.value, Name) and node.func.value.id == 'numpy' and node.func.attr == 'array': + args = [self.visit(arg) for arg in node.args] + if node.keywords: + kwargs = [ '%s=%s' %(x.arg, self.visit(x.value)) for x in node.keywords] + return 'numpy.array(%s, %s)' %( ','.join(args), ','.join(kwargs) ) + else: + return 'numpy.array(%s)' %','.join(args) + + elif isinstance(node.func, ast.Attribute) and isinstance(node.func.value, Name) and node.func.value.id == 'pythonjs' and node.func.attr == 'configure': for kw in node.keywords: if kw.arg == 'javascript': if kw.value.id == 'True': diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 94cb3ef..f6f446c 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -297,6 +297,9 @@ def visit_Call(self, node): else: raise SyntaxError( args ) + elif name == 'numpy.array': + return self._visit_call_helper_numpy_array(node) + elif name == 'JSObject': return self._visit_call_helper_JSObject( node ) @@ -345,6 +348,8 @@ def inline_helper_remap_names(self, remap): def inline_helper_return_id(self, return_id): return "var __returns__%s = null;"%return_id + def _visit_call_helper_numpy_array(self, node): + return self.visit(node.args[0]) ## TODO typed arrays def _visit_call_helper_list(self, node): name = self.visit(node.func) diff --git a/pythonjs/pythonjs_to_dart.py b/pythonjs/pythonjs_to_dart.py index e703e86..bd590b1 100644 --- a/pythonjs/pythonjs_to_dart.py +++ b/pythonjs/pythonjs_to_dart.py @@ -485,6 +485,19 @@ def _visit_call_helper_list(self, node): return '%s(%s)' % (name, args) + def _visit_call_helper_numpy_array(self, node): + simd = { + 'float32': 'Float32x4' + } + args = ','.join( [self.visit(a) for a in node.args[0].elts] ) + if node.keywords: + for key in node.keywords: + if key.arg == 'dtype': + if isinstance(key.value, ast.Attribute) and key.value.attr in simd: + return 'new %s(%s)' %(simd[key.value.attr] ,args) + return '[%s]' %args ## TODO + + def _visit_call_helper_instanceof(self, node): args = map(self.visit, node.args) if len(args) == 2: diff --git a/regtests/typed/float32x4.py b/regtests/typed/float32x4.py new file mode 100644 index 0000000..b77cd97 --- /dev/null +++ b/regtests/typed/float32x4.py @@ -0,0 +1,21 @@ +"""simd float32x4""" +import numpy + +def main(): + float32x4 a = numpy.array( [1.1, 1.2, 1.3, 0.4], dtype=numpy.float32 ) + float32x4 b = numpy.array( [1.9, 1.8, 1.7, 0.6], dtype=numpy.float32 ) + + c = a + b + print(c) + + if PYTHON == 'PYTHONJS': + TestError( c.x==3.0 ) + TestError( c.y==3.0 ) + TestError( c.z==3.0 ) + TestError( c.w==1.0 ) + + else: + TestError( c[0]==3.0 ) + TestError( c[1]==3.0 ) + TestError( c[2]==3.0 ) + TestError( c[3]==1.0 ) From d95187b82aadcc6704c913d988c9aaecdd73f3fb Mon Sep 17 00:00:00 2001 From: hartsantler Date: Fri, 13 Jun 2014 00:08:50 -0700 Subject: [PATCH 031/222] fixes to SIMD and new benchmark testing float32x4. --- pythonjs/python_to_pythonjs.py | 2 +- pythonjs/pythonjs.py | 1 + regtests/bench/simd_float32x4.py | 15 +++++++++++++++ regtests/run.py | 5 +++++ regtests/typed/float32x4.py | 1 - 5 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 regtests/bench/simd_float32x4.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 5c7a695..ef4c1e7 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -676,7 +676,7 @@ def visit_AugAssign(self, node): raise NotImplementedError b = '%s %s %s' %(target, op, self.visit(node.value)) - if isinstance( node.target, ast.Name ) and node.target.id in self._typedef_vars and self._typedef_vars[node.target.id] in typedpython.native_number_types: + if isinstance( node.target, ast.Name ) and node.target.id in self._typedef_vars and self._typedef_vars[node.target.id] in typedpython.native_number_types+typedpython.vector_types: writer.write(b) else: diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index f6f446c..a75c2c7 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -349,6 +349,7 @@ def inline_helper_return_id(self, return_id): return "var __returns__%s = null;"%return_id def _visit_call_helper_numpy_array(self, node): + raise NotImplementedError('TODO numpy.array') return self.visit(node.args[0]) ## TODO typed arrays def _visit_call_helper_list(self, node): diff --git a/regtests/bench/simd_float32x4.py b/regtests/bench/simd_float32x4.py new file mode 100644 index 0000000..940f022 --- /dev/null +++ b/regtests/bench/simd_float32x4.py @@ -0,0 +1,15 @@ +"""simd float32x4 micro benchmark""" +from time import time + +def main(): + start = time() + float32x4 a = numpy.array( [1.0001, 1.0002, 1.0003, 1.0004], dtype=numpy.float32 ) + float32x4 b = numpy.array( [1.00009, 1.00008, 1.00007, 1.00006], dtype=numpy.float32 ) + float32x4 c = numpy.array( [1.00005, 1.00004, 1.00003, 1.00002], dtype=numpy.float32 ) + + arr = [] + for i in range(20000): + c *= a*b + arr.append( a*b*c ) + + print(time()-start) \ No newline at end of file diff --git a/regtests/run.py b/regtests/run.py index ec46e7a..94891d3 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -348,6 +348,11 @@ def __call__(self, name): return lambda f: f webworker = webworker() +try: + import numpy +except: + import numpypy as numpy + """ def patch_python(filename, dart=False, python='PYTHONJS', backend=None): diff --git a/regtests/typed/float32x4.py b/regtests/typed/float32x4.py index b77cd97..75c3e26 100644 --- a/regtests/typed/float32x4.py +++ b/regtests/typed/float32x4.py @@ -1,5 +1,4 @@ """simd float32x4""" -import numpy def main(): float32x4 a = numpy.array( [1.1, 1.2, 1.3, 0.4], dtype=numpy.float32 ) From 8f2b19a6ee7b71b3d933500b76f9b7a7ff637cc5 Mon Sep 17 00:00:00 2001 From: Ben Wiklund Date: Fri, 13 Jun 2014 15:57:52 -0700 Subject: [PATCH 032/222] fixed readme link not sure if this is what was intended --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 45742b5..3861c97 100644 --- a/README.md +++ b/README.md @@ -61,10 +61,7 @@ N-Body benchmark ![nbody](http://2.bp.blogspot.com/-pylzspKRu6M/UqbAv3qIGTI/AAAAAAAAAkE/NnsAM5DZ_8M/s400/nbody.png) -more benchmarks - -[http://pythonjs.blogspot.com/2014/05/pythonjs-now-faster-than-cpython.html](pystone, nbody, richards) - +[More benchmarks](http://pythonjs.blogspot.com/2014/05/pythonjs-now-faster-than-cpython.html) translator.py ------------ From 3f1636d3875ac7f69507dd2ae7bf3ee50c7d1b43 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Fri, 13 Jun 2014 21:08:26 -0700 Subject: [PATCH 033/222] dart backend: new SIMD float32vec that allows for any size vector (divisible by 4) --- pythonjs/ministdlib.py | 9 ++-- pythonjs/pythonjs_to_dart.py | 20 +++++++-- pythonjs/runtime/dart_builtins.py | 69 +++++++++++++++++++++++++++++++ pythonjs/typedpython.py | 3 +- regtests/bench/simd_float32vec.py | 30 ++++++++++++++ regtests/run.py | 10 ++--- regtests/typed/float32vec.py | 21 ++++++++++ 7 files changed, 150 insertions(+), 12 deletions(-) create mode 100644 regtests/bench/simd_float32vec.py create mode 100644 regtests/typed/float32vec.py diff --git a/pythonjs/ministdlib.py b/pythonjs/ministdlib.py index 5bca93e..e9a83d6 100644 --- a/pythonjs/ministdlib.py +++ b/pythonjs/ministdlib.py @@ -26,9 +26,12 @@ 'clock' : 'clock() { return new DateTime.now().millisecondsSinceEpoch / 1000.0; }' }, 'math': { - 'sin' : 'sin = math.sin', - 'cos' : 'cos = math.cos', - 'sqrt' : 'sqrt = math.sqrt', + 'sin' : 'var sin = math.sin', + 'cos' : 'var cos = math.cos', + 'sqrt' : 'var sqrt = math.sqrt', + }, + 'random' : { + 'random' : 'var random = __random__' } } diff --git a/pythonjs/pythonjs_to_dart.py b/pythonjs/pythonjs_to_dart.py index bd590b1..2082b1e 100644 --- a/pythonjs/pythonjs_to_dart.py +++ b/pythonjs/pythonjs_to_dart.py @@ -489,13 +489,27 @@ def _visit_call_helper_numpy_array(self, node): simd = { 'float32': 'Float32x4' } - args = ','.join( [self.visit(a) for a in node.args[0].elts] ) + arg_name = args = None + direct = False + if isinstance(node.args[0], ast.Name): + arg_name = node.args[0].id + else: + args = ','.join( [self.visit(a) for a in node.args[0].elts] ) + if len(node.args[0].elts) == 4: ## simple rule: if there are 4 items, its a direct SIMD type + direct = True + if node.keywords: for key in node.keywords: if key.arg == 'dtype': if isinstance(key.value, ast.Attribute) and key.value.attr in simd: - return 'new %s(%s)' %(simd[key.value.attr] ,args) - return '[%s]' %args ## TODO + if arg_name: + return 'new float32vec( %s )' %arg_name + elif direct: + return 'new %s(%s)' %(simd[key.value.attr] ,args) + else: + return 'new float32vec( [%s] )' %args + else: + raise NotImplementedError('numpy.array requires dtype is given') def _visit_call_helper_instanceof(self, node): diff --git a/pythonjs/runtime/dart_builtins.py b/pythonjs/runtime/dart_builtins.py index 2748f7a..bed45d7 100644 --- a/pythonjs/runtime/dart_builtins.py +++ b/pythonjs/runtime/dart_builtins.py @@ -6,6 +6,75 @@ dart_import('dart:typed_data') dart_import('dart:math', 'Math') +__random_gen__ = new(Math.Random()) +def __random__(): return __random_gen__.nextDouble() + + +class float32vec: + def __init__(self, items): + self[...] = new( List() ) + self.length = items.length + + #vec = new( Float32x4.zero() ) + #self[...].add( vec ) + + i = 0; s = 0 + while i < items.length: + x = items[i] + y = items[i+1] + z = items[i+2] + w = items[i+3] + vec = new( Float32x4(x,y,z,w) ) + self[...].add( vec ) + i += 4 + + + def __getitem__(self, index): + if index < 0: index = self.length + index + + float32x4 vec = self[...][ index // 4 ] + lane = index % 4 + if lane == 0: return vec.x + elif lane == 1: return vec.y + elif lane == 2: return vec.z + elif lane == 3: return vec.w + + def __setitem__(self, index, value): + if index < 0: index = self.length + index + + #float32x4 vec = self[...][ index // 4 ] + vec = self[...][ index // 4 ] + lane = index % 4 + if lane == 0: vec = vec.withX(value) + elif lane == 1: vec = vec.withY(value) + elif lane == 2: vec = vec.withZ(value) + elif lane == 3: vec = vec.withW(value) + + self[...][ index // 4 ] = vec + + def __add__(self, other): + arr = new( List() ) + for i, vec1 in enumerate( self[...] ): + vec2 = other[...][ i ] + arr.add( vec1+vec2 ) + + v = inline("new float32vec([])") + v.length = self.length + v[...] = arr + return v + + def __mul__(self, other): + arr = new( List() ) + for i, vec1 in enumerate( self[...] ): + vec2 = other[...][ i ] + arr.add( vec1*vec2 ) + + v = inline("new float32vec([])") + v.length = self.length + v[...] = arr + return v + + #@dart.extends #class list( ListBase ): class list: diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index b4cba0c..95f48af 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -1,7 +1,8 @@ whitespace = [' ', '\t'] native_number_types = ['int', 'float', 'double'] ## float and double are the same simd_types = ['float32x4', 'int32x4'] -vector_types = simd_types ## TODO support non-simd vec types like vec3f? +vector_types = ['float32vec'] +vector_types.extend( simd_types ) number_types = ['long'] ## requires https://github.com/dcodeIO/Long.js number_types.extend( native_number_types ) diff --git a/regtests/bench/simd_float32vec.py b/regtests/bench/simd_float32vec.py new file mode 100644 index 0000000..60b77ac --- /dev/null +++ b/regtests/bench/simd_float32vec.py @@ -0,0 +1,30 @@ +"""simd float32vec micro benchmark""" +from time import time +from random import random + +## SIMD in dart broken down into multiple float32x4 instances, with multiply implemented by looping +## over each element is slower than CPython with NumPy for an array larger than 32 elements. +## 64 elements runs about half the speed of NumPy in CPython. + +def main(): + ARRAY_SIZE = 32 ## note, size must be divisible by 4 + x = [] + y = [] + z = [] + for i in range( ARRAY_SIZE ): + x.append( random()+0.5 ) + y.append( random()+0.5 ) + z.append( random()+0.5 ) + + a = numpy.array( x, dtype=numpy.float32 ) + b = numpy.array( y, dtype=numpy.float32 ) + c = numpy.array( z, dtype=numpy.float32 ) + + ## start benchmark + start = time() + + arr = [] + for i in range(20000): + arr.append( a*b*c ) + + print(time()-start) \ No newline at end of file diff --git a/regtests/run.py b/regtests/run.py index 94891d3..c4269a4 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -170,17 +170,17 @@ def run_old_pypy_test_on(filename): #dart2js = os.path.expanduser( '~/dart-sdk-1.0/dart-sdk/bin/dart2js') ## TODO support dart-sdk-1.3+ dart2js = os.path.expanduser( '~/dart-sdk/bin/dart2js') # tested with dart 1.3 -dart2js_runnable = runnable( dart2js + ' -h' ) +dart2js_runnable = runnable( dart2js + ' -h' ) and '--dart2js' in sys.argv dart_exe = os.path.expanduser( '~/dart-sdk/bin/dart') dart_runnable = os.path.isfile( dart_exe ) -coffee_runnable = runnable( "coffee -v" ) and '--all-backends' in sys.argv -lua_runnable = runnable( "lua -v" ) and '--all-backends' in sys.argv -luajit_runnable = runnable( "luajit -v" ) +coffee_runnable = runnable( "coffee -v" ) and '--coffee' in sys.argv +lua_runnable = runnable( "lua -v" ) and '--lua' in sys.argv +luajit_runnable = runnable( "luajit -v" ) and '--luajit' in sys.argv lua2js = os.path.abspath( '../external/lua.js/lua2js' ) -luajs_runnable = os.path.isfile( lua2js ) and '--all-backends' in sys.argv +luajs_runnable = os.path.isfile( lua2js ) and '--lua2js' in sys.argv assert rhino_runnable or node_runnable diff --git a/regtests/typed/float32vec.py b/regtests/typed/float32vec.py new file mode 100644 index 0000000..77524d3 --- /dev/null +++ b/regtests/typed/float32vec.py @@ -0,0 +1,21 @@ +"""simd float32vec""" + +def get_data(): + return [1.9, 1.8, 1.7, 0.6, 0.99,0.88,0.77,0.66] +def main(): + ## the translator knows this is a float32vec because there are more than 4 elements + x = y = z = w = 22/7 + a = numpy.array( [1.1, 1.2, 1.3, 0.4, x,y,z,w], dtype=numpy.float32 ) + + ## in this case the translator is not sure what the length of `u` is, so it defaults + ## to using a float32vec. + u = get_data() + b = numpy.array( u, dtype=numpy.float32 ) + + c = a + b + print(c) + + TestError( c[0]==3.0 ) + TestError( c[1]==3.0 ) + TestError( c[2]==3.0 ) + TestError( c[3]==1.0 ) From 0fd70108669d670c9d1e70aa0f11863d062919cd Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 14 Jun 2014 05:07:20 -0700 Subject: [PATCH 034/222] prototype GLSL backend using WebCLGL: https://github.com/3DRoberto/webclgl --- pythonjs/code_writer.py | 4 ++ pythonjs/python_to_pythonjs.py | 38 +++++++++++++++--- pythonjs/pythonjs.py | 64 ++++++++++++++++++++++++++++++- pythonjs/runtime/dart_builtins.py | 4 -- pythonjs/typedpython.py | 27 ++++++++++--- regtests/run.py | 7 ++++ regtests/webclgl/hello_gpu.py | 14 +++++++ 7 files changed, 142 insertions(+), 16 deletions(-) create mode 100644 regtests/webclgl/hello_gpu.py diff --git a/pythonjs/code_writer.py b/pythonjs/code_writer.py index c459839..9fa4a6f 100644 --- a/pythonjs/code_writer.py +++ b/pythonjs/code_writer.py @@ -9,6 +9,8 @@ class Writer(object): def __init__(self): + self.inline_glsl = False + self.inline_skip = ('@', 'def ', 'while ', 'if ', 'for ', 'var(') self.level = 0 self.buffer = list() self.output = StringIO() @@ -34,6 +36,8 @@ def write(self, code): def _write(self, code): indentation = self.level * 4 * ' ' + if self.inline_glsl and not code.startswith( self.inline_skip ): + code = "inline('''%s''')" %code s = '%s%s\n' % (indentation, code) self.output.write(s) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index ef4c1e7..0de98d6 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -153,6 +153,7 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._with_rpc = None self._with_rpc_name = None self._with_direct_keys = False + self._with_glsl = False self._source = source.splitlines() self._classes = dict() ## class name : [method names] @@ -1134,7 +1135,9 @@ def visit_Return(self, node): # writer.write('self["__dict__"]["%s"] = %s' %(self._cached_property, self.visit(node.value)) ) # writer.write('return self["__dict__"]["%s"]' %self._cached_property) #else: - if self._inline: + if self._with_glsl: + writer.write('out_float = %s' %self.visit(node.value)) + elif self._inline: writer.write('__returns__%s = %s' %(self._inline[-1], self.visit(node.value)) ) if self._inline_breakout: writer.write('break') @@ -1160,7 +1163,10 @@ def visit_BinOp(self, node): op = self.visit(node.op) right = self.visit(node.right) - if op == '|': + if self._with_glsl: + return '(%s %s %s)' % (left, op, right) + + elif op == '|': if isinstance(node.right, Str): self._custom_op_hack = (node.right.s, left) return '' @@ -1451,7 +1457,7 @@ def visit_Subscript(self, node): #return '%s["$wrapped"]' %name return '%s[...]' %name - elif self._with_ll: + elif self._with_ll or self._with_glsl: return '%s[ %s ]' %(name, self.visit(node.slice)) elif self._with_js or self._with_dart: @@ -2392,7 +2398,7 @@ def visit_FunctionDef(self, node): self._cached_property = None self._func_typedefs = {} - if writer.is_at_global_level() and not self._with_webworker: + if writer.is_at_global_level() and not self._with_webworker and not self._with_glsl: self._global_functions[ node.name ] = node ## save ast-node for decorator in reversed(node.decorator_list): @@ -2564,7 +2570,11 @@ def visit_FunctionDef(self, node): writer.write( 'def %s( %s ):' % (node.name, ','.join(args)) ) - elif self._with_js or javascript or self._with_ll:# or self._with_coffee: + elif self._with_js or javascript or self._with_ll or self._with_glsl: + + if self._with_glsl: + writer.write('@__glsl__') + if node.args.vararg: #raise SyntaxError( 'pure javascript functions can not take variable arguments (*args)' ) writer.write('#WARNING - NOT IMPLEMENTED: javascript-mode functions with (*args)') @@ -2994,6 +3004,13 @@ def visit_For(self, node): c.constant = True self._call_ids += 1 + if self._with_glsl: + writer.write( 'for %s in %s:' %(self.visit(node.target), self.visit(node.iter)) ) + writer.push() + map(self.visit, node.body) + writer.pull() + return None + if self._with_rpc_name and isinstance(node.iter, ast.Attribute) and isinstance(node.iter.value, ast.Name) and node.iter.value.id == self._with_rpc_name: target = self.visit(node.target) writer.write('def __rpc_loop__():') @@ -3240,7 +3257,16 @@ def visit_While(self, node): def visit_With(self, node): global writer - if isinstance( node.context_expr, ast.Call ) and isinstance(node.context_expr.func, ast.Name) and node.context_expr.func.id == 'rpc': + if isinstance( node.context_expr, Name ) and node.context_expr.id == 'glsl': + writer.inline_glsl = True + self._with_glsl = True + for b in node.body: + a = self.visit(b) + if a: writer.write(a) + self._with_glsl = False + writer.inline_glsl = False + + elif isinstance( node.context_expr, ast.Call ) and isinstance(node.context_expr.func, ast.Name) and node.context_expr.func.id == 'rpc': self._with_rpc = self.visit( node.context_expr.args[0] ) if isinstance(node.optional_vars, ast.Name): self._with_rpc_name = node.optional_vars.id diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index a75c2c7..d44d12f 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -31,6 +31,9 @@ def __init__(self, requirejs=True, insert_runtime=True, webworker=False, functio self._webworker = webworker self._exports = set() + self.special_decorators = set(['__typedef__', '__glsl__']) + self._glsl = False + def indent(self): return ' ' * self._indent def push(self): self._indent += 1 def pull(self): @@ -172,8 +175,57 @@ def visit_FunctionDef(self, node): return buffer def _visit_function(self, node): + glsl = False + args_typedefs = {} + for decor in node.decorator_list: + if isinstance(decor, ast.Name) and decor.id == '__glsl__': + glsl = True + elif isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == '__typedef__': + for key in decor.keywords: + args_typedefs[ key.arg ] = key.value.id + args = self.visit(node.args) - if len(node.decorator_list)==1 and not ( isinstance(node.decorator_list[0], ast.Call) and node.decorator_list[0].func.id == '__typedef__' ): + + if glsl: + lines = ['var __program__ = [];'] + x = [] + for i,arg in enumerate(args): + assert arg in args_typedefs + x.append( '%s %s' %(args_typedefs[arg].replace('POINTER', '*'), arg) ) + lines.append( '__program__.push("void main( %s ) {");' %', '.join(x) ) + + self.push() + self._glsl = True + for child in node.body: + if isinstance(child, Str): + continue + else: + for sub in self.visit(child).splitlines(): + lines.append( '__program__.push("%s");' %(self.indent()+sub) ) + self._glsl = False + #buffer += '\n'.join(body) + self.pull() + lines.append('\n__program__.push("%s}");' %self.indent()) + lines.append('function call_webclgl_program( %s ) {' %','.join(args)) + lines.append(' var offset = 0') ## TODO data range, 0 allows 0-1.0 + lines.append(' var __webclgl = new WebCLGL()') + lines.append(' var return_buffer = __webclgl.createBuffer(1, "FLOAT", offset)') ## TODO length of return buffer + for arg in args: + lines.append(' var %s_buffer = __webclgl.createBuffer(%s.length, "FLOAT", offset)' %(arg,arg)) + lines.append(' __webclgl.enqueueWriteBuffer(%s_buffer, %s)' %(arg, arg)) + + lines.append(' var __kernel = __webclgl.createKernel( __program__ );') + for i,arg in enumerate(args): + lines.append(' __kernel.setKernelArg(%s, %s_buffer)' %(i, arg)) + + lines.append(' __kernel.compile()') + lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, return_buffer)') + lines.append(' return __webclgl.enqueueReadBuffer_Float( return_buffer )') + lines.append('} // end of wrapper') + + return '\n'.join(lines) + + elif len(node.decorator_list)==1 and not ( isinstance(node.decorator_list[0], ast.Call) and node.decorator_list[0].func.id not in self.special_decorators ): dec = self.visit(node.decorator_list[0]) buffer = self.indent() + '%s.%s = function(%s) {\n' % (dec,node.name, ', '.join(args)) @@ -605,6 +657,16 @@ def visit_For(self, node): above works because [...] returns the internal Array of mylist ''' + if self._glsl: + target = self.visit(node.target) + iter = self.visit(node.iter.args[0]) + lines = ['for (int %s; %s < %s; %s++) {' %(target, target, iter, target)] + for b in node.body: + lines.append( self.visit(b) ) + lines.append( '}' ) + return '\n'.join(lines) + + self._iter_id += 1 iname = '__iter%s' %self._iter_id index = '__idx%s' %self._iter_id diff --git a/pythonjs/runtime/dart_builtins.py b/pythonjs/runtime/dart_builtins.py index bed45d7..02c44a1 100644 --- a/pythonjs/runtime/dart_builtins.py +++ b/pythonjs/runtime/dart_builtins.py @@ -15,9 +15,6 @@ def __init__(self, items): self[...] = new( List() ) self.length = items.length - #vec = new( Float32x4.zero() ) - #self[...].add( vec ) - i = 0; s = 0 while i < items.length: x = items[i] @@ -42,7 +39,6 @@ def __getitem__(self, index): def __setitem__(self, index, value): if index < 0: index = self.length + index - #float32x4 vec = self[...][ index // 4 ] vec = self[...][ index // 4 ] lane = index % 4 if lane == 0: vec = vec.withX(value) diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 95f48af..84fa764 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -1,4 +1,10 @@ -whitespace = [' ', '\t'] +types = ['str', 'list', 'dict'] + +glsl_types = ['float*', 'vec2'] +glsl_aliases = ['floatPOINTER'] +types.extend( glsl_types ) +types.extend( glsl_aliases ) + native_number_types = ['int', 'float', 'double'] ## float and double are the same simd_types = ['float32x4', 'int32x4'] vector_types = ['float32vec'] @@ -6,23 +12,34 @@ number_types = ['long'] ## requires https://github.com/dcodeIO/Long.js number_types.extend( native_number_types ) -types = ['str', 'list', 'dict'] types.extend( number_types) types.extend( vector_types ) +__whitespace = [' ', '\t'] + def transform_source( source, strip=False ): output = [] for line in source.splitlines(): a = [] - for char in line: - if a and char in whitespace: + for i,char in enumerate(line): + nextchar = None + j = i+1 + while j < len(line): + nextchar = line[j] + if nextchar.strip(): break + j += 1 + + if a and char in __whitespace: b = ''.join(a) b = b.strip() - if b in types: + if b in types and nextchar != '=': if strip: a = a[ : -len(b) ] else: + if a[-1]=='*': + a.pop() + a.append('POINTER') a.append('=') a.append( char ) else: diff --git a/regtests/run.py b/regtests/run.py index c4269a4..7e67157 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -348,6 +348,13 @@ def __call__(self, name): return lambda f: f webworker = webworker() +class glsl(object): + def __enter__(self, *args): pass + def __exit__(self, *args): pass + def __call__(self, name): + return lambda f: f +glsl = glsl() + try: import numpy except: diff --git a/regtests/webclgl/hello_gpu.py b/regtests/webclgl/hello_gpu.py new file mode 100644 index 0000000..ae06406 --- /dev/null +++ b/regtests/webclgl/hello_gpu.py @@ -0,0 +1,14 @@ +"""gpu test""" + +def main(): + with glsl: + def main(buffA, buffB, num): + float* buffA + float* buffB + float num + vec2 n = get_global_id() + float result = 0.0 + for i in range(1000): + result = sqrt(result + A[n] + B[n] + float(i)) + #out_float = result ## translator should take care of this? + return result \ No newline at end of file From 15586011ea5653652bf9268fe5bb675e450ed839 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 14 Jun 2014 13:09:08 -0700 Subject: [PATCH 035/222] glsl backend: fixed local variable typedefs, fixed function calls. --- pythonjs/python_to_pythonjs.py | 2 +- pythonjs/pythonjs.py | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 0de98d6..fb77db9 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1996,7 +1996,7 @@ def visit_Call(self, node): else: raise SyntaxError( self.format_error(node) ) - elif self._with_ll or name == 'inline': + elif self._with_ll or name == 'inline' or self._with_glsl: args = [self.visit(arg) for arg in node.args] if node.keywords: args.extend( [self.visit(x.value) for x in node.keywords] ) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index d44d12f..d6f920e 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -174,6 +174,14 @@ def visit_FunctionDef(self, node): self._function_stack.pop() return buffer + def _visit_call_helper_var_glsl(self, node): + lines = [] + for key in node.keywords: + lines.append( '%s %s' %(key.value.id, key.arg)) + + return ';'.join(lines) + + def _visit_function(self, node): glsl = False args_typedefs = {} @@ -356,7 +364,10 @@ def visit_Call(self, node): return self._visit_call_helper_JSObject( node ) elif name == 'var': - return self._visit_call_helper_var( node ) + if self._glsl: + return self._visit_call_helper_var_glsl( node ) + else: + return self._visit_call_helper_var( node ) elif name == 'JSArray': return self._visit_call_helper_JSArray( node ) From 76e1a981b40e8b00846a2f1001cc8f04cc9a2612 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 14 Jun 2014 18:04:11 -0700 Subject: [PATCH 036/222] glsl/webclgl backend: function can now accept array or number arguments, `with glsl as myfunc:` is now required to set the name of the wrapper function. the wrapper function will take an additonal argument that sets the `offset` range. --- pythonjs/python_to_pythonjs.py | 8 ++++ pythonjs/pythonjs.py | 68 +++++++++++++++++++++------------- regtests/webclgl/hello_gpu.py | 12 ++++-- 3 files changed, 59 insertions(+), 29 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index fb77db9..5f73b98 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -3258,13 +3258,21 @@ def visit_With(self, node): global writer if isinstance( node.context_expr, Name ) and node.context_expr.id == 'glsl': + if not isinstance(node.optional_vars, ast.Name): + raise SyntaxError( self.format_error('wrapper function name must be given: `with glsl as myfunc:`') ) + main_func = None writer.inline_glsl = True self._with_glsl = True for b in node.body: + if isinstance(b, ast.FunctionDef) and b.name == 'main': + main_func = True + writer.write('@__glsl__.%s' %node.optional_vars.id) a = self.visit(b) if a: writer.write(a) self._with_glsl = False writer.inline_glsl = False + if not main_func: + raise SyntaxError( self.format_error('a function named `main` must be defined as the entry point for the shader program') ) elif isinstance( node.context_expr, ast.Call ) and isinstance(node.context_expr.func, ast.Name) and node.context_expr.func.id == 'rpc': self._with_rpc = self.visit( node.context_expr.args[0] ) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index d6f920e..8d94849 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -33,6 +33,7 @@ def __init__(self, requirejs=True, insert_runtime=True, webworker=False, functio self.special_decorators = set(['__typedef__', '__glsl__']) self._glsl = False + self._has_glsl = False def indent(self): return ' ' * self._indent def push(self): self._indent += 1 @@ -67,13 +68,15 @@ def visit_AugAssign(self, node): return a def visit_Module(self, node): + header = [] + lines = [] + if self._requirejs and not self._webworker: - lines = [ + header.extend([ 'define( function(){', '__module__ = {}' - ] - else: - lines = [] + ]) + if self._insert_runtime: dirname = os.path.dirname(os.path.abspath(__file__)) @@ -95,7 +98,10 @@ def visit_Module(self, node): lines.append( 'return __module__') lines.append('}) //end requirejs define') - #return '\n'.join(lines) + if self._has_glsl: + header.append( 'var __shader__ = []' ) + + lines = header + lines ## fixed by Foxboron return '\n'.join(l if isinstance(l,str) else l.encode("utf-8") for l in lines) @@ -184,10 +190,13 @@ def _visit_call_helper_var_glsl(self, node): def _visit_function(self, node): glsl = False + glsl_wrapper_name = False args_typedefs = {} for decor in node.decorator_list: if isinstance(decor, ast.Name) and decor.id == '__glsl__': glsl = True + elif isinstance(decor, ast.Attribute) and isinstance(decor.value, ast.Name) and decor.value.id == '__glsl__': + glsl_wrapper_name = decor.attr elif isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == '__typedef__': for key in decor.keywords: args_typedefs[ key.arg ] = key.value.id @@ -195,12 +204,18 @@ def _visit_function(self, node): args = self.visit(node.args) if glsl: - lines = ['var __program__ = [];'] + is_main = node.name == 'main' + self._has_glsl = True ## writes `__shader__ = []` in header + lines = [] x = [] for i,arg in enumerate(args): assert arg in args_typedefs x.append( '%s %s' %(args_typedefs[arg].replace('POINTER', '*'), arg) ) - lines.append( '__program__.push("void main( %s ) {");' %', '.join(x) ) + + if is_main: + lines.append( '__shader__.push("void main( %s ) {");' %', '.join(x) ) + else: ## TODO return type + lines.append( '__shader__.push("void %s( %s ) {");' %(node.name, ', '.join(x)) ) self.push() self._glsl = True @@ -209,27 +224,30 @@ def _visit_function(self, node): continue else: for sub in self.visit(child).splitlines(): - lines.append( '__program__.push("%s");' %(self.indent()+sub) ) + lines.append( '__shader__.push("%s");' %(self.indent()+sub) ) self._glsl = False #buffer += '\n'.join(body) self.pull() - lines.append('\n__program__.push("%s}");' %self.indent()) - lines.append('function call_webclgl_program( %s ) {' %','.join(args)) - lines.append(' var offset = 0') ## TODO data range, 0 allows 0-1.0 - lines.append(' var __webclgl = new WebCLGL()') - lines.append(' var return_buffer = __webclgl.createBuffer(1, "FLOAT", offset)') ## TODO length of return buffer - for arg in args: - lines.append(' var %s_buffer = __webclgl.createBuffer(%s.length, "FLOAT", offset)' %(arg,arg)) - lines.append(' __webclgl.enqueueWriteBuffer(%s_buffer, %s)' %(arg, arg)) - - lines.append(' var __kernel = __webclgl.createKernel( __program__ );') - for i,arg in enumerate(args): - lines.append(' __kernel.setKernelArg(%s, %s_buffer)' %(i, arg)) - - lines.append(' __kernel.compile()') - lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, return_buffer)') - lines.append(' return __webclgl.enqueueReadBuffer_Float( return_buffer )') - lines.append('} // end of wrapper') + lines.append('__shader__.push("%s}");' %self.indent()) + + if is_main: + lines.append('function %s( %s, __offset ) {' %(glsl_wrapper_name, ','.join(args)) ) + lines.append(' __offset = __offset || 0') ## note by default: 0 allows 0-1.0 + lines.append(' var __webclgl = new WebCLGL()') + lines.append(' var __kernel = __webclgl.createKernel( __shader__ );') + + lines.append(' var return_buffer = __webclgl.createBuffer(1, "FLOAT", __offset)') ## TODO length of return buffer + for i,arg in enumerate(args): + lines.append(' if (%s instanceof Array) {' %arg) + lines.append(' var %s_buffer = __webclgl.createBuffer(%s.length, "FLOAT", __offset)' %(arg,arg)) + lines.append(' __webclgl.enqueueWriteBuffer(%s_buffer, %s)' %(arg, arg)) + lines.append(' __kernel.setKernelArg(%s, %s_buffer)' %(i, arg)) + lines.append(' } else { __kernel.setKernelArg(%s, %s) }' %(i, arg)) + + lines.append(' __kernel.compile()') + lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, return_buffer)') + lines.append(' return __webclgl.enqueueReadBuffer_Float( return_buffer )') + lines.append('} // end of wrapper') return '\n'.join(lines) diff --git a/regtests/webclgl/hello_gpu.py b/regtests/webclgl/hello_gpu.py index ae06406..65cf6f5 100644 --- a/regtests/webclgl/hello_gpu.py +++ b/regtests/webclgl/hello_gpu.py @@ -1,14 +1,18 @@ """gpu test""" def main(): - with glsl: + with glsl as myfunc: def main(buffA, buffB, num): float* buffA float* buffB float num - vec2 n = get_global_id() + vec2 n = get_global_id() ## WebCL API float result = 0.0 for i in range(1000): result = sqrt(result + A[n] + B[n] + float(i)) - #out_float = result ## translator should take care of this? - return result \ No newline at end of file + return result * num + + A = [1,2,3] + B = [4,5,6] + res = myfunc( A, B, 2.0 ) + print(res) \ No newline at end of file From ab996124391e526cc8d4d43a250a700c5691136e Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 14 Jun 2014 18:24:25 -0700 Subject: [PATCH 037/222] deprecated function extra introspective data, pythonjs.js now 20KB smaller. --- pythonjs/python_to_pythonjs.py | 24 +- pythonjs/pythonjs.js | 990 ++++++++------------------------- 2 files changed, 234 insertions(+), 780 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 5f73b98..1815db6 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -194,6 +194,7 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._generator_functions = set() self._in_loop_with_else = False + self._introspective_functions = False self._custom_operators = {} self._injector = [] ## advanced meta-programming hacks @@ -2904,20 +2905,21 @@ def visit_FunctionDef(self, node): if not self._with_dart and not self._with_lua: ## Dart functions can not have extra attributes? - ## note, in javascript function.name is a non-standard readonly attribute, - ## the compiler creates anonymous functions with name set to an empty string. - writer.write('%s.NAME = "%s"' %(node.name,node.name)) + if self._introspective_functions: + ## note, in javascript function.name is a non-standard readonly attribute, + ## the compiler creates anonymous functions with name set to an empty string. + writer.write('%s.NAME = "%s"' %(node.name,node.name)) - writer.write( '%s.args_signature = [%s]' %(node.name, ','.join(['"%s"'%n.id for n in node.args.args])) ) - defaults = ['%s:%s'%(self.visit(x[0]), self.visit(x[1])) for x in zip(node.args.args[-len(node.args.defaults):], node.args.defaults) ] - writer.write( '%s.kwargs_signature = {%s}' %(node.name, ','.join(defaults)) ) - if self._with_fastdef or fastdef: - writer.write('%s.fastdef = True' %node.name) + writer.write( '%s.args_signature = [%s]' %(node.name, ','.join(['"%s"'%n.id for n in node.args.args])) ) + defaults = ['%s:%s'%(self.visit(x[0]), self.visit(x[1])) for x in zip(node.args.args[-len(node.args.defaults):], node.args.defaults) ] + writer.write( '%s.kwargs_signature = {%s}' %(node.name, ','.join(defaults)) ) + if self._with_fastdef or fastdef: + writer.write('%s.fastdef = True' %node.name) - writer.write( '%s.types_signature = {%s}' %(node.name, ','.join(types)) ) + writer.write( '%s.types_signature = {%s}' %(node.name, ','.join(types)) ) - if return_type: - writer.write('%s.return_type = "%s"'%(node.name, return_type)) + if return_type: + writer.write('%s.return_type = "%s"'%(node.name, return_type)) if not self._with_js and not javascript: writer.write('%s.pythonscript_function=True'%node.name) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index a9f2e7f..46d0ffd 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -13,7 +13,7 @@ if (( typeof(importScripts) ) == "function") { } __create_array__ = function() { "Used to fix a bug/feature of Javascript where new Array(number)\n created a array with number of undefined elements which is not\n what we want"; - var i, array; + var i,array; array = []; i = 0; while (( i ) < arguments.length) { @@ -49,7 +49,7 @@ __get__ = function(object, attribute, error_message) { } else { if ({}.toString.call(object) === '[object Function]') { var wrapper = function(args, kwargs) { - var i, arg, keys; + var i,arg,keys; if (( args ) != null) { i = 0; while (( i ) < args.length) { @@ -127,7 +127,7 @@ __get__ = function(object, attribute, error_message) { return attr; } var wrapper = function(args, kwargs) { - var i, arg, keys; + var i,arg,keys; if (( args ) != null) { i = 0; while (( i ) < args.length) { @@ -191,7 +191,7 @@ __get__ = function(object, attribute, error_message) { return attr; } } - var __class__, bases; + var __class__,bases; __class__ = object.__class__; if (__class__) { if (( attribute ) in __class__.__properties__) { @@ -497,17 +497,15 @@ ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = O AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError"; RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError"; __getattr__ = function(ob, a) { + ; if (ob.__getattr__) { return ob.__getattr__(a); } } -__getattr__.NAME = "__getattr__"; -__getattr__.args_signature = ["ob", "a"]; -__getattr__.kwargs_signature = { }; -__getattr__.types_signature = { }; __getattr__.pythonscript_function = true; __test_if_true__ = function(ob) { + ; if (( ob ) === true) { return true; } else { @@ -543,12 +541,9 @@ __test_if_true__ = function(ob) { } } -__test_if_true__.NAME = "__test_if_true__"; -__test_if_true__.args_signature = ["ob"]; -__test_if_true__.kwargs_signature = { }; -__test_if_true__.types_signature = { }; __test_if_true__.pythonscript_function = true; __replace_method = function(ob, a, b) { + ; if (( typeof(ob) ) == "string") { return ob.split(a).join(b); } else { @@ -556,12 +551,9 @@ __replace_method = function(ob, a, b) { } } -__replace_method.NAME = "__replace_method"; -__replace_method.args_signature = ["ob", "a", "b"]; -__replace_method.kwargs_signature = { }; -__replace_method.types_signature = { }; __replace_method.pythonscript_function = true; __split_method = function(ob, delim) { + ; if (( typeof(ob) ) == "string") { if (( delim ) === undefined) { return ob.split(" "); @@ -577,12 +569,9 @@ __split_method = function(ob, delim) { } } -__split_method.NAME = "__split_method"; -__split_method.args_signature = ["ob", "delim"]; -__split_method.kwargs_signature = { }; -__split_method.types_signature = { }; __split_method.pythonscript_function = true; __is_typed_array = function(ob) { + ; if (__test_if_true__(ob instanceof Int8Array || ob instanceof Uint8Array)) { return true; } else { @@ -602,10 +591,6 @@ __is_typed_array = function(ob) { } } -__is_typed_array.NAME = "__is_typed_array"; -__is_typed_array.args_signature = ["ob"]; -__is_typed_array.kwargs_signature = { }; -__is_typed_array.types_signature = { }; __js_typed_array = function(t, a) { var arr; if (( t ) == "i") { @@ -615,10 +600,6 @@ __js_typed_array = function(t, a) { return arr; } -__js_typed_array.NAME = "__js_typed_array"; -__js_typed_array.args_signature = ["t", "a"]; -__js_typed_array.kwargs_signature = { }; -__js_typed_array.types_signature = { }; __contains__ = function(ob, a) { var t; t = typeof(ob); @@ -657,12 +638,8 @@ __contains__ = function(ob, a) { } } -__contains__.NAME = "__contains__"; -__contains__.args_signature = ["ob", "a"]; -__contains__.kwargs_signature = { }; -__contains__.types_signature = { }; __add_op = function(a, b) { - var c, t; + var c,t; t = typeof(a); if (__test_if_true__(( t ) == "string" || ( t ) == "number")) { return a+b; @@ -682,19 +659,15 @@ __add_op = function(a, b) { } } -__add_op.NAME = "__add_op"; -__add_op.args_signature = ["a", "b"]; -__add_op.kwargs_signature = { }; -__add_op.types_signature = { }; __mul_op = function(a, b) { - var c, arr, t; + var c,arr,t; t = typeof(a); if (( t ) == "number") { return a * b; } else { if (( t ) == "string") { arr = []; - var i, i__end__; + var i,i__end__; i = 0; i__end__ = b; while (( i ) < i__end__) { @@ -724,12 +697,8 @@ __mul_op = function(a, b) { } } -__mul_op.NAME = "__mul_op"; -__mul_op.args_signature = ["a", "b"]; -__mul_op.kwargs_signature = { }; -__mul_op.types_signature = { }; __jsdict = function(items) { - var d, key; + var d,key; d = {}; var __iter2 = items; if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } @@ -744,11 +713,8 @@ __jsdict = function(items) { return d; } -__jsdict.NAME = "__jsdict"; -__jsdict.args_signature = ["items"]; -__jsdict.kwargs_signature = { }; -__jsdict.types_signature = { }; __jsdict_get = function(ob, key, default_value) { + ; if (__test_if_true__(ob instanceof Object)) { if (__test_if_true__(key in ob)) { return ob[key]; @@ -763,11 +729,8 @@ __jsdict_get = function(ob, key, default_value) { } } -__jsdict_get.NAME = "__jsdict_get"; -__jsdict_get.args_signature = ["ob", "key", "default_value"]; -__jsdict_get.kwargs_signature = { }; -__jsdict_get.types_signature = { }; __jsdict_set = function(ob, key, value) { + ; if (__test_if_true__(ob instanceof Object)) { ob[key] = value; } else { @@ -775,11 +738,8 @@ __jsdict_set = function(ob, key, value) { } } -__jsdict_set.NAME = "__jsdict_set"; -__jsdict_set.args_signature = ["ob", "key", "value"]; -__jsdict_set.kwargs_signature = { }; -__jsdict_set.types_signature = { }; __jsdict_keys = function(ob) { + ; if (__test_if_true__(ob instanceof Object)) { return Object.keys( ob ); } else { @@ -787,12 +747,8 @@ __jsdict_keys = function(ob) { } } -__jsdict_keys.NAME = "__jsdict_keys"; -__jsdict_keys.args_signature = ["ob"]; -__jsdict_keys.kwargs_signature = { }; -__jsdict_keys.types_signature = { }; __jsdict_values = function(ob) { - var arr, value; + var arr,value; if (__test_if_true__(ob instanceof Object)) { arr = []; var __iter3 = ob; @@ -810,12 +766,8 @@ __jsdict_values = function(ob) { } } -__jsdict_values.NAME = "__jsdict_values"; -__jsdict_values.args_signature = ["ob"]; -__jsdict_values.kwargs_signature = { }; -__jsdict_values.types_signature = { }; __jsdict_items = function(ob) { - var arr, value; + var arr,value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; var __iter4 = ob; @@ -833,10 +785,6 @@ __jsdict_items = function(ob) { } } -__jsdict_items.NAME = "__jsdict_items"; -__jsdict_items.args_signature = ["ob"]; -__jsdict_items.kwargs_signature = { }; -__jsdict_items.types_signature = { }; __jsdict_pop = function(ob, key, _kwargs_) { var v; if (!( _kwargs_ instanceof Object )) {; @@ -872,10 +820,6 @@ __jsdict_pop = function(ob, key, _kwargs_) { } } -__jsdict_pop.NAME = "__jsdict_pop"; -__jsdict_pop.args_signature = ["ob", "key", "_default"]; -__jsdict_pop.kwargs_signature = { _default:null }; -__jsdict_pop.types_signature = { _default:"None" }; __object_keys__ = function(ob) { var arr; "\n notes:\n . Object.keys(ob) will not work because we create PythonJS objects using `Object.create(null)`\n . this is different from Object.keys because it traverses the prototype chain.\n "; @@ -884,12 +828,8 @@ __object_keys__ = function(ob) { return arr; } -__object_keys__.NAME = "__object_keys__"; -__object_keys__.args_signature = ["ob"]; -__object_keys__.kwargs_signature = { }; -__object_keys__.types_signature = { }; __bind_property_descriptors__ = function(o, klass) { - var prop, desc; + var prop,desc; var __iter5 = klass.__properties__; if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { @@ -912,44 +852,28 @@ __bind_property_descriptors__ = function(o, klass) { } } -__bind_property_descriptors__.NAME = "__bind_property_descriptors__"; -__bind_property_descriptors__.args_signature = ["o", "klass"]; -__bind_property_descriptors__.kwargs_signature = { }; -__bind_property_descriptors__.types_signature = { }; __generate_getter__ = function(klass, o, n) { + ; var __lambda__ = function() { + ; return klass.__properties__[n]["get"]([o], __jsdict([])); } - __lambda__.NAME = "__lambda__"; - __lambda__.args_signature = []; - __lambda__.kwargs_signature = { }; - __lambda__.types_signature = { }; return __lambda__; } -__generate_getter__.NAME = "__generate_getter__"; -__generate_getter__.args_signature = ["klass", "o", "n"]; -__generate_getter__.kwargs_signature = { }; -__generate_getter__.types_signature = { }; __generate_setter__ = function(klass, o, n) { + ; var __lambda__ = function(v) { + ; return klass.__properties__[n]["set"]([o, v], __jsdict([])); } - __lambda__.NAME = "__lambda__"; - __lambda__.args_signature = ["v"]; - __lambda__.kwargs_signature = { }; - __lambda__.types_signature = { }; return __lambda__; } -__generate_setter__.NAME = "__generate_setter__"; -__generate_setter__.args_signature = ["klass", "o", "n"]; -__generate_setter__.kwargs_signature = { }; -__generate_setter__.types_signature = { }; __sprintf = function(fmt, args) { - var chunks, item, arr; + var chunks,item,arr; if (__test_if_true__(args instanceof Array)) { chunks = fmt.split("%s"); arr = []; @@ -961,7 +885,6 @@ __sprintf = function(fmt, args) { var txt = __iter7[ __idx7 ]; arr.append(txt); if (( i ) >= args.length) { - __break__ = true; break; } item = args[i]; @@ -982,12 +905,8 @@ __sprintf = function(fmt, args) { } } -__sprintf.NAME = "__sprintf"; -__sprintf.args_signature = ["fmt", "args"]; -__sprintf.kwargs_signature = { }; -__sprintf.types_signature = { }; __create_class__ = function(class_name, parents, attrs, props) { - var f, klass, prop; + var f,klass,prop; "Create a PythonScript class"; klass = Object.create(null); klass.__bases__ = parents; @@ -1039,7 +958,7 @@ __create_class__ = function(class_name, parents, attrs, props) { Array.prototype.push.apply(klass.__all_method_names__, base.__all_method_names__); } var __call__ = function() { - var has_getattr, wrapper, object, has_getattribute; + var has_getattr,wrapper,object,has_getattribute; "Create a PythonJS object"; object = Object.create(null); object.__class__ = klass; @@ -1076,21 +995,14 @@ __create_class__ = function(class_name, parents, attrs, props) { return object; } - __call__.NAME = "__call__"; - __call__.args_signature = []; - __call__.kwargs_signature = { }; - __call__.types_signature = { }; __call__.pythonscript_function = true; klass.__call__ = __call__; return klass; } -__create_class__.NAME = "__create_class__"; -__create_class__.args_signature = ["class_name", "parents", "attrs", "props"]; -__create_class__.kwargs_signature = { }; -__create_class__.types_signature = { }; type = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{"bases": null, "class_dict": null},args:["ob_or_class_name", "bases", "class_dict"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -1110,13 +1022,10 @@ type = function(args, kwargs) { } } -type.NAME = "type"; -type.args_signature = ["ob_or_class_name", "bases", "class_dict"]; -type.kwargs_signature = { bases:null,class_dict:null }; -type.types_signature = { bases:"None",class_dict:"None" }; type.pythonscript_function = true; hasattr = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["ob", "attr"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -1130,14 +1039,10 @@ hasattr = function(args, kwargs) { return Object.hasOwnProperty.call(ob, attr); } -hasattr.NAME = "hasattr"; -hasattr.args_signature = ["ob", "attr"]; -hasattr.kwargs_signature = { }; -hasattr.types_signature = { }; hasattr.pythonscript_function = true; getattr = function(args, kwargs) { var prop; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{"property": false},args:["ob", "attr", "property"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -1161,14 +1066,10 @@ getattr = function(args, kwargs) { } } -getattr.NAME = "getattr"; -getattr.args_signature = ["ob", "attr", "property"]; -getattr.kwargs_signature = { property:false }; -getattr.types_signature = { property:"False" }; getattr.pythonscript_function = true; setattr = function(args, kwargs) { var prop; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{"property": false},args:["ob", "attr", "value", "property"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -1193,14 +1094,10 @@ setattr = function(args, kwargs) { } } -setattr.NAME = "setattr"; -setattr.args_signature = ["ob", "attr", "value", "property"]; -setattr.kwargs_signature = { property:false }; -setattr.types_signature = { property:"False" }; setattr.pythonscript_function = true; issubclass = function(args, kwargs) { - var i, bases; - var __sig__, __args__; + var i,bases; + var __sig__,__args__; __sig__ = { kwargs:{},args:["C", "B"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -1217,7 +1114,7 @@ issubclass = function(args, kwargs) { bases = C.__bases__; i = 0; while (( i ) < __get__(bases, "length", "missing attribute `length` - line 409: while i < bases.length:")) { - if (__test_if_true__(issubclass([__get__(bases, "__getitem__", "line 410: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__), B], __NULL_OBJECT__))) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 410: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1225,14 +1122,10 @@ issubclass = function(args, kwargs) { return false; } -issubclass.NAME = "issubclass"; -issubclass.args_signature = ["C", "B"]; -issubclass.kwargs_signature = { }; -issubclass.types_signature = { }; issubclass.pythonscript_function = true; isinstance = function(args, kwargs) { var ob_class; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["ob", "klass"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -1262,14 +1155,10 @@ isinstance = function(args, kwargs) { } } -isinstance.NAME = "isinstance"; -isinstance.args_signature = ["ob", "klass"]; -isinstance.kwargs_signature = { }; -isinstance.types_signature = { }; isinstance.pythonscript_function = true; int = function(args, kwargs) { ; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -1286,14 +1175,10 @@ int = function(args, kwargs) { return a; } -int.NAME = "int"; -int.args_signature = ["a"]; -int.kwargs_signature = { }; -int.types_signature = { }; int.pythonscript_function = true; float = function(args, kwargs) { ; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -1310,14 +1195,10 @@ float = function(args, kwargs) { return a; } -float.NAME = "float"; -float.args_signature = ["a"]; -float.kwargs_signature = { }; -float.types_signature = { }; float.pythonscript_function = true; round = function(args, kwargs) { - var y, x, c, b; - var __sig__, __args__; + var y,x,c,b; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a", "places"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -1339,13 +1220,10 @@ round = function(args, kwargs) { } } -round.NAME = "round"; -round.args_signature = ["a", "places"]; -round.kwargs_signature = { }; -round.types_signature = { }; round.pythonscript_function = true; str = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["s"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -1358,14 +1236,12 @@ str = function(args, kwargs) { return ("" + s); } -str.NAME = "str"; -str.args_signature = ["s"]; -str.kwargs_signature = { }; -str.types_signature = { }; str.pythonscript_function = true; _setup_str_prototype = function(args, kwargs) { + ; "\n Extend JavaScript String.prototype with methods that implement the Python str API.\n The decorator @String.prototype.[name] assigns the function to the prototype,\n and ensures that the special 'this' variable will work.\n "; var func = function(a) { + ; if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1373,12 +1249,9 @@ _setup_str_prototype = function(args, kwargs) { } } - func.NAME = "func"; - func.args_signature = ["a"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(index) { + ; if (( index ) < 0) { return this[(this.length + index)]; } else { @@ -1386,21 +1259,15 @@ _setup_str_prototype = function(args, kwargs) { } } - func.NAME = "func"; - func.args_signature = ["index"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(self) { + ; return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } - func.NAME = "func"; - func.args_signature = ["self"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(idx) { + ; if (( idx ) < 0) { return this[(this.length + idx)]; } else { @@ -1408,19 +1275,12 @@ _setup_str_prototype = function(args, kwargs) { } } - func.NAME = "func"; - func.args_signature = ["idx"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "__getitem__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { + ; return this.length; } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(start, stop, step) { ; @@ -1434,30 +1294,21 @@ _setup_str_prototype = function(args, kwargs) { } } - func.NAME = "func"; - func.args_signature = ["start", "stop", "step"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "__getslice__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { + ; return this.split("\n"); } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "splitlines", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { + ; return this.trim(); } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "strip", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(a) { + ; if (( this.substring(0, a.length) ) == a) { return true; } else { @@ -1465,12 +1316,9 @@ _setup_str_prototype = function(args, kwargs) { } } - func.NAME = "func"; - func.args_signature = ["a"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "startswith", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(a) { + ; if (( this.substring((this.length - a.length), this.length) ) == a) { return true; } else { @@ -1478,13 +1326,9 @@ _setup_str_prototype = function(args, kwargs) { } } - func.NAME = "func"; - func.args_signature = ["a"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "endswith", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(a) { - var i, arr, out; + var i,arr,out; out = ""; if (__test_if_true__(a instanceof Array)) { arr = a; @@ -1505,28 +1349,18 @@ _setup_str_prototype = function(args, kwargs) { return out; } - func.NAME = "func"; - func.args_signature = ["a"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "join", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { + ; return this.toUpperCase(); } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "upper", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { + ; return this.toLowerCase(); } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "lower", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(a) { var i; @@ -1537,19 +1371,12 @@ _setup_str_prototype = function(args, kwargs) { return i; } - func.NAME = "func"; - func.args_signature = ["a"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "index", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(a) { + ; return this.indexOf(a); } - func.NAME = "func"; - func.args_signature = ["a"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "find", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { var digits; @@ -1567,31 +1394,21 @@ _setup_str_prototype = function(args, kwargs) { return true; } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "isdigit", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(encoding) { + ; return this; } - func.NAME = "func"; - func.args_signature = ["encoding"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "decode", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(encoding) { + ; return this; } - func.NAME = "func"; - func.args_signature = ["encoding"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "encode", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(fmt) { - var keys, r; + var keys,r; r = this; keys = Object.keys(fmt); var __iter14 = keys; @@ -1604,22 +1421,16 @@ _setup_str_prototype = function(args, kwargs) { return r; } - func.NAME = "func"; - func.args_signature = ["fmt"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(String.prototype, "format", { enumerable:false,value:func,writeable:true,configurable:true }); } -_setup_str_prototype.NAME = "_setup_str_prototype"; -_setup_str_prototype.args_signature = []; -_setup_str_prototype.kwargs_signature = { }; -_setup_str_prototype.types_signature = { }; _setup_str_prototype.pythonscript_function = true; _setup_str_prototype(); __sort_method = function(ob) { + ; if (__test_if_true__(ob instanceof Array)) { var f = function(a, b) { + ; if (( a ) < b) { return -1; } else { @@ -1631,23 +1442,16 @@ __sort_method = function(ob) { } } - f.NAME = "f"; - f.args_signature = ["a", "b"]; - f.kwargs_signature = { }; - f.types_signature = { }; return ob.sort( f ); } else { return ob.sort(); } } -__sort_method.NAME = "__sort_method"; -__sort_method.args_signature = ["ob"]; -__sort_method.kwargs_signature = { }; -__sort_method.types_signature = { }; _setup_array_prototype = function(args, kwargs) { + ; var func = function() { - var i, item; + var i,item; i = 0; while (( i ) < this.length) { item = this[i]; @@ -1661,12 +1465,9 @@ _setup_array_prototype = function(args, kwargs) { return this; } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "jsify", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(a) { + ; if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1674,28 +1475,18 @@ _setup_array_prototype = function(args, kwargs) { } } - func.NAME = "func"; - func.args_signature = ["a"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { + ; return this.length; } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(index) { + ; return this[index]; } - func.NAME = "func"; - func.args_signature = ["index"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); var __getitem__ = function(index) { ; @@ -1705,10 +1496,6 @@ _setup_array_prototype = function(args, kwargs) { return this[index]; } - __getitem__.NAME = "__getitem__"; - __getitem__.args_signature = ["index"]; - __getitem__.kwargs_signature = { }; - __getitem__.types_signature = { }; Object.defineProperty(Array.prototype, "__getitem__", { enumerable:false,value:__getitem__,writeable:true,configurable:true }); var __setitem__ = function(index, value) { ; @@ -1718,22 +1505,15 @@ _setup_array_prototype = function(args, kwargs) { this[index] = value; } - __setitem__.NAME = "__setitem__"; - __setitem__.args_signature = ["index", "value"]; - __setitem__.kwargs_signature = { }; - __setitem__.types_signature = { }; Object.defineProperty(Array.prototype, "__setitem__", { enumerable:false,value:__setitem__,writeable:true,configurable:true }); var func = function() { + ; return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(start, stop, step) { - var i, arr, n; + var i,arr,n; arr = []; start = (start | 0); stop = (stop | this.length); @@ -1771,10 +1551,6 @@ _setup_array_prototype = function(args, kwargs) { } } - func.NAME = "func"; - func.args_signature = ["start", "stop", "step"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "__getslice__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(start, stop, step, items) { var arr; @@ -1794,22 +1570,16 @@ _setup_array_prototype = function(args, kwargs) { this.splice.apply(this, arr); } - func.NAME = "func"; - func.args_signature = ["start", "stop", "step", "items"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "__setslice__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(item) { + ; this.push(item); return this; } - func.NAME = "func"; - func.args_signature = ["item"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); var extend = function(other) { + ; var __iter16 = other; if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { @@ -1819,10 +1589,6 @@ _setup_array_prototype = function(args, kwargs) { return this; } - extend.NAME = "extend"; - extend.args_signature = ["other"]; - extend.kwargs_signature = { }; - extend.types_signature = { }; Object.defineProperty(Array.prototype, "extend", { enumerable:false,value:extend,writeable:true,configurable:true }); var func = function(item) { var index; @@ -1830,10 +1596,6 @@ _setup_array_prototype = function(args, kwargs) { this.splice(index, 1); } - func.NAME = "func"; - func.args_signature = ["item"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "remove", { enumerable:false,value:func,writeable:true,configurable:true }); var insert = function(index, obj) { ; @@ -1843,19 +1605,12 @@ _setup_array_prototype = function(args, kwargs) { this.splice(index, 0, obj); } - insert.NAME = "insert"; - insert.args_signature = ["index", "obj"]; - insert.kwargs_signature = { }; - insert.types_signature = { }; Object.defineProperty(Array.prototype, "insert", { enumerable:false,value:insert,writeable:true,configurable:true }); var index = function(obj) { + ; return this.indexOf(obj); } - index.NAME = "index"; - index.args_signature = ["obj"]; - index.kwargs_signature = { }; - index.types_signature = { }; Object.defineProperty(Array.prototype, "index", { enumerable:false,value:index,writeable:true,configurable:true }); var count = function(obj) { var a; @@ -1871,13 +1626,9 @@ _setup_array_prototype = function(args, kwargs) { return a; } - count.NAME = "count"; - count.args_signature = ["obj"]; - count.kwargs_signature = { }; - count.types_signature = { }; Object.defineProperty(Array.prototype, "count", { enumerable:false,value:count,writeable:true,configurable:true }); var func = function(x, low, high) { - var a, mid; + var a,mid; if (( low ) === undefined) { low = 0; } @@ -1896,50 +1647,33 @@ _setup_array_prototype = function(args, kwargs) { return low; } - func.NAME = "func"; - func.args_signature = ["x", "low", "high"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "bisect", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { var f; var __lambda__ = function(i) { + ; return ( other.indexOf(i) ) == -1; } - __lambda__.NAME = "__lambda__"; - __lambda__.args_signature = ["i"]; - __lambda__.kwargs_signature = { }; - __lambda__.types_signature = { }; f = __lambda__; return this.filter(f); } - func.NAME = "func"; - func.args_signature = ["other"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "difference", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { var f; var __lambda__ = function(i) { + ; return ( other.indexOf(i) ) != -1; } - __lambda__.NAME = "__lambda__"; - __lambda__.args_signature = ["i"]; - __lambda__.kwargs_signature = { }; - __lambda__.types_signature = { }; f = __lambda__; return this.filter(f); } - func.NAME = "func"; - func.args_signature = ["other"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { + ; var __iter18 = this; if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { @@ -1951,13 +1685,9 @@ _setup_array_prototype = function(args, kwargs) { return true; } - func.NAME = "func"; - func.args_signature = ["other"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "issubset", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { - var i, arr; + var i,arr; arr = []; i = 0; while (( i ) < this.length) { @@ -1967,21 +1697,15 @@ _setup_array_prototype = function(args, kwargs) { return arr; } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(Array.prototype, "copy", { enumerable:false,value:func,writeable:true,configurable:true }); } -_setup_array_prototype.NAME = "_setup_array_prototype"; -_setup_array_prototype.args_signature = []; -_setup_array_prototype.kwargs_signature = { }; -_setup_array_prototype.types_signature = { }; _setup_array_prototype.pythonscript_function = true; _setup_array_prototype(); _setup_nodelist_prototype = function(args, kwargs) { + ; var func = function(a) { + ; if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1989,28 +1713,18 @@ _setup_nodelist_prototype = function(args, kwargs) { } } - func.NAME = "func"; - func.args_signature = ["a"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(NodeList.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { + ; return this.length; } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(NodeList.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(index) { + ; return this[index]; } - func.NAME = "func"; - func.args_signature = ["index"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(NodeList.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); var __getitem__ = function(index) { ; @@ -2020,10 +1734,6 @@ _setup_nodelist_prototype = function(args, kwargs) { return this[index]; } - __getitem__.NAME = "__getitem__"; - __getitem__.args_signature = ["index"]; - __getitem__.kwargs_signature = { }; - __getitem__.types_signature = { }; Object.defineProperty(NodeList.prototype, "__getitem__", { enumerable:false,value:__getitem__,writeable:true,configurable:true }); var __setitem__ = function(index, value) { ; @@ -2033,41 +1743,28 @@ _setup_nodelist_prototype = function(args, kwargs) { this[index] = value; } - __setitem__.NAME = "__setitem__"; - __setitem__.args_signature = ["index", "value"]; - __setitem__.kwargs_signature = { }; - __setitem__.types_signature = { }; Object.defineProperty(NodeList.prototype, "__setitem__", { enumerable:false,value:__setitem__,writeable:true,configurable:true }); var func = function() { + ; return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } - func.NAME = "func"; - func.args_signature = []; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(NodeList.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); var index = function(obj) { + ; return this.indexOf(obj); } - index.NAME = "index"; - index.args_signature = ["obj"]; - index.kwargs_signature = { }; - index.types_signature = { }; Object.defineProperty(NodeList.prototype, "index", { enumerable:false,value:index,writeable:true,configurable:true }); } -_setup_nodelist_prototype.NAME = "_setup_nodelist_prototype"; -_setup_nodelist_prototype.args_signature = []; -_setup_nodelist_prototype.kwargs_signature = { }; -_setup_nodelist_prototype.types_signature = { }; _setup_nodelist_prototype.pythonscript_function = true; if (__test_if_true__(( __NODEJS__ ) == false && ( __WEBWORKER__ ) == false)) { _setup_nodelist_prototype(); } bisect = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{"low": null, "high": null},args:["a", "x", "low", "high"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2083,14 +1780,10 @@ bisect = function(args, kwargs) { return a.bisect(x, low, high); } -bisect.NAME = "bisect"; -bisect.args_signature = ["a", "x", "low", "high"]; -bisect.kwargs_signature = { low:null,high:null }; -bisect.types_signature = { low:"None",high:"None" }; bisect.pythonscript_function = true; range = function(args, kwargs) { - var i, arr; - var __sig__, __args__; + var i,arr; + var __sig__,__args__; __sig__ = { kwargs:{},args:["num", "stop", "step"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2120,13 +1813,10 @@ range = function(args, kwargs) { return arr; } -range.NAME = "range"; -range.args_signature = ["num", "stop", "step"]; -range.kwargs_signature = { }; -range.types_signature = { }; range.pythonscript_function = true; xrange = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["num", "stop", "step"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2141,14 +1831,10 @@ xrange = function(args, kwargs) { return range([num, stop, step], __NULL_OBJECT__); } -xrange.NAME = "xrange"; -xrange.args_signature = ["num", "stop", "step"]; -xrange.kwargs_signature = { }; -xrange.types_signature = { }; xrange.pythonscript_function = true; sum = function(args, kwargs) { var a; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["arr"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2159,7 +1845,7 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b, __iterator__20; + var b,__iterator__20; __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 885: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__20; __next__20 = __get__(__iterator__20, "next"); @@ -2170,18 +1856,15 @@ sum = function(args, kwargs) { return a; } -sum.NAME = "sum"; -sum.args_signature = ["arr"]; -sum.kwargs_signature = { }; -sum.types_signature = { }; sum.pythonscript_function = true; -var StopIteration, __StopIteration_attrs, __StopIteration_parents; +var StopIteration,__StopIteration_attrs,__StopIteration_parents; __StopIteration_attrs = {}; __StopIteration_parents = []; __StopIteration_properties = {}; StopIteration = __create_class__("StopIteration", __StopIteration_parents, __StopIteration_attrs, __StopIteration_properties); len = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["ob"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2210,13 +1893,10 @@ len = function(args, kwargs) { } } -len.NAME = "len"; -len.args_signature = ["ob"]; -len.kwargs_signature = { }; -len.types_signature = { }; len.pythonscript_function = true; next = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["obj"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2229,14 +1909,10 @@ next = function(args, kwargs) { return __get__(__get__(obj, "next", "missing attribute `next` - line 909: return obj.next()"), "__call__")(); } -next.NAME = "next"; -next.args_signature = ["obj"]; -next.kwargs_signature = { }; -next.types_signature = { }; next.pythonscript_function = true; map = function(args, kwargs) { - var arr, v; - var __sig__, __args__; + var arr,v; + var __sig__,__args__; __sig__ = { kwargs:{},args:["func", "objs"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2248,7 +1924,7 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob, __iterator__21; + var ob,__iterator__21; __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 914: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__21; __next__21 = __get__(__iterator__21, "next"); @@ -2260,14 +1936,10 @@ map = function(args, kwargs) { return arr; } -map.NAME = "map"; -map.args_signature = ["func", "objs"]; -map.kwargs_signature = { }; -map.types_signature = { }; map.pythonscript_function = true; filter = function(args, kwargs) { var arr; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["func", "objs"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2279,7 +1951,7 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob, __iterator__22; + var ob,__iterator__22; __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 922: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__22; __next__22 = __get__(__iterator__22, "next"); @@ -2292,14 +1964,10 @@ filter = function(args, kwargs) { return arr; } -filter.NAME = "filter"; -filter.args_signature = ["func", "objs"]; -filter.kwargs_signature = { }; -filter.types_signature = { }; filter.pythonscript_function = true; min = function(args, kwargs) { var a; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["lst"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2310,7 +1978,7 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value, __iterator__23; + var value,__iterator__23; __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 931: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__23; __next__23 = __get__(__iterator__23, "next"); @@ -2327,14 +1995,10 @@ min = function(args, kwargs) { return a; } -min.NAME = "min"; -min.args_signature = ["lst"]; -min.kwargs_signature = { }; -min.types_signature = { }; min.pythonscript_function = true; max = function(args, kwargs) { var a; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["lst"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2345,7 +2009,7 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value, __iterator__24; + var value,__iterator__24; __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 938: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__24; __next__24 = __get__(__iterator__24, "next"); @@ -2362,13 +2026,10 @@ max = function(args, kwargs) { return a; } -max.NAME = "max"; -max.args_signature = ["lst"]; -max.kwargs_signature = { }; -max.types_signature = { }; max.pythonscript_function = true; abs = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["num"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2381,13 +2042,10 @@ abs = function(args, kwargs) { return Math.abs(num); } -abs.NAME = "abs"; -abs.args_signature = ["num"]; -abs.kwargs_signature = { }; -abs.types_signature = { }; abs.pythonscript_function = true; ord = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["char"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2400,13 +2058,10 @@ ord = function(args, kwargs) { return char.charCodeAt(0); } -ord.NAME = "ord"; -ord.args_signature = ["char"]; -ord.kwargs_signature = { }; -ord.types_signature = { }; ord.pythonscript_function = true; chr = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["num"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2419,10 +2074,6 @@ chr = function(args, kwargs) { return String.fromCharCode(num); } -chr.NAME = "chr"; -chr.args_signature = ["num"]; -chr.kwargs_signature = { }; -chr.types_signature = { }; chr.pythonscript_function = true; __ArrayIterator = function(arr, index) { __ArrayIterator.__init__(this, arr, index); @@ -2434,6 +2085,7 @@ __ArrayIterator = function(arr, index) { __ArrayIterator.__uid__ = ("" + _PythonJS_UID); _PythonJS_UID += 1; __ArrayIterator.prototype.__init__ = function(arr, index) { + ; this.arr = arr; this.index = index; this.length = arr.length; @@ -2441,7 +2093,7 @@ __ArrayIterator.prototype.__init__ = function(arr, index) { __ArrayIterator.__init__ = function () { return __ArrayIterator.prototype.__init__.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; __ArrayIterator.prototype.next = function() { - var index, arr; + var index,arr; index = this.index; this.index += 1; arr = this.arr; @@ -2451,12 +2103,13 @@ __ArrayIterator.prototype.next = function() { __ArrayIterator.next = function () { return __ArrayIterator.prototype.next.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; __ArrayIterator.prototype.__properties__ = { }; __ArrayIterator.prototype.__unbound_methods__ = { }; -var Iterator, __Iterator_attrs, __Iterator_parents; +var Iterator,__Iterator_attrs,__Iterator_parents; __Iterator_attrs = {}; __Iterator_parents = []; __Iterator_properties = {}; __Iterator___init__ = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "obj", "index"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2474,15 +2127,11 @@ __Iterator___init__ = function(args, kwargs) { self.obj_get = __get__(obj, "get", "missing attribute `get` - line 973: self.obj_get = obj.get ## cache this for speed"); } -__Iterator___init__.NAME = "__Iterator___init__"; -__Iterator___init__.args_signature = ["self", "obj", "index"]; -__Iterator___init__.kwargs_signature = { }; -__Iterator___init__.types_signature = { }; __Iterator___init__.pythonscript_function = true; __Iterator_attrs.__init__ = __Iterator___init__; __Iterator_next = function(args, kwargs) { var index; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2497,15 +2146,12 @@ __Iterator_next = function(args, kwargs) { return self.obj_get([index], __jsdict([])); } -__Iterator_next.NAME = "__Iterator_next"; -__Iterator_next.args_signature = ["self"]; -__Iterator_next.kwargs_signature = { }; -__Iterator_next.types_signature = { }; __Iterator_next.pythonscript_function = true; __Iterator_attrs.next = __Iterator_next; Iterator = __create_class__("Iterator", __Iterator_parents, __Iterator_attrs, __Iterator_properties); tuple = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2532,13 +2178,10 @@ tuple = function(args, kwargs) { } } -tuple.NAME = "tuple"; -tuple.args_signature = ["a"]; -tuple.kwargs_signature = { }; -tuple.types_signature = { }; tuple.pythonscript_function = true; list = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2565,18 +2208,14 @@ list = function(args, kwargs) { } } -list.NAME = "list"; -list.args_signature = ["a"]; -list.kwargs_signature = { }; -list.types_signature = { }; list.pythonscript_function = true; -var dict, __dict_attrs, __dict_parents; +var dict,__dict_attrs,__dict_parents; __dict_attrs = {}; __dict_parents = []; __dict_properties = {}; __dict___init__ = function(args, kwargs) { - var ob, value; - var __sig__, __args__; + var ob,value; + var __sig__,__args__; __sig__ = { kwargs:{"js_object": null, "pointer": null},args:["self", "js_object", "pointer"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2595,27 +2234,27 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o, __iterator__25; + var o,__iterator__25; __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 1028: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__25; __next__25 = __get__(__iterator__25, "next"); while (( __iterator__25.index ) < __iterator__25.length) { o = __next__25(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1030: self.__setitem__( o[0], o[1] )"), "__call__")([__get__(o, "__getitem__", "line 1030: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__), __get__(o, "__getitem__", "line 1030: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1030: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1030: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1030: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1032: self.__setitem__( o['key'], o['value'] )"), "__call__")([__get__(o, "__getitem__", "line 1032: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__), __get__(o, "__getitem__", "line 1032: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1032: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1032: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1032: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key, __iterator__26; + var key,__iterator__26; __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1034: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { key = __next__26(); - value = __get__(ob, "__getitem__", "line 1035: value = ob[ key ]")([key], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1035: value = ob[ key ]")([key], __NULL_OBJECT__)); __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1036: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { @@ -2627,15 +2266,11 @@ __dict___init__ = function(args, kwargs) { } } -__dict___init__.NAME = "__dict___init__"; -__dict___init__.args_signature = ["self", "js_object", "pointer"]; -__dict___init__.kwargs_signature = { js_object:null,pointer:null }; -__dict___init__.types_signature = { js_object:"None",pointer:"None" }; __dict___init__.pythonscript_function = true; __dict_attrs.__init__ = __dict___init__; __dict_jsify = function(args, kwargs) { - var keys, value; - var __sig__, __args__; + var keys,value; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2646,7 +2281,7 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key, __iterator__27; + var key,__iterator__27; __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 1044: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); @@ -2666,14 +2301,11 @@ __dict_jsify = function(args, kwargs) { return self["$wrapped"]; } -__dict_jsify.NAME = "__dict_jsify"; -__dict_jsify.args_signature = ["self"]; -__dict_jsify.kwargs_signature = { }; -__dict_jsify.types_signature = { }; __dict_jsify.pythonscript_function = true; __dict_attrs.jsify = __dict_jsify; __dict_copy = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2686,15 +2318,11 @@ __dict_copy = function(args, kwargs) { return __get__(dict, "__call__")([self], __NULL_OBJECT__); } -__dict_copy.NAME = "__dict_copy"; -__dict_copy.args_signature = ["self"]; -__dict_copy.kwargs_signature = { }; -__dict_copy.types_signature = { }; -__dict_copy.return_type = "dict"; __dict_copy.pythonscript_function = true; __dict_attrs.copy = __dict_copy; __dict_clear = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2707,15 +2335,11 @@ __dict_clear = function(args, kwargs) { self["$wrapped"] = __jsdict([]); } -__dict_clear.NAME = "__dict_clear"; -__dict_clear.args_signature = ["self"]; -__dict_clear.kwargs_signature = { }; -__dict_clear.types_signature = { }; __dict_clear.pythonscript_function = true; __dict_attrs.clear = __dict_clear; __dict_has_key = function(args, kwargs) { var __dict; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "key"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2737,14 +2361,11 @@ __dict_has_key = function(args, kwargs) { } } -__dict_has_key.NAME = "__dict_has_key"; -__dict_has_key.args_signature = ["self", "key"]; -__dict_has_key.kwargs_signature = { }; -__dict_has_key.types_signature = { }; __dict_has_key.pythonscript_function = true; __dict_attrs.has_key = __dict_has_key; __dict_update = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "other"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2755,25 +2376,21 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key, __iterator__28; + var key,__iterator__28; __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 1072: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { key = __next__28(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1073: self.__setitem__( key, other[key] )"), "__call__")([key, __get__(other, "__getitem__", "line 1073: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__)], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1073: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1073: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } -__dict_update.NAME = "__dict_update"; -__dict_update.args_signature = ["self", "other"]; -__dict_update.kwargs_signature = { }; -__dict_update.types_signature = { }; __dict_update.pythonscript_function = true; __dict_attrs.update = __dict_update; __dict_items = function(args, kwargs) { var arr; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2784,7 +2401,7 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key, __iterator__29; + var key,__iterator__29; __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1077: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__29; __next__29 = __get__(__iterator__29, "next"); @@ -2795,14 +2412,11 @@ __dict_items = function(args, kwargs) { return arr; } -__dict_items.NAME = "__dict_items"; -__dict_items.args_signature = ["self"]; -__dict_items.kwargs_signature = { }; -__dict_items.types_signature = { }; __dict_items.pythonscript_function = true; __dict_attrs.items = __dict_items; __dict_get = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{"_default": null},args:["self", "key", "_default"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2822,14 +2436,11 @@ return _default; } } -__dict_get.NAME = "__dict_get"; -__dict_get.args_signature = ["self", "key", "_default"]; -__dict_get.kwargs_signature = { _default:null }; -__dict_get.types_signature = { _default:"None" }; __dict_get.pythonscript_function = true; __dict_attrs.get = __dict_get; __dict_set = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "key", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2844,15 +2455,11 @@ __dict_set = function(args, kwargs) { __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1088: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } -__dict_set.NAME = "__dict_set"; -__dict_set.args_signature = ["self", "key", "value"]; -__dict_set.kwargs_signature = { }; -__dict_set.types_signature = { }; __dict_set.pythonscript_function = true; __dict_attrs.set = __dict_set; __dict___len__ = function(args, kwargs) { var __dict; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2866,15 +2473,11 @@ __dict___len__ = function(args, kwargs) { return Object.keys(__dict).length; } -__dict___len__.NAME = "__dict___len__"; -__dict___len__.args_signature = ["self"]; -__dict___len__.kwargs_signature = { }; -__dict___len__.types_signature = { }; __dict___len__.pythonscript_function = true; __dict_attrs.__len__ = __dict___len__; __dict___getitem__ = function(args, kwargs) { var __dict; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "key"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2899,15 +2502,11 @@ __dict___getitem__ = function(args, kwargs) { throw new KeyError(key); } -__dict___getitem__.NAME = "__dict___getitem__"; -__dict___getitem__.args_signature = ["self", "key"]; -__dict___getitem__.kwargs_signature = { }; -__dict___getitem__.types_signature = { }; __dict___getitem__.pythonscript_function = true; __dict_attrs.__getitem__ = __dict___getitem__; __dict___setitem__ = function(args, kwargs) { var __dict; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "key", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2930,14 +2529,11 @@ __dict___setitem__ = function(args, kwargs) { } } -__dict___setitem__.NAME = "__dict___setitem__"; -__dict___setitem__.args_signature = ["self", "key", "value"]; -__dict___setitem__.kwargs_signature = { }; -__dict___setitem__.types_signature = { }; __dict___setitem__.pythonscript_function = true; __dict_attrs.__setitem__ = __dict___setitem__; __dict_keys = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2950,15 +2546,11 @@ __dict_keys = function(args, kwargs) { return Object.keys(self["$wrapped"]); } -__dict_keys.NAME = "__dict_keys"; -__dict_keys.args_signature = ["self"]; -__dict_keys.kwargs_signature = { }; -__dict_keys.types_signature = { }; __dict_keys.pythonscript_function = true; __dict_attrs.keys = __dict_keys; __dict_pop = function(args, kwargs) { - var js_object, v; - var __sig__, __args__; + var js_object,v; + var __sig__,__args__; __sig__ = { kwargs:{"d": null},args:["self", "key", "d"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -2980,15 +2572,11 @@ __dict_pop = function(args, kwargs) { } } -__dict_pop.NAME = "__dict_pop"; -__dict_pop.args_signature = ["self", "key", "d"]; -__dict_pop.kwargs_signature = { d:null }; -__dict_pop.types_signature = { d:"None" }; __dict_pop.pythonscript_function = true; __dict_attrs.pop = __dict_pop; __dict_values = function(args, kwargs) { - var keys, out; - var __sig__, __args__; + var keys,out; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3009,14 +2597,11 @@ __dict_values = function(args, kwargs) { return out; } -__dict_values.NAME = "__dict_values"; -__dict_values.args_signature = ["self"]; -__dict_values.kwargs_signature = { }; -__dict_values.types_signature = { }; __dict_values.pythonscript_function = true; __dict_attrs.values = __dict_values; __dict___contains__ = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3036,14 +2621,11 @@ return false; } } -__dict___contains__.NAME = "__dict___contains__"; -__dict___contains__.args_signature = ["self", "value"]; -__dict___contains__.kwargs_signature = { }; -__dict___contains__.types_signature = { }; __dict___contains__.pythonscript_function = true; __dict_attrs.__contains__ = __dict___contains__; __dict___iter__ = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3056,17 +2638,12 @@ __dict___iter__ = function(args, kwargs) { return __get__(Iterator, "__call__")([__jsdict_keys(self), 0], __NULL_OBJECT__); } -__dict___iter__.NAME = "__dict___iter__"; -__dict___iter__.args_signature = ["self"]; -__dict___iter__.kwargs_signature = { }; -__dict___iter__.types_signature = { }; -__dict___iter__.return_type = "Iterator"; __dict___iter__.pythonscript_function = true; __dict_attrs.__iter__ = __dict___iter__; dict = __create_class__("dict", __dict_parents, __dict_attrs, __dict_properties); set = function(args, kwargs) { - var keys, mask, s, hashtable, key, fallback; - var __sig__, __args__; + var keys,mask,s,hashtable,key,fallback; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3111,7 +2688,6 @@ set = function(args, kwargs) { keys.push(key); } else { fallback = true; - __break__ = true; break; } } @@ -3140,13 +2716,10 @@ set = function(args, kwargs) { return s; } -set.NAME = "set"; -set.args_signature = ["a"]; -set.kwargs_signature = { }; -set.types_signature = { }; set.pythonscript_function = true; frozenset = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3159,12 +2732,8 @@ frozenset = function(args, kwargs) { return set([a], __NULL_OBJECT__); } -frozenset.NAME = "frozenset"; -frozenset.args_signature = ["a"]; -frozenset.kwargs_signature = { }; -frozenset.types_signature = { }; frozenset.pythonscript_function = true; -var array, __array_attrs, __array_parents; +var array,__array_attrs,__array_parents; __array_attrs = {}; __array_parents = []; __array_properties = {}; @@ -3173,8 +2742,8 @@ __array_attrs.typecodes = __array_typecodes; __array_typecode_names = __jsdict([["c", "Int8"], ["b", "Int8"], ["B", "Uint8"], ["u", "Uint16"], ["h", "Int16"], ["H", "Uint16"], ["i", "Int32"], ["I", "Uint32"], ["f", "Float32"], ["d", "Float64"], ["float32", "Float32"], ["float16", "Int16"], ["float8", "Int8"], ["int32", "Int32"], ["uint32", "Uint32"], ["int16", "Int16"], ["uint16", "Uint16"], ["int8", "Int8"], ["uint8", "Uint8"]]); __array_attrs.typecode_names = __array_typecode_names; __array___init__ = function(args, kwargs) { - var size, buff; - var __sig__, __args__; + var size,buff; + var __sig__,__args__; __sig__ = { kwargs:{"initializer": null, "little_endian": false},args:["self", "typecode", "initializer", "little_endian"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3192,7 +2761,7 @@ __array___init__ = function(args, kwargs) { self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); - self.bytes = __mul_op(self.length, self.itemsize); + self.bytes = (self.length * self.itemsize); if (( self.typecode ) == "float8") { self._scale = max([[abs([min([initializer], __NULL_OBJECT__)], __NULL_OBJECT__), max([initializer], __NULL_OBJECT__)]], __NULL_OBJECT__); self._norm_get = (self._scale / 127); @@ -3215,14 +2784,11 @@ __array___init__ = function(args, kwargs) { __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1313: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } -__array___init__.NAME = "__array___init__"; -__array___init__.args_signature = ["self", "typecode", "initializer", "little_endian"]; -__array___init__.kwargs_signature = { initializer:null,little_endian:false }; -__array___init__.types_signature = { initializer:"None",little_endian:"False" }; __array___init__.pythonscript_function = true; __array_attrs.__init__ = __array___init__; __array___len__ = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3235,15 +2801,11 @@ __array___len__ = function(args, kwargs) { return self.length; } -__array___len__.NAME = "__array___len__"; -__array___len__.args_signature = ["self"]; -__array___len__.kwargs_signature = { }; -__array___len__.types_signature = { }; __array___len__.pythonscript_function = true; __array_attrs.__len__ = __array___len__; __array___contains__ = function(args, kwargs) { var arr; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3262,15 +2824,11 @@ __array___contains__ = function(args, kwargs) { } } -__array___contains__.NAME = "__array___contains__"; -__array___contains__.args_signature = ["self", "value"]; -__array___contains__.kwargs_signature = { }; -__array___contains__.types_signature = { }; __array___contains__.pythonscript_function = true; __array_attrs.__contains__ = __array___contains__; __array___getitem__ = function(args, kwargs) { - var func_name, dataview, value, step, func, offset; - var __sig__, __args__; + var func_name,dataview,value,step,func,offset; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "index"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3282,17 +2840,17 @@ __array___getitem__ = function(args, kwargs) { var self = __args__['self']; var index = __args__['index']; step = self.itemsize; - offset = __mul_op(step, index); + offset = (step * index); dataview = self.dataview; func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1331: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1331: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); if (( self.typecode ) == "float8") { - value = __mul_op(value, self._norm_get); + value = (value * self._norm_get); } else { if (( self.typecode ) == "float16") { - value = __mul_op(value, self._norm_get); + value = (value * self._norm_get); } } return value; @@ -3301,15 +2859,11 @@ __array___getitem__ = function(args, kwargs) { } } -__array___getitem__.NAME = "__array___getitem__"; -__array___getitem__.args_signature = ["self", "index"]; -__array___getitem__.kwargs_signature = { }; -__array___getitem__.types_signature = { }; __array___getitem__.pythonscript_function = true; __array_attrs.__getitem__ = __array___getitem__; __array___setitem__ = function(args, kwargs) { - var func_name, dataview, step, func, offset; - var __sig__, __args__; + var func_name,dataview,step,func,offset; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "index", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3325,16 +2879,16 @@ __array___setitem__ = function(args, kwargs) { if (( index ) < 0) { index = ((self.length + index) - 1); } - offset = __mul_op(step, index); + offset = (step * index); dataview = self.dataview; func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1350: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1350: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { - value = __mul_op(value, self._norm_set); + value = (value * self._norm_set); } else { if (( self.typecode ) == "float16") { - value = __mul_op(value, self._norm_set); + value = (value * self._norm_set); } } func(offset, value); @@ -3343,14 +2897,11 @@ __array___setitem__ = function(args, kwargs) { } } -__array___setitem__.NAME = "__array___setitem__"; -__array___setitem__.args_signature = ["self", "index", "value"]; -__array___setitem__.kwargs_signature = { }; -__array___setitem__.types_signature = { }; __array___setitem__.pythonscript_function = true; __array_attrs.__setitem__ = __array___setitem__; __array___iter__ = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3363,15 +2914,11 @@ __array___iter__ = function(args, kwargs) { return __get__(Iterator, "__call__")([self, 0], __NULL_OBJECT__); } -__array___iter__.NAME = "__array___iter__"; -__array___iter__.args_signature = ["self"]; -__array___iter__.kwargs_signature = { }; -__array___iter__.types_signature = { }; -__array___iter__.return_type = "Iterator"; __array___iter__.pythonscript_function = true; __array_attrs.__iter__ = __array___iter__; __array_get = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "index"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3385,15 +2932,11 @@ __array_get = function(args, kwargs) { return __array___getitem__([self, index], {}); } -__array_get.NAME = "__array_get"; -__array_get.args_signature = ["self", "index"]; -__array_get.kwargs_signature = { }; -__array_get.types_signature = { }; __array_get.pythonscript_function = true; __array_attrs.get = __array_get; __array_fromlist = function(args, kwargs) { - var typecode, i, func_name, dataview, length, item, step, func, offset, size; - var __sig__, __args__; + var typecode,i,func_name,dataview,length,item,step,func,offset,size; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "lst"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3407,7 +2950,7 @@ __array_fromlist = function(args, kwargs) { length = len([lst], __NULL_OBJECT__); step = self.itemsize; typecode = self.typecode; - size = __mul_op(length, step); + size = (length * step); dataview = self.dataview; func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1375: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1375: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); @@ -3415,7 +2958,7 @@ __array_fromlist = function(args, kwargs) { i = 0; offset = 0; while (( i ) < length) { - item = __get__(lst, "__getitem__", "line 1380: item = lst[i]")([i], __NULL_OBJECT__); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1380: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3432,15 +2975,11 @@ __array_fromlist = function(args, kwargs) { } } -__array_fromlist.NAME = "__array_fromlist"; -__array_fromlist.args_signature = ["self", "lst"]; -__array_fromlist.kwargs_signature = { }; -__array_fromlist.types_signature = { }; __array_fromlist.pythonscript_function = true; __array_attrs.fromlist = __array_fromlist; __array_resize = function(args, kwargs) { - var source, new_buff, target, new_size, buff; - var __sig__, __args__; + var source,new_buff,target,new_size,buff; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "length"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3453,7 +2992,7 @@ __array_resize = function(args, kwargs) { var length = __args__['length']; buff = self.buffer; source = new Uint8Array(buff); - new_size = __mul_op(length, self.itemsize); + new_size = (length * self.itemsize); new_buff = new ArrayBuffer(new_size); target = new Uint8Array(new_buff); target.set(source); @@ -3463,15 +3002,11 @@ __array_resize = function(args, kwargs) { self.dataview = new DataView(new_buff); } -__array_resize.NAME = "__array_resize"; -__array_resize.args_signature = ["self", "length"]; -__array_resize.kwargs_signature = { }; -__array_resize.types_signature = { }; __array_resize.pythonscript_function = true; __array_attrs.resize = __array_resize; __array_append = function(args, kwargs) { var length; - var __sig__, __args__; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3487,14 +3022,11 @@ __array_append = function(args, kwargs) { __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } -__array_append.NAME = "__array_append"; -__array_append.args_signature = ["self", "value"]; -__array_append.kwargs_signature = { }; -__array_append.types_signature = { }; __array_append.pythonscript_function = true; __array_attrs.append = __array_append; __array_extend = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "lst"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3505,7 +3037,7 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value, __iterator__34; + var value,__iterator__34; __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1412: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__34; __next__34 = __get__(__iterator__34, "next"); @@ -3515,15 +3047,11 @@ __array_extend = function(args, kwargs) { } } -__array_extend.NAME = "__array_extend"; -__array_extend.args_signature = ["self", "lst"]; -__array_extend.kwargs_signature = { }; -__array_extend.types_signature = { }; __array_extend.pythonscript_function = true; __array_attrs.extend = __array_extend; __array_to_array = function(args, kwargs) { - var i, item, arr; - var __sig__, __args__; + var i,item,arr; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3543,14 +3071,11 @@ __array_to_array = function(args, kwargs) { return arr; } -__array_to_array.NAME = "__array_to_array"; -__array_to_array.args_signature = ["self"]; -__array_to_array.kwargs_signature = { }; -__array_to_array.types_signature = { }; __array_to_array.pythonscript_function = true; __array_attrs.to_array = __array_to_array; __array_to_list = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3563,15 +3088,11 @@ __array_to_list = function(args, kwargs) { return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1425: return self.to_array()"), "__call__")(); } -__array_to_list.NAME = "__array_to_list"; -__array_to_list.args_signature = ["self"]; -__array_to_list.kwargs_signature = { }; -__array_to_list.types_signature = { }; __array_to_list.pythonscript_function = true; __array_attrs.to_list = __array_to_list; __array_to_ascii = function(args, kwargs) { - var i, length, arr, string; - var __sig__, __args__; + var i,length,arr,string; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3594,19 +3115,16 @@ __array_to_ascii = function(args, kwargs) { return string; } -__array_to_ascii.NAME = "__array_to_ascii"; -__array_to_ascii.args_signature = ["self"]; -__array_to_ascii.kwargs_signature = { }; -__array_to_ascii.types_signature = { }; __array_to_ascii.pythonscript_function = true; __array_attrs.to_ascii = __array_to_ascii; array = __create_class__("array", __array_parents, __array_attrs, __array_properties); -var file, __file_attrs, __file_parents; +var file,__file_attrs,__file_parents; __file_attrs = {}; __file_parents = []; __file_properties = {}; __file___init__ = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "path", "flags"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3634,15 +3152,11 @@ __file___init__ = function(args, kwargs) { self.flags = flags; } -__file___init__.NAME = "__file___init__"; -__file___init__.args_signature = ["self", "path", "flags"]; -__file___init__.kwargs_signature = { }; -__file___init__.types_signature = { }; __file___init__.pythonscript_function = true; __file_attrs.__init__ = __file___init__; __file_read = function(args, kwargs) { - var _fs, path; - var __sig__, __args__; + var _fs,path; + var __sig__,__args__; __sig__ = { kwargs:{"binary": false},args:["self", "binary"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3662,15 +3176,11 @@ __file_read = function(args, kwargs) { } } -__file_read.NAME = "__file_read"; -__file_read.args_signature = ["self", "binary"]; -__file_read.kwargs_signature = { binary:false }; -__file_read.types_signature = { binary:"False" }; __file_read.pythonscript_function = true; __file_attrs.read = __file_read; __file_write = function(args, kwargs) { - var _fs, path; - var __sig__, __args__; + var _fs,path; + var __sig__,__args__; __sig__ = { kwargs:{"binary": false},args:["self", "data", "binary"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3691,14 +3201,11 @@ __file_write = function(args, kwargs) { } } -__file_write.NAME = "__file_write"; -__file_write.args_signature = ["self", "data", "binary"]; -__file_write.kwargs_signature = { binary:false }; -__file_write.types_signature = { binary:"False" }; __file_write.pythonscript_function = true; __file_attrs.write = __file_write; __file_close = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3711,15 +3218,12 @@ __file_close = function(args, kwargs) { /*pass*/ } -__file_close.NAME = "__file_close"; -__file_close.args_signature = ["self"]; -__file_close.kwargs_signature = { }; -__file_close.types_signature = { }; __file_close.pythonscript_function = true; __file_attrs.close = __file_close; file = __create_class__("file", __file_parents, __file_attrs, __file_properties); __open__ = function(args, kwargs) { - var __sig__, __args__; + ; + var __sig__,__args__; __sig__ = { kwargs:{"mode": null},args:["path", "mode"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ @@ -3733,15 +3237,10 @@ __open__ = function(args, kwargs) { return __get__(file, "__call__")([path, mode], __NULL_OBJECT__); } -__open__.NAME = "__open__"; -__open__.args_signature = ["path", "mode"]; -__open__.kwargs_signature = { mode:null }; -__open__.types_signature = { mode:"None" }; -__open__.return_type = "file"; __open__.pythonscript_function = true; json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (function (o) {return JSON.stringify(o);})]]); __get_other_workers_with_shared_arg = function(worker, ob) { - var a, other, args; + var a,other,args; a = []; var __iter23 = threading.workers; if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } @@ -3765,18 +3264,14 @@ __get_other_workers_with_shared_arg = function(worker, ob) { return a; } -__get_other_workers_with_shared_arg.NAME = "__get_other_workers_with_shared_arg"; -__get_other_workers_with_shared_arg.args_signature = ["worker", "ob"]; -__get_other_workers_with_shared_arg.kwargs_signature = { }; -__get_other_workers_with_shared_arg.types_signature = { }; threading = __jsdict([["workers", []], ["_blocking_callback", null]]); __start_new_thread = function(f, args) { - var jsargs, worker; + var jsargs,worker; worker = new Worker(f); worker.__uid__ = len(threading.workers); threading.workers.append(__jsdict([["worker", worker], ["args", args]])); var func = function(event) { - var a, res, value; + var a,res,value; if (( event.data.type ) == "terminate") { worker.terminate(); } else { @@ -3818,10 +3313,6 @@ __start_new_thread = function(f, args) { } } - func.NAME = "func"; - func.args_signature = ["event"]; - func.kwargs_signature = { }; - func.types_signature = { }; worker.onmessage = func; jsargs = []; var i; @@ -3844,70 +3335,48 @@ __start_new_thread = function(f, args) { return worker; } -__start_new_thread.NAME = "__start_new_thread"; -__start_new_thread.args_signature = ["f", "args"]; -__start_new_thread.kwargs_signature = { }; -__start_new_thread.types_signature = { }; __gen_worker_append = function(worker, ob, index) { + ; var append = function(item) { + ; worker.postMessage(__jsdict([["type", "append"], ["argindex", index], ["value", item]])); ob.push(item); } - append.NAME = "append"; - append.args_signature = ["item"]; - append.kwargs_signature = { }; - append.types_signature = { }; Object.defineProperty(ob, "append", __jsdict([["enumerable", false], ["value", append], ["writeable", true], ["configurable", true]])); } -__gen_worker_append.NAME = "__gen_worker_append"; -__gen_worker_append.args_signature = ["worker", "ob", "index"]; -__gen_worker_append.kwargs_signature = { }; -__gen_worker_append.types_signature = { }; __webworker_wrap = function(ob, argindex) { + ; if (__test_if_true__(ob instanceof Array)) { var func = function(index, item) { + ; postMessage(__jsdict([["type", "__setitem__"], ["index", index], ["value", item], ["argindex", argindex]])); Array.prototype.__setitem__.call(ob, index, item); } - func.NAME = "func"; - func.args_signature = ["index", "item"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(ob, "__setitem__", __jsdict([["enumerable", false], ["value", func], ["writeable", true], ["configurable", true]])); var func = function(item) { + ; postMessage(__jsdict([["type", "append"], ["value", item], ["argindex", argindex]])); Array.prototype.push.call(ob, item); } - func.NAME = "func"; - func.args_signature = ["item"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(ob, "append", __jsdict([["enumerable", false], ["value", func], ["writeable", true], ["configurable", true]])); } else { if (( typeof(ob) ) == "object") { var func = function(key, item) { + ; postMessage(__jsdict([["type", "__setitem__"], ["index", key], ["value", item], ["argindex", argindex]])); ob[key] = item; } - func.NAME = "func"; - func.args_signature = ["key", "item"]; - func.kwargs_signature = { }; - func.types_signature = { }; Object.defineProperty(ob, "__setitem__", __jsdict([["enumerable", false], ["value", func], ["writeable", true], ["configurable", true]])); } } return ob; } -__webworker_wrap.NAME = "__webworker_wrap"; -__webworker_wrap.args_signature = ["ob", "argindex"]; -__webworker_wrap.kwargs_signature = { }; -__webworker_wrap.types_signature = { }; __rpc__ = function(url, func, args) { var req; req = new XMLHttpRequest(); @@ -3917,10 +3386,6 @@ __rpc__ = function(url, func, args) { return JSON.parse(req.responseText); } -__rpc__.NAME = "__rpc__"; -__rpc__.args_signature = ["url", "func", "args"]; -__rpc__.kwargs_signature = { }; -__rpc__.types_signature = { }; __rpc_iter__ = function(url, attr) { var req; req = new XMLHttpRequest(); @@ -3930,10 +3395,6 @@ __rpc_iter__ = function(url, attr) { return JSON.parse(req.responseText); } -__rpc_iter__.NAME = "__rpc_iter__"; -__rpc_iter__.args_signature = ["url", "attr"]; -__rpc_iter__.kwargs_signature = { }; -__rpc_iter__.types_signature = { }; __rpc_set__ = function(url, attr, value) { var req; req = new XMLHttpRequest(); @@ -3942,10 +3403,6 @@ __rpc_set__ = function(url, attr, value) { req.send(JSON.stringify(__jsdict([["set", attr], ["value", value]]))); } -__rpc_set__.NAME = "__rpc_set__"; -__rpc_set__.args_signature = ["url", "attr", "value"]; -__rpc_set__.kwargs_signature = { }; -__rpc_set__.types_signature = { }; __rpc_get__ = function(url, attr) { var req; req = new XMLHttpRequest(); @@ -3954,8 +3411,3 @@ __rpc_get__ = function(url, attr) { req.send(JSON.stringify(__jsdict([["get", attr]]))); return JSON.parse(req.responseText); } - -__rpc_get__.NAME = "__rpc_get__"; -__rpc_get__.args_signature = ["url", "attr"]; -__rpc_get__.kwargs_signature = { }; -__rpc_get__.types_signature = { }; \ No newline at end of file From c393edd7c39aa908c1c756ff42800f3706e625c2 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 14 Jun 2014 19:22:34 -0700 Subject: [PATCH 038/222] new syntax to typedef the return type of a function. --- pythonjs/typedpython.py | 21 ++++++++++++++++++++- regtests/webclgl/subroutine.py | 23 +++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 regtests/webclgl/subroutine.py diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 84fa764..18ca9d2 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -46,7 +46,22 @@ def transform_source( source, strip=False ): a.append( char ) else: a.append( char ) - output.append( ''.join(a) ) + + c = ''.join(a) + if '= def ' in c: + x, c = c.split('= def ') + indent = [] + pre = [] + for char in x: + if char in __whitespace: + indent.append(char) + else: + pre.append( char ) + indent = ''.join(indent) + pre = ''.join(pre) + output.append( indent + '@returns(%s)' %pre) + c = indent+'def '+c + output.append( c ) return '\n'.join(output) @@ -56,6 +71,10 @@ def transform_source( source, strip=False ): float b = 1.1 str c = "hi" int d +int def xxx(): pass +if True: + float* def Y(): + pass ''' if __name__ == '__main__': diff --git a/regtests/webclgl/subroutine.py b/regtests/webclgl/subroutine.py new file mode 100644 index 0000000..de57ccf --- /dev/null +++ b/regtests/webclgl/subroutine.py @@ -0,0 +1,23 @@ +"""subroutine""" + +def main(): + with glsl as myfunc: + def main(buffA, buffB, num): + float* buffA + float* buffB + float num + vec2 n = get_global_id() ## WebCL API + float result = 0.0 + for i in range(1000): + result = sqrt(result + A[n] + B[n] + float(i)) + return mysub( result * num ) + + float def mysub(x,y): + float x + float y + return x+y + + A = [1,2,3] + B = [4,5,6] + res = myfunc( A, B, 2.0 ) + print(res) \ No newline at end of file From 3351aa7f4a290f328f9e2294e4bf4a69a9e2e0a1 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 14 Jun 2014 19:42:47 -0700 Subject: [PATCH 039/222] new benchmark testing big array mult WebCLGL vs NumPy. --- regtests/bench/webclgl_array_mult.py | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 regtests/bench/webclgl_array_mult.py diff --git a/regtests/bench/webclgl_array_mult.py b/regtests/bench/webclgl_array_mult.py new file mode 100644 index 0000000..ff57deb --- /dev/null +++ b/regtests/bench/webclgl_array_mult.py @@ -0,0 +1,35 @@ +"""big array mult""" +from time import time +from random import random + +def main(): + ARRAY_SIZE = 1024*1024*4 + + with glsl as myfunc: + def main(A, B, C, D): + float* A + float* B + float* C + float* D + vec2 n = get_global_id() ## WebCL API + return A[n] * B[n] * C[n] * D[n] + + + a = [ random() for i in range(ARRAY_SIZE)] + b = [ random() for i in range(ARRAY_SIZE)] + c = [ random() for i in range(ARRAY_SIZE)] + d = [ random() for i in range(ARRAY_SIZE)] + + if PYTHON=='PYTHONJS': + start = time() + res = myfunc( a,b,c,d ) + #print(res) + print( time()-start ) + else: + a = numpy.array(a, dtype=numpy.float32 ) + b = numpy.array(b, dtype=numpy.float32 ) + c = numpy.array(c, dtype=numpy.float32 ) + d = numpy.array(d, dtype=numpy.float32 ) + start = time() + res = a * b * c * d + print( time()-start ) From 67c786d25f85e4c3455d184065bbc62294b6d2a8 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 14 Jun 2014 20:05:43 -0700 Subject: [PATCH 040/222] test runner now inserts WebCLGL into runtime when running tests under nodewebkit. --- pythonjs/pythonjs.py | 9 ++++++--- regtests/run.py | 20 +++++++++++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 8d94849..5062ef8 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -234,16 +234,19 @@ def _visit_function(self, node): lines.append('function %s( %s, __offset ) {' %(glsl_wrapper_name, ','.join(args)) ) lines.append(' __offset = __offset || 0') ## note by default: 0 allows 0-1.0 lines.append(' var __webclgl = new WebCLGL()') - lines.append(' var __kernel = __webclgl.createKernel( __shader__ );') + lines.append(' var __kernel = __webclgl.createKernel( "\\n".join(__shader__) );') + lines.append(' var __return_length = 1') - lines.append(' var return_buffer = __webclgl.createBuffer(1, "FLOAT", __offset)') ## TODO length of return buffer for i,arg in enumerate(args): lines.append(' if (%s instanceof Array) {' %arg) + lines.append(' __return_length = %s.length' %arg) lines.append(' var %s_buffer = __webclgl.createBuffer(%s.length, "FLOAT", __offset)' %(arg,arg)) lines.append(' __webclgl.enqueueWriteBuffer(%s_buffer, %s)' %(arg, arg)) lines.append(' __kernel.setKernelArg(%s, %s_buffer)' %(i, arg)) lines.append(' } else { __kernel.setKernelArg(%s, %s) }' %(i, arg)) + lines.append(' var return_buffer = __webclgl.createBuffer(__return_length, "FLOAT", __offset)') + lines.append(' __kernel.compile()') lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, return_buffer)') lines.append(' return __webclgl.enqueueReadBuffer_Float( return_buffer )') @@ -430,7 +433,7 @@ def inline_helper_return_id(self, return_id): return "var __returns__%s = null;"%return_id def _visit_call_helper_numpy_array(self, node): - raise NotImplementedError('TODO numpy.array') + #raise NotImplementedError('TODO numpy.array') return self.visit(node.args[0]) ## TODO typed arrays def _visit_call_helper_list(self, node): diff --git a/regtests/run.py b/regtests/run.py index 7e67157..782c393 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -138,11 +138,13 @@ def run_old_pypy_test_on(filename): pypy_runnable = True pypy_exe = 'pypy' -if os.path.isfile( os.path.expanduser('~/pypy-1.9/bin/pypy') ): +if os.path.isfile( os.path.expanduser('~/pypy-1.9/bin/pypy') ) and '--old-pypy' in sys.argv: old_pypy_runnable = True old_pypy_exe = os.path.expanduser('~/pypy-1.9/bin/pypy') - +webclgl = None +if os.path.isfile( os.path.expanduser('~/webclgl/WebCLGL_2.0.Min.class.js') ): + webclgl = open( os.path.expanduser('~/webclgl/WebCLGL_2.0.Min.class.js'), 'rb').read().decode('utf-8') ## rhino is not run by default because it simply freezes up on maximum callstack errors rhino_runnable = '--rhino' in sys.argv and runnable("rhino -e 'quit()'") @@ -631,7 +633,19 @@ def run_js_nodewebkit(content): "main()", "__nw.App.quit()" ] - write("/tmp/test.html", '' %'\n'.join(lines)) + + html = [''] + if webclgl: + html.append('') + + html.append('') + + html.append('') + write("/tmp/test.html", '\n'.join(html)) #write("%s.js" % tmpname, '\n'.join(lines)) #return run_command("node %s.js" % tmpname) From ec0633e6e8e08714d2779b420a65076a03864a88 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 15 Jun 2014 03:31:36 -0700 Subject: [PATCH 041/222] fixed glsl webclgl backend, subscript `a[n]` no space is allowed inside the brackets. --- pythonjs/python_to_pythonjs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 1815db6..768df26 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1459,7 +1459,7 @@ def visit_Subscript(self, node): return '%s[...]' %name elif self._with_ll or self._with_glsl: - return '%s[ %s ]' %(name, self.visit(node.slice)) + return '%s[%s]' %(name, self.visit(node.slice)) elif self._with_js or self._with_dart: if isinstance(node.slice, ast.Slice): ## allow slice on Array From 39ab3e2dbe5fb6933bdffc398ee7921ea7a7adce Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 15 Jun 2014 06:03:17 -0700 Subject: [PATCH 042/222] glsl backend: allow user defined return type for subroutines. --- pythonjs/python_to_pythonjs.py | 12 +++++++----- pythonjs/pythonjs.py | 9 +++++++-- regtests/webclgl/subroutine.py | 13 ++++++++----- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 768df26..2bfc5d0 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2394,7 +2394,6 @@ def visit_FunctionDef(self, node): threaded = self._with_webworker jsfile = None - ## deprecated? self._cached_property = None self._func_typedefs = {} @@ -2414,6 +2413,11 @@ def visit_FunctionDef(self, node): assert len(decorator.args) == 1 jsfile = decorator.args[0].s + elif isinstance(decorator, Call) and decorator.func.id == 'returns': + assert len(decorator.args) == 1 + assert isinstance( decorator.args[0], Name) + return_type = decorator.args[0].id + elif self._with_dart: with_dart_decorators.append( self.visit(decorator) ) @@ -2460,10 +2464,6 @@ def visit_FunctionDef(self, node): raise RuntimeError( op, self._custom_operators ) self._custom_operators[ op ] = node.name - elif isinstance(decorator, Call) and decorator.func.id == 'returns': - assert len(decorator.args) == 1 - assert isinstance( decorator.args[0], Name) - return_type = decorator.args[0].id elif isinstance(decorator, Call) and decorator.func.id == 'typedef': c = decorator @@ -2508,6 +2508,8 @@ def visit_FunctionDef(self, node): writer.write('self.onmessage = onmessage' ) + if return_type: + writer.write('@returns(%s)' %return_type) ## force python variable scope, and pass user type information to second stage of translation. ## the dart backend can use this extra type information. vars = [] diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 5062ef8..9e8085c 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -108,7 +108,7 @@ def visit_Module(self, node): def visit_Expr(self, node): # XXX: this is UGLY s = self.visit(node.value) - if not s.endswith(';'): + if s.strip() and not s.endswith(';'): s += ';' return s @@ -189,6 +189,7 @@ def _visit_call_helper_var_glsl(self, node): def _visit_function(self, node): + return_type = None glsl = False glsl_wrapper_name = False args_typedefs = {} @@ -200,6 +201,8 @@ def _visit_function(self, node): elif isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == '__typedef__': for key in decor.keywords: args_typedefs[ key.arg ] = key.value.id + elif isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == 'returns': + return_type = decor.args[0].id args = self.visit(node.args) @@ -214,7 +217,9 @@ def _visit_function(self, node): if is_main: lines.append( '__shader__.push("void main( %s ) {");' %', '.join(x) ) - else: ## TODO return type + elif return_type: + lines.append( '__shader__.push("%s %s( %s ) {");' %(return_type, node.name, ', '.join(x)) ) + else: lines.append( '__shader__.push("void %s( %s ) {");' %(node.name, ', '.join(x)) ) self.push() diff --git a/regtests/webclgl/subroutine.py b/regtests/webclgl/subroutine.py index de57ccf..1d8390d 100644 --- a/regtests/webclgl/subroutine.py +++ b/regtests/webclgl/subroutine.py @@ -2,6 +2,12 @@ def main(): with glsl as myfunc: + ## glsl compiler requires subroutines defined first + float def mysub(x,y): + float x + float y + return x+y + def main(buffA, buffB, num): float* buffA float* buffB @@ -10,12 +16,9 @@ def main(buffA, buffB, num): float result = 0.0 for i in range(1000): result = sqrt(result + A[n] + B[n] + float(i)) - return mysub( result * num ) + return mysub( result, num ) + - float def mysub(x,y): - float x - float y - return x+y A = [1,2,3] B = [4,5,6] From 9e1689b4010f0b2f4410fbdbe5a9207f1659a08d Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 15 Jun 2014 13:35:19 -0700 Subject: [PATCH 043/222] @gpu.vectorize decorator: automatically vectorize function using numpy.array, all untyped variables are typed as float*, `id = get_global_id()` is inserted into top of main function, all math operations are changed from `a*a` to `a[id]*a[id]`. --- pythonjs/python_to_pythonjs.py | 15 ++++++ pythonjs/pythonjs.py | 48 +++++++++++++++---- .../bench/webclgl_array_mult_vectorize.py | 25 ++++++++++ regtests/run.py | 14 +++--- 4 files changed, 84 insertions(+), 18 deletions(-) create mode 100644 regtests/bench/webclgl_array_mult_vectorize.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 2bfc5d0..a7a5056 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2393,6 +2393,7 @@ def visit_FunctionDef(self, node): inline = False threaded = self._with_webworker jsfile = None + gpu_vectorize = False ## deprecated? self._cached_property = None @@ -2418,6 +2419,11 @@ def visit_FunctionDef(self, node): assert isinstance( decorator.args[0], Name) return_type = decorator.args[0].id + elif isinstance(decorator, Attribute) and isinstance(decorator.value, Name) and decorator.value.id == 'gpu': + assert decorator.attr == 'vectorize' + gpu_vectorize = True + restore_with_glsl = self._with_glsl + self._with_glsl = True elif self._with_dart: with_dart_decorators.append( self.visit(decorator) ) @@ -2510,6 +2516,8 @@ def visit_FunctionDef(self, node): if return_type: writer.write('@returns(%s)' %return_type) + if gpu_vectorize: + writer.write('@gpu.vectorize') ## force python variable scope, and pass user type information to second stage of translation. ## the dart backend can use this extra type information. vars = [] @@ -2863,6 +2871,9 @@ def visit_FunctionDef(self, node): self._function_return_types[ node.name ] = self._return_type self._return_type = None + + ############################################################ + ### DEPRECATED if setter and 'set' in self._injector: ## inject extra code value_name = node.args.args[1].id inject = [ @@ -2882,9 +2893,13 @@ def visit_FunctionDef(self, node): writer.write('callback( [self], JSObject() )') writer.pull() writer.pull() + ############################################################ writer.pull() ## end function body + if gpu_vectorize: + self._with_glsl = restore_with_glsl + self._typedef_vars = dict() ## clear typed variables if inline: diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 9e8085c..7e64b39 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -34,6 +34,7 @@ def __init__(self, requirejs=True, insert_runtime=True, webworker=False, functio self.special_decorators = set(['__typedef__', '__glsl__']) self._glsl = False self._has_glsl = False + self._typed_vars = dict() def indent(self): return ' ' * self._indent def push(self): self._indent += 1 @@ -49,10 +50,15 @@ def visit_Assign(self, node): else: target = self.visit(target) value = self.visit(node.value) - code = '%s = %s;' % (target, value) - if self._requirejs and target not in self._exports and self._indent == 0 and '.' not in target: - self._exports.add( target ) - return code + ## visit_BinOp checks for `numpy.float32` and changes the operands from `a*a` to `a[id]*a[id]` + if self._glsl and value.startswith('numpy.'): + self._typed_vars[ target ] = value + return '' + else: + code = '%s = %s;' % (target, value) + if self._requirejs and target not in self._exports and self._indent == 0 and '.' not in target: + self._exports.add( target ) + return code def visit_AugAssign(self, node): ## n++ and n-- are slightly faster than n+=1 and n-=1 @@ -192,6 +198,7 @@ def _visit_function(self, node): return_type = None glsl = False glsl_wrapper_name = False + glsl_vectorize = False args_typedefs = {} for decor in node.decorator_list: if isinstance(decor, ast.Name) and decor.id == '__glsl__': @@ -204,6 +211,11 @@ def _visit_function(self, node): elif isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == 'returns': return_type = decor.args[0].id + elif isinstance(decor, Attribute) and isinstance(decor.value, Name) and decor.value.id == 'gpu': + assert decor.attr == 'vectorize' + gpu_vectorize = True + + args = self.visit(node.args) if glsl: @@ -212,10 +224,13 @@ def _visit_function(self, node): lines = [] x = [] for i,arg in enumerate(args): - assert arg in args_typedefs - x.append( '%s %s' %(args_typedefs[arg].replace('POINTER', '*'), arg) ) + if gpu_vectorize and arg not in args_typedefs: + x.append( 'float* %s' %arg ) + else: + assert arg in args_typedefs + x.append( '%s %s' %(args_typedefs[arg].replace('POINTER', '*'), arg) ) - if is_main: + if is_main or gpu_vectorize: lines.append( '__shader__.push("void main( %s ) {");' %', '.join(x) ) elif return_type: lines.append( '__shader__.push("%s %s( %s ) {");' %(return_type, node.name, ', '.join(x)) ) @@ -223,6 +238,9 @@ def _visit_function(self, node): lines.append( '__shader__.push("void %s( %s ) {");' %(node.name, ', '.join(x)) ) self.push() + if gpu_vectorize: + lines.append( '__shader__.push("vec2 _id_ = get_global_id();");') + self._glsl = True for child in node.body: if isinstance(child, Str): @@ -235,7 +253,9 @@ def _visit_function(self, node): self.pull() lines.append('__shader__.push("%s}");' %self.indent()) - if is_main: + if is_main or gpu_vectorize: + if not glsl_wrapper_name: + glsl_wrapper_name = node.name lines.append('function %s( %s, __offset ) {' %(glsl_wrapper_name, ','.join(args)) ) lines.append(' __offset = __offset || 0') ## note by default: 0 allows 0-1.0 lines.append(' var __webclgl = new WebCLGL()') @@ -438,8 +458,10 @@ def inline_helper_return_id(self, return_id): return "var __returns__%s = null;"%return_id def _visit_call_helper_numpy_array(self, node): - #raise NotImplementedError('TODO numpy.array') - return self.visit(node.args[0]) ## TODO typed arrays + if self._glsl: + return self.visit(node.keywords[0].value) + else: + return self.visit(node.args[0]) def _visit_call_helper_list(self, node): name = self.visit(node.func) @@ -535,6 +557,12 @@ def visit_BinOp(self, node): left = self.visit(node.left) op = self.visit(node.op) right = self.visit(node.right) + + if left in self._typed_vars and self._typed_vars[left] == 'numpy.float32': + left += '[_id_]' + if right in self._typed_vars and self._typed_vars[right] == 'numpy.float32': + right += '[_id_]' + return '(%s %s %s)' % (left, op, right) def visit_Mult(self, node): diff --git a/regtests/bench/webclgl_array_mult_vectorize.py b/regtests/bench/webclgl_array_mult_vectorize.py new file mode 100644 index 0000000..5b50e9b --- /dev/null +++ b/regtests/bench/webclgl_array_mult_vectorize.py @@ -0,0 +1,25 @@ +"""big array mult""" +from time import time +from random import random + +@gpu.vectorize +def array_mult(a,b,c,d): + a = numpy.array(a, dtype=numpy.float32 ) + b = numpy.array(b, dtype=numpy.float32 ) + c = numpy.array(c, dtype=numpy.float32 ) + d = numpy.array(d, dtype=numpy.float32 ) + return a * b * c * d + + +def main(): + ARRAY_SIZE = 1024*1024*2 + + a = [ random() for i in range(ARRAY_SIZE)] + b = [ random() for i in range(ARRAY_SIZE)] + c = [ random() for i in range(ARRAY_SIZE)] + d = [ random() for i in range(ARRAY_SIZE)] + + start = time() + res = array_mult( a,b,c,d ) + print( time()-start ) + #print(res) diff --git a/regtests/run.py b/regtests/run.py index 782c393..0b7edb1 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -343,19 +343,17 @@ def TestWarning(file, line, result, test): threading.start_webworker = lambda f,a: threading._start_new_thread(f,a) threading.start_new_thread = threading._start_new_thread -class webworker(object): +class __faker__(object): def __enter__(self, *args): pass def __exit__(self, *args): pass def __call__(self, name): return lambda f: f -webworker = webworker() + def vectorize(self, f): + return f -class glsl(object): - def __enter__(self, *args): pass - def __exit__(self, *args): pass - def __call__(self, name): - return lambda f: f -glsl = glsl() +webworker = __faker__() +glsl = __faker__() +gpu = __faker__() try: import numpy From 721584d07f2eb85e1a06633424d00e44164b3e96 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 16 Jun 2014 05:05:41 -0700 Subject: [PATCH 044/222] glsl/webclgl backend: fixed for loop. --- pythonjs/pythonjs.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 7e64b39..42288d8 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -108,8 +108,13 @@ def visit_Module(self, node): header.append( 'var __shader__ = []' ) lines = header + lines - ## fixed by Foxboron - return '\n'.join(l if isinstance(l,str) else l.encode("utf-8") for l in lines) + if False: + for line in lines: + assert isinstance(line, str) + return '\n'.join(lines) + else: + ## fixed by Foxboron + return '\n'.join(l if isinstance(l,str) else l.encode("utf-8") for l in lines) def visit_Expr(self, node): # XXX: this is UGLY @@ -198,7 +203,7 @@ def _visit_function(self, node): return_type = None glsl = False glsl_wrapper_name = False - glsl_vectorize = False + gpu_vectorize = False args_typedefs = {} for decor in node.decorator_list: if isinstance(decor, ast.Name) and decor.id == '__glsl__': @@ -725,7 +730,7 @@ def visit_For(self, node): if self._glsl: target = self.visit(node.target) iter = self.visit(node.iter.args[0]) - lines = ['for (int %s; %s < %s; %s++) {' %(target, target, iter, target)] + lines = ['for (int %s=0; %s < %s; %s++) {' %(target, target, iter, target)] for b in node.body: lines.append( self.visit(b) ) lines.append( '}' ) From 3e2c6e41962fcd346772851fb5a494ca84dd4f2b Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 17 Jun 2014 21:21:14 -0700 Subject: [PATCH 045/222] webCLGL backend: fixed subroutines. --- pythonjs/python_to_pythonjs.py | 60 +++++++++++++++++++++++++--------- pythonjs/pythonjs.py | 54 ++++++++++++++++++++---------- regtests/webclgl/subroutine.py | 31 +++++++----------- 3 files changed, 93 insertions(+), 52 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index a7a5056..44a92cc 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -153,7 +153,10 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._with_rpc = None self._with_rpc_name = None self._with_direct_keys = False + self._with_glsl = False + self._in_gpu_main = False + self._gpu_return_type = 'array' ## 'array' or float32 or array of 'vec4' float32's. self._source = source.splitlines() self._classes = dict() ## class name : [method names] @@ -1054,7 +1057,7 @@ def visit_If(self, node): elif isinstance(node.test, ast.List): writer.write('if %s.length:' % self.visit(node.test)) - elif self._with_ll: + elif self._with_ll or self._with_glsl: writer.write('if %s:' % self.visit(node.test)) elif isinstance(node.test, ast.Compare): writer.write('if %s:' % self.visit(node.test)) @@ -1131,17 +1134,22 @@ def visit_Return(self, node): elif isinstance(node.value, Name) and node.value.id == 'self' and 'self' in self._instances: self._return_type = self._instances['self'] - ## cached property is DEPRECATED - #if self._cached_property: - # writer.write('self["__dict__"]["%s"] = %s' %(self._cached_property, self.visit(node.value)) ) - # writer.write('return self["__dict__"]["%s"]' %self._cached_property) - #else: - if self._with_glsl: - writer.write('out_float = %s' %self.visit(node.value)) + + if self._with_glsl and self._in_gpu_main: + ## _id_ is inserted into all function headers by pythonjs.py for glsl functions. + if self._gpu_return_type == 'array': + writer.write('out_float = %s' %self.visit(node.value)) + elif self._gpu_return_type == 'vec4': + writer.write('out_float4 = %s' %self.visit(node.value)) + else: + raise NotImplementedError(node) + + elif self._inline: writer.write('__returns__%s = %s' %(self._inline[-1], self.visit(node.value)) ) if self._inline_breakout: writer.write('break') + elif isinstance(node.value, ast.Lambda): self.visit( node.value ) writer.write( 'return __lambda__' ) @@ -2393,6 +2401,9 @@ def visit_FunctionDef(self, node): inline = False threaded = self._with_webworker jsfile = None + + gpu = False + gpu_main = False gpu_vectorize = False ## deprecated? @@ -2404,7 +2415,10 @@ def visit_FunctionDef(self, node): for decorator in reversed(node.decorator_list): log('@decorator: %s' %decorator) - if isinstance(decorator, Name) and decorator.id == 'inline': + if isinstance(decorator, Name) and decorator.id == 'gpu': + gpu = True + + elif isinstance(decorator, Name) and decorator.id == 'inline': inline = True self._with_inline = True @@ -2420,10 +2434,15 @@ def visit_FunctionDef(self, node): return_type = decorator.args[0].id elif isinstance(decorator, Attribute) and isinstance(decorator.value, Name) and decorator.value.id == 'gpu': - assert decorator.attr == 'vectorize' - gpu_vectorize = True - restore_with_glsl = self._with_glsl - self._with_glsl = True + gpu = True + if decorator.attr == 'vectorize': + gpu_vectorize = True + elif decorator.attr == 'main': + gpu_main = True + elif decorator.attr == 'typedef': + pass + else: + raise NotImplementedError(decorator) elif self._with_dart: with_dart_decorators.append( self.visit(decorator) ) @@ -2484,6 +2503,15 @@ def visit_FunctionDef(self, node): decorators.append( decorator ) + if gpu: + restore_with_glsl = self._with_glsl + self._with_glsl = True + if gpu_main: ## sets float + self._in_gpu_main = True + writer.write('@gpu.main') + + + if threaded: if not jsfile: jsfile = 'worker.js' writer_main.write('%s = "%s"' %(node.name, jsfile)) @@ -2613,8 +2641,6 @@ def visit_FunctionDef(self, node): writer.write('def %s(args, kwargs):' % node.name) writer.push() - - ## write local typedefs and var scope ## a = ','.join( vars ) if local_typedefs: @@ -2897,8 +2923,10 @@ def visit_FunctionDef(self, node): writer.pull() ## end function body - if gpu_vectorize: + if gpu: self._with_glsl = restore_with_glsl + if gpu_main: + self._in_gpu_main = False self._typedef_vars = dict() ## clear typed variables diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 42288d8..aaf52ea 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -105,6 +105,7 @@ def visit_Module(self, node): lines.append('}) //end requirejs define') if self._has_glsl: + header.append( 'var __shader_header__ = []' ) header.append( 'var __shader__ = []' ) lines = header + lines @@ -200,6 +201,7 @@ def _visit_call_helper_var_glsl(self, node): def _visit_function(self, node): + is_main = node.name == 'main' return_type = None glsl = False glsl_wrapper_name = False @@ -217,14 +219,15 @@ def _visit_function(self, node): return_type = decor.args[0].id elif isinstance(decor, Attribute) and isinstance(decor.value, Name) and decor.value.id == 'gpu': - assert decor.attr == 'vectorize' - gpu_vectorize = True + if decor.attr == 'vectorize': + gpu_vectorize = True + elif decor.attr == 'main': + is_main = True args = self.visit(node.args) if glsl: - is_main = node.name == 'main' self._has_glsl = True ## writes `__shader__ = []` in header lines = [] x = [] @@ -232,19 +235,24 @@ def _visit_function(self, node): if gpu_vectorize and arg not in args_typedefs: x.append( 'float* %s' %arg ) else: - assert arg in args_typedefs - x.append( '%s %s' %(args_typedefs[arg].replace('POINTER', '*'), arg) ) + if arg in args_typedefs: + x.append( '%s %s' %(args_typedefs[arg].replace('POINTER', '*'), arg) ) + else: + x.append( 'float* %s' %arg ) - if is_main or gpu_vectorize: + if is_main: lines.append( '__shader__.push("void main( %s ) {");' %', '.join(x) ) elif return_type: - lines.append( '__shader__.push("%s %s( %s ) {");' %(return_type, node.name, ', '.join(x)) ) + lines.append( '__shader_header__.push("%s %s( %s ) {");' %(return_type, node.name, ', '.join(x)) ) else: - lines.append( '__shader__.push("void %s( %s ) {");' %(node.name, ', '.join(x)) ) + lines.append( '__shader_header__.push("void %s( %s ) {");' %(node.name, ', '.join(x)) ) self.push() - if gpu_vectorize: + # `_id_` always write out an array of floats or array of vec4floats + if is_main: lines.append( '__shader__.push("vec2 _id_ = get_global_id();");') + else: + lines.append( '__shader_header__.push("vec2 _id_ = get_global_id();");') self._glsl = True for child in node.body: @@ -252,32 +260,44 @@ def _visit_function(self, node): continue else: for sub in self.visit(child).splitlines(): - lines.append( '__shader__.push("%s");' %(self.indent()+sub) ) + if is_main: + lines.append( '__shader__.push("%s");' %(self.indent()+sub) ) + else: + lines.append( '__shader_header__.push("%s");' %(self.indent()+sub) ) self._glsl = False #buffer += '\n'.join(body) self.pull() - lines.append('__shader__.push("%s}");' %self.indent()) + if is_main: + lines.append('__shader__.push("%s}");' %self.indent()) + else: + lines.append('__shader_header__.push("%s}");' %self.indent()) - if is_main or gpu_vectorize: + lines.append(';') + + if is_main: if not glsl_wrapper_name: glsl_wrapper_name = node.name lines.append('function %s( %s, __offset ) {' %(glsl_wrapper_name, ','.join(args)) ) - lines.append(' __offset = __offset || 0') ## note by default: 0 allows 0-1.0 + lines.append(' __offset = __offset || 0') ## note by default: 0 allows 0-1.0 ## TODO this needs to be set per-buffer + lines.append(' var __webclgl = new WebCLGL()') - lines.append(' var __kernel = __webclgl.createKernel( "\\n".join(__shader__) );') - lines.append(' var __return_length = 1') + lines.append(' var header = "\\n".join(__shader_header__)') + lines.append(' var shader = "\\n".join(__shader__)') + lines.append(' var __kernel = __webclgl.createKernel( shader, header );') + + lines.append(' var __return_length = 64') ## minimum size is 64 for i,arg in enumerate(args): lines.append(' if (%s instanceof Array) {' %arg) - lines.append(' __return_length = %s.length' %arg) + lines.append(' __return_length = %s.length==2 ? %s : %s.length' %(arg,arg, arg) ) lines.append(' var %s_buffer = __webclgl.createBuffer(%s.length, "FLOAT", __offset)' %(arg,arg)) lines.append(' __webclgl.enqueueWriteBuffer(%s_buffer, %s)' %(arg, arg)) lines.append(' __kernel.setKernelArg(%s, %s_buffer)' %(i, arg)) lines.append(' } else { __kernel.setKernelArg(%s, %s) }' %(i, arg)) lines.append(' var return_buffer = __webclgl.createBuffer(__return_length, "FLOAT", __offset)') - lines.append(' __kernel.compile()') + lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, return_buffer)') lines.append(' return __webclgl.enqueueReadBuffer_Float( return_buffer )') lines.append('} // end of wrapper') diff --git a/regtests/webclgl/subroutine.py b/regtests/webclgl/subroutine.py index 1d8390d..11efdf9 100644 --- a/regtests/webclgl/subroutine.py +++ b/regtests/webclgl/subroutine.py @@ -1,26 +1,19 @@ """subroutine""" def main(): - with glsl as myfunc: - ## glsl compiler requires subroutines defined first - float def mysub(x,y): - float x - float y - return x+y + @gpu + float def mysub(x,y): + float x + float y + return x-y - def main(buffA, buffB, num): - float* buffA - float* buffB - float num - vec2 n = get_global_id() ## WebCL API - float result = 0.0 - for i in range(1000): - result = sqrt(result + A[n] + B[n] + float(i)) - return mysub( result, num ) + #@gpu.returns.vec4 + @gpu.main + def myfunc(a): + float* a + return mysub( 1.1 * a[_id_], 2.2 ) - - A = [1,2,3] - B = [4,5,6] - res = myfunc( A, B, 2.0 ) + A = [1.3 for i in range(64)] + res = myfunc( A ) print(res) \ No newline at end of file From 56fb9287ca604cca459457295f20e3d884c70f30 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 17 Jun 2014 23:32:25 -0700 Subject: [PATCH 046/222] webclgl backend: set output array type with @returns decorator. --- pythonjs/ast_utils.py | 3 +- pythonjs/python_to_pythonjs.py | 27 +++++++++++++---- pythonjs/pythonjs.py | 21 +++++++++++-- regtests/run.py | 2 ++ regtests/webclgl/mandel.py | 54 ++++++++++++++++++++++++++++++++++ 5 files changed, 98 insertions(+), 9 deletions(-) create mode 100644 regtests/webclgl/mandel.py diff --git a/pythonjs/ast_utils.py b/pythonjs/ast_utils.py index 1d4ff2a..2b804d8 100644 --- a/pythonjs/ast_utils.py +++ b/pythonjs/ast_utils.py @@ -64,7 +64,8 @@ def retrieve_vars(body): pass ## skips assignment to an attribute `a.x = y` if user_typedef: ## `int x` - assert isinstance(n.value, ast.Name) + if not isinstance(n.value, ast.Name): + raise SyntaxError(n.value) local_vars.add( '%s=%s' %(user_typedef, n.value.id)) elif isinstance(n, ast.Global): diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 44a92cc..ed8d69f 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2396,6 +2396,7 @@ def visit_FunctionDef(self, node): with_dart_decorators = [] setter = False return_type = None + return_type_keywords = {} fastdef = False javascript = False inline = False @@ -2428,10 +2429,17 @@ def visit_FunctionDef(self, node): assert len(decorator.args) == 1 jsfile = decorator.args[0].s - elif isinstance(decorator, Call) and decorator.func.id == 'returns': - assert len(decorator.args) == 1 - assert isinstance( decorator.args[0], Name) - return_type = decorator.args[0].id + elif isinstance(decorator, Call) and isinstance(decorator.func, ast.Name) and decorator.func.id == 'returns': + if decorator.keywords: + for k in decorator.keywords: + key = k.arg + assert key == 'array' or key == 'vec4' + return_type_keywords[ key ] = self.visit(k.value) + + else: + assert len(decorator.args) == 1 + assert isinstance( decorator.args[0], Name) + return_type = decorator.args[0].id elif isinstance(decorator, Attribute) and isinstance(decorator.value, Name) and decorator.value.id == 'gpu': gpu = True @@ -2542,8 +2550,15 @@ def visit_FunctionDef(self, node): writer.write('self.onmessage = onmessage' ) - if return_type: - writer.write('@returns(%s)' %return_type) + if return_type or return_type_keywords: + if return_type_keywords and return_type: + kw = ['%s=%s' %(k,v) for k,v in return_type_keywords.items()] + writer.write('@returns(%s, %s)' %(return_type,','.join(kw)) ) + elif return_type_keywords: + writer.write('@returns(%s)' %','.join( ['%s=%s' %(k,v) for k,v in return_type_keywords.items()] )) + else: + writer.write('@returns(%s)' %return_type) + if gpu_vectorize: writer.write('@gpu.vectorize') ## force python variable scope, and pass user type information to second stage of translation. diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index aaf52ea..7f6f6af 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -205,6 +205,7 @@ def _visit_function(self, node): return_type = None glsl = False glsl_wrapper_name = False + gpu_return_types = {} gpu_vectorize = False args_typedefs = {} for decor in node.decorator_list: @@ -216,7 +217,14 @@ def _visit_function(self, node): for key in decor.keywords: args_typedefs[ key.arg ] = key.value.id elif isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == 'returns': - return_type = decor.args[0].id + if decor.keywords: + for k in decor.keywords: + key = k.arg + assert key == 'array' or key == 'vec4' + gpu_return_types[ key ] = self.visit(k.value) + + else: + return_type = decor.args[0].id elif isinstance(decor, Attribute) and isinstance(decor.value, Name) and decor.value.id == 'gpu': if decor.attr == 'vectorize': @@ -277,7 +285,12 @@ def _visit_function(self, node): if is_main: if not glsl_wrapper_name: glsl_wrapper_name = node.name - lines.append('function %s( %s, __offset ) {' %(glsl_wrapper_name, ','.join(args)) ) + + if args: + lines.append('function %s( %s, __offset ) {' %(glsl_wrapper_name, ','.join(args)) ) + else: + lines.append('function %s( __offset ) {' %glsl_wrapper_name ) + lines.append(' __offset = __offset || 0') ## note by default: 0 allows 0-1.0 ## TODO this needs to be set per-buffer lines.append(' var __webclgl = new WebCLGL()') @@ -295,6 +308,10 @@ def _visit_function(self, node): lines.append(' __kernel.setKernelArg(%s, %s_buffer)' %(i, arg)) lines.append(' } else { __kernel.setKernelArg(%s, %s) }' %(i, arg)) + if gpu_return_types: + rtype = gpu_return_types[ 'array' ] + lines.append(' __return_length = %s' %rtype) + lines.append(' var return_buffer = __webclgl.createBuffer(__return_length, "FLOAT", __offset)') lines.append(' __kernel.compile()') diff --git a/regtests/run.py b/regtests/run.py index 0b7edb1..88d6f6e 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -350,6 +350,8 @@ def __call__(self, name): return lambda f: f def vectorize(self, f): return f + def main(self, f): + return f webworker = __faker__() glsl = __faker__() diff --git a/regtests/webclgl/mandel.py b/regtests/webclgl/mandel.py new file mode 100644 index 0000000..9bd2ca9 --- /dev/null +++ b/regtests/webclgl/mandel.py @@ -0,0 +1,54 @@ +"""mandelbrot""" + +def pprint(arr, w): + x = [] + for a in arr: + x.append(a) + if len(x) >= w: + print( [ round(y,2) for y in x] ) + x = [] + +def main(): + + #@gpu.returns( array=[32,32], vec4=[4,4] ) ## TODO support dual return + @returns( array=[32,32] ) + @gpu.main + def gpufunc(): + + vec2 c = get_global_id() + #float cx = 0.5 + #float cy = 0.5 + + float hue; + float saturation; + float value; + float hueRound; + int hueIndex; + float f; + float p; + float q; + float t; + + + float x = 0.0; + float y = 0.0; + float tempX = 0.0; + int i = 0; + int runaway = 0; + for i in range(100): + tempX = x * x - y * y + float(c.x); + y = 2.0 * x * y + float(c.y); + x = tempX; + if runaway == 0 and x * x + y * y > 100.0: + runaway = i; + + return float(runaway) * 0.01 + + w = 32 + h = 32 + + #A = [w,h] + + res = gpufunc() + pprint(res, w) + From 358ed21c59847e16049556dfa0dc471c6b0aa834 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 17 Jun 2014 23:58:51 -0700 Subject: [PATCH 047/222] webclgl backend: allow @typedef decorator to define types. --- pythonjs/python_to_pythonjs.py | 21 ++++++++++--------- regtests/webclgl/mandel_purepy.py | 34 +++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 regtests/webclgl/mandel_purepy.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index ed8d69f..071481a 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2406,6 +2406,7 @@ def visit_FunctionDef(self, node): gpu = False gpu_main = False gpu_vectorize = False + local_typedefs = [] ## deprecated? self._cached_property = None @@ -2419,6 +2420,16 @@ def visit_FunctionDef(self, node): if isinstance(decorator, Name) and decorator.id == 'gpu': gpu = True + elif isinstance(decorator, Call) and decorator.func.id == 'typedef': + c = decorator + assert len(c.args) == 0 and len(c.keywords) + for kw in c.keywords: + assert isinstance( kw.value, Name) + self._instances[ kw.arg ] = kw.value.id + self._func_typedefs[ kw.arg ] = kw.value.id + local_typedefs.append( '%s=%s' %(kw.arg, kw.value.id)) + + elif isinstance(decorator, Name) and decorator.id == 'inline': inline = True self._with_inline = True @@ -2498,15 +2509,6 @@ def visit_FunctionDef(self, node): self._custom_operators[ op ] = node.name - elif isinstance(decorator, Call) and decorator.func.id == 'typedef': - c = decorator - assert len(c.args) == 0 and len(c.keywords) - for kw in c.keywords: - assert isinstance( kw.value, Name) - self._instances[ kw.arg ] = kw.value.id - self._func_typedefs[ kw.arg ] = kw.value.id - log('@typedef - %s : %s'%(kw.arg, kw.value.id)) - else: decorators.append( decorator ) @@ -2564,7 +2566,6 @@ def visit_FunctionDef(self, node): ## force python variable scope, and pass user type information to second stage of translation. ## the dart backend can use this extra type information. vars = [] - local_typedefs = [] local_typedef_names = set() if not self._with_coffee: local_vars, global_vars = retrieve_vars(node.body) diff --git a/regtests/webclgl/mandel_purepy.py b/regtests/webclgl/mandel_purepy.py new file mode 100644 index 0000000..2cc5771 --- /dev/null +++ b/regtests/webclgl/mandel_purepy.py @@ -0,0 +1,34 @@ +"""mandelbrot pure python""" + +def pprint(arr, w): + x = [] + for a in arr: + x.append(a) + if len(x) >= w: + print( [ round(y,2) for y in x] ) + x = [] + +def main(): + + @returns( array=[32,32] ) + @typedef( x=float, y=float, tempX=float, i=int, runaway=int, c=vec2) + @gpu.main + def gpufunc(): + c = get_global_id() + x = 0.0 + y = 0.0 + tempX = 0.0 + i = 0 + runaway = 0 + for i in range(100): + tempX = x * x - y * y + float(c.x) + y = 2.0 * x * y + float(c.y) + x = tempX + if runaway == 0 and x * x + y * y > 100.0: + runaway = i + + return float(runaway) * 0.01 + + res = gpufunc() + pprint(res, 32) + From 4ca94a0a34d4aa9fa04ae547cc0dc00c9f39040e Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 18 Jun 2014 00:20:08 -0700 Subject: [PATCH 048/222] new benchmark: mandelbrot GPU vs CPU (webCLGL vs NumPy) --- regtests/bench/mandelbrot.py | 60 ++++++++++++++++++++++++++++++++++++ regtests/run.py | 5 ++- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 regtests/bench/mandelbrot.py diff --git a/regtests/bench/mandelbrot.py b/regtests/bench/mandelbrot.py new file mode 100644 index 0000000..9692a91 --- /dev/null +++ b/regtests/bench/mandelbrot.py @@ -0,0 +1,60 @@ +"""mandelbrot benchmark""" +from time import time + +def pprint(arr, w): + x = [] + for a in arr: + x.append(a) + if len(x) >= w: + print( [ round(y,2) for y in x] ) + x = [] + +def mandelbrot_numpy(size=512, exit_limit=100): + img_array = numpy.zeros([size, size], int) + for y in range(size): + for x in range(size): + c = complex(x / float(size) * 4 - 2, + y / float(size) * 4 - 2) + z = c + for i in range(exit_limit): + z = (z**2) + c + img_array[y, x] += 1 + if abs(z) > 2: + # z is escaping to infinity, so point is not in set + break + else: + # if loop is exausted, point is inside the set + img_array[y, x] = 0 + return img_array + + +def main(): + + @returns( array=[512,512] ) + @typedef( x=float, y=float, tempX=float, i=int, runaway=int, c=vec2) + @gpu.main + def gpufunc(): + c = get_global_id() + x = 0.0 + y = 0.0 + tempX = 0.0 + i = 0 + runaway = 0 + for i in range(100): + tempX = x * x - y * y + float(c.x) + y = 2.0 * x * y + float(c.y) + x = tempX + if runaway == 0 and x * x + y * y > 100.0: + runaway = i + + return float(runaway) * 0.01 + + start = time() + + if PYTHON == 'PYTHONJS': + res = gpufunc() + #pprint(res, 32) + else: + res = mandelbrot_numpy() + + print(time()-start) diff --git a/regtests/run.py b/regtests/run.py index 88d6f6e..036179b 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -346,7 +346,7 @@ def TestWarning(file, line, result, test): class __faker__(object): def __enter__(self, *args): pass def __exit__(self, *args): pass - def __call__(self, name): + def __call__(self, *args, **kw): return lambda f: f def vectorize(self, f): return f @@ -356,6 +356,9 @@ def main(self, f): webworker = __faker__() glsl = __faker__() gpu = __faker__() +returns = __faker__() +typedef = __faker__() +vec2 = None try: import numpy From fe1e2a9effacc9e396dec13c71796f0a9a0e571b Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 18 Jun 2014 01:37:24 -0700 Subject: [PATCH 049/222] new documentation for GPU backend. --- doc/gpu.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 doc/gpu.md diff --git a/doc/gpu.md b/doc/gpu.md new file mode 100644 index 0000000..068192e --- /dev/null +++ b/doc/gpu.md @@ -0,0 +1,60 @@ +GPU Translation +--------------- +A subset of Python with extra type information can be translated into a GLSL fragment shader. The `@gpu` decorator marks a function for translation to GLSL. All variables inside the function must be typed using GLSL types. You can type your variables using decorators or special PythonJS type syntax. + +Typing with Decorators +---------------------- + +``` + @returns( array=[512,512] ) + @typedef( x=float, y=float, tempX=float, i=int, runaway=int, c=vec2) + @gpu.main + def gpu_mandelbrot(): + c = get_global_id() + x = 0.0 + y = 0.0 + tempX = 0.0 + i = 0 + runaway = 0 + for i in range(100): + tempX = x * x - y * y + float(c.x) + y = 2.0 * x * y + float(c.y) + x = tempX + if runaway == 0 and x * x + y * y > 100.0: + runaway = i + return float(runaway) * 0.01 + +``` + + +Typing C-style +---------------------- + +``` + @returns( array=[512,512] ) + @gpu.main + def gpu_mandelbrot(): + vec2 c = get_global_id() + float x = 0.0 + float y = 0.0 + float tempX = 0.0 + int i = 0 + int runaway = 0 + for i in range(100): + tempX = x * x - y * y + float(c.x) + y = 2.0 * x * y + float(c.y) + x = tempX + if runaway == 0 and x * x + y * y > 100.0: + runaway = i + return float(runaway) * 0.01 + +``` + +@returns +--------- +The main entry point function marked with `@gpu.main` must also use the `@returns(array=[w,h])` decorator to declare the width and height of the 2D array that it will return. Subroutines must also use the `@returns` decorator to declare their GLSL return type like this: `@returns(float)` + + +get_global_id() +-------------- +The GLSL function `get_global_id()` is part of the WebCLGL API and returns a vec2 that contains the current `x` and `y` index. \ No newline at end of file From 990a3105dbb175f22d1d572e93d77f10731c9068 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 18 Jun 2014 03:10:37 -0700 Subject: [PATCH 050/222] updated docs --- README.md | 10 +++++++++- doc/gpu.md | 42 +++++++++++++++++++++++++++++++++++++++-- pythonjs/typedpython.py | 2 +- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3861c97..fb15cad 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,15 @@ N-Body benchmark ![nbody](http://2.bp.blogspot.com/-pylzspKRu6M/UqbAv3qIGTI/AAAAAAAAAkE/NnsAM5DZ_8M/s400/nbody.png) -[More benchmarks](http://pythonjs.blogspot.com/2014/05/pythonjs-now-faster-than-cpython.html) +[More benchmarks: Richards, n-body, Pystone, Fannkuch](http://pythonjs.blogspot.com/2014/06/pythonjs-faster-than-cpython-part2.html) + + +GPU Translation +--------------- +A Python typed subset can be translated to a GLSL fragment shader to speed up math on large arrays. +[GPU Documentation](https://github.com/PythonJS/PythonJS/blob/master/doc/gpu.md) + + translator.py ------------ diff --git a/doc/gpu.md b/doc/gpu.md index 068192e..8131543 100644 --- a/doc/gpu.md +++ b/doc/gpu.md @@ -2,6 +2,22 @@ GPU Translation --------------- A subset of Python with extra type information can be translated into a GLSL fragment shader. The `@gpu` decorator marks a function for translation to GLSL. All variables inside the function must be typed using GLSL types. You can type your variables using decorators or special PythonJS type syntax. +Python GPU Subset: +----------------- + + . for loops `for i in range(n):` + . if/elif/else + . subroutines + . input/output 1D/2D arrays of floats and or vec4 + . all variables must be given a GLSL typedef. + +GLSL Types: +---------- + + . int + . float, float* + . vec2, vec3, vec4 + Typing with Decorators ---------------------- @@ -27,7 +43,7 @@ Typing with Decorators ``` -Typing C-style +Typing with PythonJS C-style type prefixes ---------------------- ``` @@ -54,7 +70,29 @@ Typing C-style --------- The main entry point function marked with `@gpu.main` must also use the `@returns(array=[w,h])` decorator to declare the width and height of the 2D array that it will return. Subroutines must also use the `@returns` decorator to declare their GLSL return type like this: `@returns(float)` +@typedef +-------- +This decorator allows you to give a GLSL type to each variable in the function. The syntax is `@typedef( VARIABLE_NAME=GLSL_TYPE )`. + get_global_id() -------------- -The GLSL function `get_global_id()` is part of the WebCLGL API and returns a vec2 that contains the current `x` and `y` index. \ No newline at end of file +The GLSL function `get_global_id()` is part of the WebCLGL API and returns a vec2 that contains the current `x` and `y` index. + +subroutines +----------- +Function subroutines are decorated with `@gpu`. The main entry point function is decorated with `@gpu.main`. Example: + +``` + @returns( float ) + @typedef( x=float, y=float ) + @gpu + def mysub(x,y): + return x-y + + @returns( array=[64,64] ) + @gpu.main + def myfunc(): + return mysub( 1.1, 2.2 ) + +``` \ No newline at end of file diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 18ca9d2..6460814 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -1,6 +1,6 @@ types = ['str', 'list', 'dict'] -glsl_types = ['float*', 'vec2'] +glsl_types = ['float*', 'vec2', 'vec3', 'vec4'] glsl_aliases = ['floatPOINTER'] types.extend( glsl_types ) types.extend( glsl_aliases ) From 5d94f7fe72b1d50aea0c6ffec8cf6e30d6db4ffc Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 18 Jun 2014 03:38:24 -0700 Subject: [PATCH 051/222] each array passed to the GPU function can have its own `scale` that sets the WebCLGL buffer offset for packing the float32 values. updated the GPU doc. --- doc/gpu.md | 22 ++++++++++++++++++++++ pythonjs/pythonjs.py | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/doc/gpu.md b/doc/gpu.md index 8131543..26834e5 100644 --- a/doc/gpu.md +++ b/doc/gpu.md @@ -95,4 +95,26 @@ Function subroutines are decorated with `@gpu`. The main entry point function i def myfunc(): return mysub( 1.1, 2.2 ) +``` + +using arrays as arguments to gpu.main +--------------------------------------- +You can pass a list of floats as arguments to your gpu entry point function, these will be translated into WebCLGL buffers and uploaded to the GPU. By default the input arrays are expected to have a range of 0.0-1.0. If you are using arrays with values outside of the default range, it can be changed by setting the `scale` variable on the list before passing it to the gpu entry point function, the scale integer sets the range from -scale to +scale. Example: + +``` +@gpu.main +def gpufunc(a,b,c): + float* a + float* b + float* c + +A = [2.0 for i in range(64)] +A.scale=2 +B = [-4.0 for i in range(64)] +B.scale=4 +C = [1.5 for i in range(64)] +A.scale=2 ## set scale to largest integer + +gpufunc( A, B, C ) + ``` \ No newline at end of file diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 7f6f6af..5399c26 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -303,7 +303,7 @@ def _visit_function(self, node): for i,arg in enumerate(args): lines.append(' if (%s instanceof Array) {' %arg) lines.append(' __return_length = %s.length==2 ? %s : %s.length' %(arg,arg, arg) ) - lines.append(' var %s_buffer = __webclgl.createBuffer(%s.length, "FLOAT", __offset)' %(arg,arg)) + lines.append(' var %s_buffer = __webclgl.createBuffer(%s.length, "FLOAT", %s.scale || __offset)' %(arg,arg,arg)) lines.append(' __webclgl.enqueueWriteBuffer(%s_buffer, %s)' %(arg, arg)) lines.append(' __kernel.setKernelArg(%s, %s_buffer)' %(i, arg)) lines.append(' } else { __kernel.setKernelArg(%s, %s) }' %(i, arg)) From 28a802b432c30f3317ab669be6dd75d5617ef240 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 18 Jun 2014 07:32:26 -0700 Subject: [PATCH 052/222] webCLGL backend: return array2D --- pythonjs/pythonjs.js | 611 ++++++++++++++++-------------- pythonjs/pythonjs.py | 8 +- pythonjs/runtime/builtins.py | 13 + regtests/webclgl/mandel_purepy.py | 6 +- 4 files changed, 342 insertions(+), 296 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 46d0ffd..5589adc 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -496,8 +496,33 @@ KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Obj ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError"; AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError"; RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError"; +__unpack_array2d = function(arr, dims) { + var h,rows,w,row; + var __r_0; + __r_0 = dims; + w = ((__r_0 instanceof Array) ? __r_0[0] : __get__(__get__(__r_0, "__getitem__"), "__call__")([0], __NULL_OBJECT__)); + h = ((__r_0 instanceof Array) ? __r_0[1] : __get__(__get__(__r_0, "__getitem__"), "__call__")([1], __NULL_OBJECT__)); + row = []; + rows = [row]; + var __iter1 = arr; + if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) ) { __iter1 = __object_keys__(__iter1) } + for (var __idx1=0; __idx1 < __iter1.length; __idx1++) { + var value = __iter1[ __idx1 ]; + row.append(value); + if (( row.length ) >= w) { + row = []; + rows.append(row); + } + } + if (( rows.length ) != h) { + console.log("ERROR: __unpack_array2d, invalid height."); + } + return rows; +} + +__unpack_array2d.pythonscript_function = true; __getattr__ = function(ob, a) { - ; + if (ob.__getattr__) { return ob.__getattr__(a); } @@ -505,7 +530,7 @@ __getattr__ = function(ob, a) { __getattr__.pythonscript_function = true; __test_if_true__ = function(ob) { - ; + if (( ob ) === true) { return true; } else { @@ -543,7 +568,7 @@ __test_if_true__ = function(ob) { __test_if_true__.pythonscript_function = true; __replace_method = function(ob, a, b) { - ; + if (( typeof(ob) ) == "string") { return ob.split(a).join(b); } else { @@ -553,7 +578,7 @@ __replace_method = function(ob, a, b) { __replace_method.pythonscript_function = true; __split_method = function(ob, delim) { - ; + if (( typeof(ob) ) == "string") { if (( delim ) === undefined) { return ob.split(" "); @@ -571,7 +596,7 @@ __split_method = function(ob, delim) { __split_method.pythonscript_function = true; __is_typed_array = function(ob) { - ; + if (__test_if_true__(ob instanceof Int8Array || ob instanceof Uint8Array)) { return true; } else { @@ -614,10 +639,10 @@ __contains__ = function(ob, a) { throw new TypeError; } else { if (__test_if_true__(__is_typed_array(ob))) { - var __iter1 = ob; - if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) ) { __iter1 = __object_keys__(__iter1) } - for (var __idx1=0; __idx1 < __iter1.length; __idx1++) { - var x = __iter1[ __idx1 ]; + var __iter2 = ob; + if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } + for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { + var x = __iter2[ __idx2 ]; if (( x ) == a) { return true; } @@ -678,7 +703,7 @@ __mul_op = function(a, b) { } else { if (__test_if_true__(a instanceof Array)) { c = []; - ; + i = 0; i__end__ = b; while (( i ) < i__end__) { @@ -700,10 +725,10 @@ __mul_op = function(a, b) { __jsdict = function(items) { var d,key; d = {}; - var __iter2 = items; - if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } - for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { - var item = __iter2[ __idx2 ]; + var __iter3 = items; + if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) ) { __iter3 = __object_keys__(__iter3) } + for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { + var item = __iter3[ __idx3 ]; key = item[0]; if (__test_if_true__(key.__uid__)) { key = key.__uid__; @@ -714,7 +739,7 @@ __jsdict = function(items) { } __jsdict_get = function(ob, key, default_value) { - ; + if (__test_if_true__(ob instanceof Object)) { if (__test_if_true__(key in ob)) { return ob[key]; @@ -730,7 +755,7 @@ __jsdict_get = function(ob, key, default_value) { } __jsdict_set = function(ob, key, value) { - ; + if (__test_if_true__(ob instanceof Object)) { ob[key] = value; } else { @@ -739,7 +764,7 @@ __jsdict_set = function(ob, key, value) { } __jsdict_keys = function(ob) { - ; + if (__test_if_true__(ob instanceof Object)) { return Object.keys( ob ); } else { @@ -751,10 +776,10 @@ __jsdict_values = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object)) { arr = []; - var __iter3 = ob; - if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) ) { __iter3 = __object_keys__(__iter3) } - for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { - var key = __iter3[ __idx3 ]; + var __iter4 = ob; + if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } + for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { + var key = __iter4[ __idx4 ]; if (__test_if_true__(ob.hasOwnProperty(key))) { value = ob[key]; arr.push(value); @@ -770,10 +795,10 @@ __jsdict_items = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; - var __iter4 = ob; - if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } - for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { - var key = __iter4[ __idx4 ]; + var __iter5 = ob; + if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } + for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { + var key = __iter5[ __idx5 ]; if (__test_if_true__(Object.hasOwnProperty.call(ob, key))) { value = ob[key]; arr.push([key, value]); @@ -830,10 +855,10 @@ __object_keys__ = function(ob) { __bind_property_descriptors__ = function(o, klass) { var prop,desc; - var __iter5 = klass.__properties__; - if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } - for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { - var name = __iter5[ __idx5 ]; + var __iter6 = klass.__properties__; + if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } + for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { + var name = __iter6[ __idx6 ]; desc = __jsdict([["enumerable", true]]); prop = klass.__properties__[name]; if (__test_if_true__(prop["get"])) { @@ -844,18 +869,18 @@ __bind_property_descriptors__ = function(o, klass) { } Object.defineProperty(o, name, desc); } - var __iter6 = klass.__bases__; - if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } - for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { - var base = __iter6[ __idx6 ]; + var __iter7 = klass.__bases__; + if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } + for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { + var base = __iter7[ __idx7 ]; __bind_property_descriptors__(o, base); } } __generate_getter__ = function(klass, o, n) { - ; + var __lambda__ = function() { - ; + return klass.__properties__[n]["get"]([o], __jsdict([])); } @@ -863,9 +888,9 @@ __generate_getter__ = function(klass, o, n) { } __generate_setter__ = function(klass, o, n) { - ; + var __lambda__ = function(v) { - ; + return klass.__properties__[n]["set"]([o, v], __jsdict([])); } @@ -879,10 +904,10 @@ __sprintf = function(fmt, args) { arr = []; var i; i = 0; - var __iter7 = chunks; - if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } - for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { - var txt = __iter7[ __idx7 ]; + var __iter8 = chunks; + if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } + for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { + var txt = __iter8[ __idx8 ]; arr.append(txt); if (( i ) >= args.length) { break; @@ -915,10 +940,10 @@ __create_class__ = function(class_name, parents, attrs, props) { klass.__all_method_names__ = []; klass.__properties__ = props; klass.__attributes__ = attrs; - var __iter8 = attrs; - if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } - for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { - var key = __iter8[ __idx8 ]; + var __iter9 = attrs; + if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } + for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { + var key = __iter9[ __idx9 ]; if (( typeof(attrs[key]) ) == "function") { klass.__all_method_names__.push(key); f = attrs[key]; @@ -939,20 +964,20 @@ __create_class__ = function(class_name, parents, attrs, props) { } klass.__setters__ = []; klass.__getters__ = []; - var __iter9 = klass.__properties__; - if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } - for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { - var name = __iter9[ __idx9 ]; + var __iter10 = klass.__properties__; + if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } + for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { + var name = __iter10[ __idx10 ]; prop = klass.__properties__[name]; klass.__getters__.push(name); if (__test_if_true__(prop["set"])) { klass.__setters__.push(name); } } - var __iter10 = klass.__bases__; - if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } - for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { - var base = __iter10[ __idx10 ]; + var __iter11 = klass.__bases__; + if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } + for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { + var base = __iter11[ __idx11 ]; Array.prototype.push.apply(klass.__getters__, base.__getters__); Array.prototype.push.apply(klass.__setters__, base.__setters__); Array.prototype.push.apply(klass.__all_method_names__, base.__all_method_names__); @@ -965,10 +990,10 @@ __create_class__ = function(class_name, parents, attrs, props) { object.__dict__ = object; has_getattribute = false; has_getattr = false; - var __iter11 = klass.__all_method_names__; - if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } - for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { - var name = __iter11[ __idx11 ]; + var __iter12 = klass.__all_method_names__; + if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } + for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { + var name = __iter12[ __idx12 ]; if (( name ) == "__getattribute__") { has_getattribute = true; } else { @@ -1001,7 +1026,7 @@ __create_class__ = function(class_name, parents, attrs, props) { } type = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{"bases": null, "class_dict": null},args:["ob_or_class_name", "bases", "class_dict"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1024,7 +1049,7 @@ type = function(args, kwargs) { type.pythonscript_function = true; hasattr = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["ob", "attr"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1113,8 +1138,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 409: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 410: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 422: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 423: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1157,7 +1182,7 @@ isinstance = function(args, kwargs) { isinstance.pythonscript_function = true; int = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1177,7 +1202,7 @@ int = function(args, kwargs) { int.pythonscript_function = true; float = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1222,7 +1247,7 @@ round = function(args, kwargs) { round.pythonscript_function = true; str = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["s"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1238,10 +1263,10 @@ str = function(args, kwargs) { str.pythonscript_function = true; _setup_str_prototype = function(args, kwargs) { - ; + "\n Extend JavaScript String.prototype with methods that implement the Python str API.\n The decorator @String.prototype.[name] assigns the function to the prototype,\n and ensures that the special 'this' variable will work.\n "; var func = function(a) { - ; + if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1251,7 +1276,7 @@ _setup_str_prototype = function(args, kwargs) { Object.defineProperty(String.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(index) { - ; + if (( index ) < 0) { return this[(this.length + index)]; } else { @@ -1261,13 +1286,13 @@ _setup_str_prototype = function(args, kwargs) { Object.defineProperty(String.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(self) { - ; + return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } Object.defineProperty(String.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(idx) { - ; + if (( idx ) < 0) { return this[(this.length + idx)]; } else { @@ -1277,13 +1302,13 @@ _setup_str_prototype = function(args, kwargs) { Object.defineProperty(String.prototype, "__getitem__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { - ; + return this.length; } Object.defineProperty(String.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(start, stop, step) { - ; + if (__test_if_true__(( start ) === undefined && ( stop ) === undefined && ( step ) == -1)) { return this.split("").reverse().join(""); } else { @@ -1296,19 +1321,19 @@ _setup_str_prototype = function(args, kwargs) { Object.defineProperty(String.prototype, "__getslice__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { - ; + return this.split("\n"); } Object.defineProperty(String.prototype, "splitlines", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { - ; + return this.trim(); } Object.defineProperty(String.prototype, "strip", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(a) { - ; + if (( this.substring(0, a.length) ) == a) { return true; } else { @@ -1318,7 +1343,7 @@ _setup_str_prototype = function(args, kwargs) { Object.defineProperty(String.prototype, "startswith", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(a) { - ; + if (( this.substring((this.length - a.length), this.length) ) == a) { return true; } else { @@ -1336,10 +1361,10 @@ _setup_str_prototype = function(args, kwargs) { arr = a["$wrapped"]; } i = 0; - var __iter12 = arr; - if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } - for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { - var value = __iter12[ __idx12 ]; + var __iter13 = arr; + if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } + for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { + var value = __iter13[ __idx13 ]; out += value; i += 1; if (( i ) < arr.length) { @@ -1351,13 +1376,13 @@ _setup_str_prototype = function(args, kwargs) { Object.defineProperty(String.prototype, "join", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { - ; + return this.toUpperCase(); } Object.defineProperty(String.prototype, "upper", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { - ; + return this.toLowerCase(); } @@ -1373,7 +1398,7 @@ _setup_str_prototype = function(args, kwargs) { Object.defineProperty(String.prototype, "index", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(a) { - ; + return this.indexOf(a); } @@ -1381,10 +1406,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; - var __iter13 = this; - if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } - for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { - var char = __iter13[ __idx13 ]; + var __iter14 = this; + if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } + for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { + var char = __iter14[ __idx14 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1396,13 +1421,13 @@ _setup_str_prototype = function(args, kwargs) { Object.defineProperty(String.prototype, "isdigit", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(encoding) { - ; + return this; } Object.defineProperty(String.prototype, "decode", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(encoding) { - ; + return this; } @@ -1411,10 +1436,10 @@ _setup_str_prototype = function(args, kwargs) { var keys,r; r = this; keys = Object.keys(fmt); - var __iter14 = keys; - if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } - for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { - var key = __iter14[ __idx14 ]; + var __iter15 = keys; + if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } + for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { + var key = __iter15[ __idx15 ]; r = r.split(key).join(fmt[key]); } r = r.split("{").join("").split("}").join(""); @@ -1427,10 +1452,10 @@ _setup_str_prototype = function(args, kwargs) { _setup_str_prototype.pythonscript_function = true; _setup_str_prototype(); __sort_method = function(ob) { - ; + if (__test_if_true__(ob instanceof Array)) { var f = function(a, b) { - ; + if (( a ) < b) { return -1; } else { @@ -1449,7 +1474,7 @@ __sort_method = function(ob) { } _setup_array_prototype = function(args, kwargs) { - ; + var func = function() { var i,item; i = 0; @@ -1467,7 +1492,7 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "jsify", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(a) { - ; + if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1477,19 +1502,19 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { - ; + return this.length; } Object.defineProperty(Array.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(index) { - ; + return this[index]; } Object.defineProperty(Array.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); var __getitem__ = function(index) { - ; + if (( index ) < 0) { index = (this.length + index); } @@ -1498,7 +1523,7 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "__getitem__", { enumerable:false,value:__getitem__,writeable:true,configurable:true }); var __setitem__ = function(index, value) { - ; + if (( index ) < 0) { index = (this.length + index); } @@ -1507,7 +1532,7 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "__setitem__", { enumerable:false,value:__setitem__,writeable:true,configurable:true }); var func = function() { - ; + return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } @@ -1561,10 +1586,10 @@ _setup_array_prototype = function(args, kwargs) { stop = this.length; } arr = [start, (stop - start)]; - var __iter15 = items; - if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } - for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { - var item = __iter15[ __idx15 ]; + var __iter16 = items; + if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } + for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { + var item = __iter16[ __idx16 ]; arr.push(item); } this.splice.apply(this, arr); @@ -1572,18 +1597,18 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "__setslice__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(item) { - ; + this.push(item); return this; } Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); var extend = function(other) { - ; - var __iter16 = other; - if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } - for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { - var obj = __iter16[ __idx16 ]; + + var __iter17 = other; + if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } + for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { + var obj = __iter17[ __idx17 ]; this.push(obj); } return this; @@ -1598,7 +1623,7 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "remove", { enumerable:false,value:func,writeable:true,configurable:true }); var insert = function(index, obj) { - ; + if (( index ) < 0) { index = (this.length + index); } @@ -1607,7 +1632,7 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "insert", { enumerable:false,value:insert,writeable:true,configurable:true }); var index = function(obj) { - ; + return this.indexOf(obj); } @@ -1615,10 +1640,10 @@ _setup_array_prototype = function(args, kwargs) { var count = function(obj) { var a; a = 0; - var __iter17 = this; - if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } - for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { - var item = __iter17[ __idx17 ]; + var __iter18 = this; + if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } + for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { + var item = __iter18[ __idx18 ]; if (( item ) === obj) { a += 1; } @@ -1651,7 +1676,7 @@ _setup_array_prototype = function(args, kwargs) { var func = function(other) { var f; var __lambda__ = function(i) { - ; + return ( other.indexOf(i) ) == -1; } @@ -1663,7 +1688,7 @@ _setup_array_prototype = function(args, kwargs) { var func = function(other) { var f; var __lambda__ = function(i) { - ; + return ( other.indexOf(i) ) != -1; } @@ -1673,11 +1698,11 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { - ; - var __iter18 = this; - if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } - for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { - var item = __iter18[ __idx18 ]; + + var __iter19 = this; + if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } + for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { + var item = __iter19[ __idx19 ]; if (( other.indexOf(item) ) == -1) { return false; } @@ -1703,9 +1728,9 @@ _setup_array_prototype = function(args, kwargs) { _setup_array_prototype.pythonscript_function = true; _setup_array_prototype(); _setup_nodelist_prototype = function(args, kwargs) { - ; + var func = function(a) { - ; + if (( this.indexOf(a) ) == -1) { return false; } else { @@ -1715,19 +1740,19 @@ _setup_nodelist_prototype = function(args, kwargs) { Object.defineProperty(NodeList.prototype, "__contains__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function() { - ; + return this.length; } Object.defineProperty(NodeList.prototype, "__len__", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(index) { - ; + return this[index]; } Object.defineProperty(NodeList.prototype, "get", { enumerable:false,value:func,writeable:true,configurable:true }); var __getitem__ = function(index) { - ; + if (( index ) < 0) { index = (this.length + index); } @@ -1736,7 +1761,7 @@ _setup_nodelist_prototype = function(args, kwargs) { Object.defineProperty(NodeList.prototype, "__getitem__", { enumerable:false,value:__getitem__,writeable:true,configurable:true }); var __setitem__ = function(index, value) { - ; + if (( index ) < 0) { index = (this.length + index); } @@ -1745,13 +1770,13 @@ _setup_nodelist_prototype = function(args, kwargs) { Object.defineProperty(NodeList.prototype, "__setitem__", { enumerable:false,value:__setitem__,writeable:true,configurable:true }); var func = function() { - ; + return __get__(Iterator, "__call__")([this, 0], __NULL_OBJECT__); } Object.defineProperty(NodeList.prototype, "__iter__", { enumerable:false,value:func,writeable:true,configurable:true }); var index = function(obj) { - ; + return this.indexOf(obj); } @@ -1763,7 +1788,7 @@ if (__test_if_true__(( __NODEJS__ ) == false && ( __WEBWORKER__ ) == false)) { _setup_nodelist_prototype(); } bisect = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{"low": null, "high": null},args:["a", "x", "low", "high"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1815,7 +1840,7 @@ range = function(args, kwargs) { range.pythonscript_function = true; xrange = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["num", "stop", "step"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1845,12 +1870,12 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b,__iterator__20; - __iterator__20 = __get__(__get__(arr, "__iter__", "no iterator - line 885: for b in arr:"), "__call__")([], __NULL_OBJECT__); - var __next__20; - __next__20 = __get__(__iterator__20, "next"); - while (( __iterator__20.index ) < __iterator__20.length) { - b = __next__20(); + var b,__iterator__21; + __iterator__21 = __get__(__get__(arr, "__iter__", "no iterator - line 898: for b in arr:"), "__call__")([], __NULL_OBJECT__); + var __next__21; + __next__21 = __get__(__iterator__21, "next"); + while (( __iterator__21.index ) < __iterator__21.length) { + b = __next__21(); a += b; } return a; @@ -1863,7 +1888,7 @@ __StopIteration_parents = []; __StopIteration_properties = {}; StopIteration = __create_class__("StopIteration", __StopIteration_parents, __StopIteration_attrs, __StopIteration_properties); len = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["ob"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1886,7 +1911,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 905: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 918: return ob.__len__()"), "__call__")(); } } } @@ -1895,7 +1920,7 @@ len = function(args, kwargs) { len.pythonscript_function = true; next = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["obj"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -1906,7 +1931,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 909: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 922: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -1924,12 +1949,12 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__21; - __iterator__21 = __get__(__get__(objs, "__iter__", "no iterator - line 914: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__21; - __next__21 = __get__(__iterator__21, "next"); - while (( __iterator__21.index ) < __iterator__21.length) { - ob = __next__21(); + var ob,__iterator__22; + __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 927: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__22; + __next__22 = __get__(__iterator__22, "next"); + while (( __iterator__22.index ) < __iterator__22.length) { + ob = __next__22(); v = __get__(func, "__call__")([ob], __NULL_OBJECT__); arr.push(v); } @@ -1951,12 +1976,12 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__22; - __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 922: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__22; - __next__22 = __get__(__iterator__22, "next"); - while (( __iterator__22.index ) < __iterator__22.length) { - ob = __next__22(); + var ob,__iterator__23; + __iterator__23 = __get__(__get__(objs, "__iter__", "no iterator - line 935: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__23; + __next__23 = __get__(__iterator__23, "next"); + while (( __iterator__23.index ) < __iterator__23.length) { + ob = __next__23(); if (__test_if_true__(__get__(func, "__call__")([ob], __NULL_OBJECT__))) { arr.push(ob); } @@ -1978,12 +2003,12 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__23; - __iterator__23 = __get__(__get__(lst, "__iter__", "no iterator - line 931: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__23; - __next__23 = __get__(__iterator__23, "next"); - while (( __iterator__23.index ) < __iterator__23.length) { - value = __next__23(); + var value,__iterator__24; + __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 944: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__24; + __next__24 = __get__(__iterator__24, "next"); + while (( __iterator__24.index ) < __iterator__24.length) { + value = __next__24(); if (( a ) === null) { a = value; } else { @@ -2009,12 +2034,12 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__24; - __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 938: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__24; - __next__24 = __get__(__iterator__24, "next"); - while (( __iterator__24.index ) < __iterator__24.length) { - value = __next__24(); + var value,__iterator__25; + __iterator__25 = __get__(__get__(lst, "__iter__", "no iterator - line 951: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__25; + __next__25 = __get__(__iterator__25, "next"); + while (( __iterator__25.index ) < __iterator__25.length) { + value = __next__25(); if (( a ) === null) { a = value; } else { @@ -2028,7 +2053,7 @@ max = function(args, kwargs) { max.pythonscript_function = true; abs = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["num"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2044,7 +2069,7 @@ abs = function(args, kwargs) { abs.pythonscript_function = true; ord = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["char"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2060,7 +2085,7 @@ ord = function(args, kwargs) { ord.pythonscript_function = true; chr = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["num"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2085,7 +2110,7 @@ __ArrayIterator = function(arr, index) { __ArrayIterator.__uid__ = ("" + _PythonJS_UID); _PythonJS_UID += 1; __ArrayIterator.prototype.__init__ = function(arr, index) { - ; + this.arr = arr; this.index = index; this.length = arr.length; @@ -2108,7 +2133,7 @@ __Iterator_attrs = {}; __Iterator_parents = []; __Iterator_properties = {}; __Iterator___init__ = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "obj", "index"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2124,7 +2149,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 973: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 986: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2150,7 +2175,7 @@ __Iterator_next.pythonscript_function = true; __Iterator_attrs.next = __Iterator_next; Iterator = __create_class__("Iterator", __Iterator_parents, __Iterator_attrs, __Iterator_properties); tuple = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2180,7 +2205,7 @@ tuple = function(args, kwargs) { tuple.pythonscript_function = true; list = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2234,28 +2259,28 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o,__iterator__25; - __iterator__25 = __get__(__get__(ob, "__iter__", "no iterator - line 1028: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__25; - __next__25 = __get__(__iterator__25, "next"); - while (( __iterator__25.index ) < __iterator__25.length) { - o = __next__25(); + var o,__iterator__26; + __iterator__26 = __get__(__get__(ob, "__iter__", "no iterator - line 1041: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__26; + __next__26 = __get__(__iterator__26, "next"); + while (( __iterator__26.index ) < __iterator__26.length) { + o = __next__26(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1030: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1030: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1030: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1043: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1043: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1043: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1032: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1032: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1032: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1045: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1045: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1045: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key,__iterator__26; - __iterator__26 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1034: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__26; - __next__26 = __get__(__iterator__26, "next"); - while (( __iterator__26.index ) < __iterator__26.length) { - key = __next__26(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1035: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1036: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + var key,__iterator__27; + __iterator__27 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1047: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__27; + __next__27 = __get__(__iterator__27, "next"); + while (( __iterator__27.index ) < __iterator__27.length) { + key = __next__27(); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1048: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1049: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2281,16 +2306,16 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key,__iterator__27; - __iterator__27 = __get__(__get__(keys, "__iter__", "no iterator - line 1044: for key in keys:"), "__call__")([], __NULL_OBJECT__); - var __next__27; - __next__27 = __get__(__iterator__27, "next"); - while (( __iterator__27.index ) < __iterator__27.length) { - key = __next__27(); - value = __get__(self["$wrapped"], "__getitem__", "line 1045: value = self[...][key]")([key], __NULL_OBJECT__); + var key,__iterator__28; + __iterator__28 = __get__(__get__(keys, "__iter__", "no iterator - line 1057: for key in keys:"), "__call__")([], __NULL_OBJECT__); + var __next__28; + __next__28 = __get__(__iterator__28, "next"); + while (( __iterator__28.index ) < __iterator__28.length) { + key = __next__28(); + value = __get__(self["$wrapped"], "__getitem__", "line 1058: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1048: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1061: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2304,7 +2329,7 @@ __dict_jsify = function(args, kwargs) { __dict_jsify.pythonscript_function = true; __dict_attrs.jsify = __dict_jsify; __dict_copy = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2321,7 +2346,7 @@ __dict_copy = function(args, kwargs) { __dict_copy.pythonscript_function = true; __dict_attrs.copy = __dict_copy; __dict_clear = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2352,7 +2377,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1064: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1077: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2364,7 +2389,7 @@ __dict_has_key = function(args, kwargs) { __dict_has_key.pythonscript_function = true; __dict_attrs.has_key = __dict_has_key; __dict_update = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "other"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2376,13 +2401,13 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key,__iterator__28; - __iterator__28 = __get__(__get__(other, "__iter__", "no iterator - line 1072: for key in other:"), "__call__")([], __NULL_OBJECT__); - var __next__28; - __next__28 = __get__(__iterator__28, "next"); - while (( __iterator__28.index ) < __iterator__28.length) { - key = __next__28(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1073: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1073: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + var key,__iterator__29; + __iterator__29 = __get__(__get__(other, "__iter__", "no iterator - line 1085: for key in other:"), "__call__")([], __NULL_OBJECT__); + var __next__29; + __next__29 = __get__(__iterator__29, "next"); + while (( __iterator__29.index ) < __iterator__29.length) { + key = __next__29(); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1086: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1086: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2401,13 +2426,13 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key,__iterator__29; - __iterator__29 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1077: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__29; - __next__29 = __get__(__iterator__29, "next"); - while (( __iterator__29.index ) < __iterator__29.length) { - key = __next__29(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1078: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + var key,__iterator__30; + __iterator__30 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1090: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__30; + __next__30 = __get__(__iterator__30, "next"); + while (( __iterator__30.index ) < __iterator__30.length) { + key = __next__30(); + __get__(__get__(arr, "append", "missing attribute `append` - line 1091: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2415,7 +2440,7 @@ __dict_items = function(args, kwargs) { __dict_items.pythonscript_function = true; __dict_attrs.items = __dict_items; __dict_get = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{"_default": null},args:["self", "key", "_default"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2439,7 +2464,7 @@ return _default; __dict_get.pythonscript_function = true; __dict_attrs.get = __dict_get; __dict_set = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "key", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2452,7 +2477,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1088: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1101: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2532,7 +2557,7 @@ __dict___setitem__ = function(args, kwargs) { __dict___setitem__.pythonscript_function = true; __dict_attrs.__setitem__ = __dict___setitem__; __dict_keys = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2588,10 +2613,10 @@ __dict_values = function(args, kwargs) { var self = __args__['self']; keys = Object.keys(self["$wrapped"]); out = []; - var __iter19 = keys; - if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } - for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { - var key = __iter19[ __idx19 ]; + var __iter20 = keys; + if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } + for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { + var key = __iter20[ __idx20 ]; out.push(self["$wrapped"][key]); } return out; @@ -2600,7 +2625,7 @@ __dict_values = function(args, kwargs) { __dict_values.pythonscript_function = true; __dict_attrs.values = __dict_values; __dict___contains__ = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "value"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2624,7 +2649,7 @@ return false; __dict___contains__.pythonscript_function = true; __dict_attrs.__contains__ = __dict___contains__; __dict___iter__ = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2678,10 +2703,10 @@ set = function(args, kwargs) { } fallback = false; if (__test_if_true__(hashtable)) { - var __iter20 = a; - if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } - for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { - var b = __iter20[ __idx20 ]; + var __iter21 = a; + if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } + for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { + var b = __iter21[ __idx21 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[key] = b; @@ -2696,20 +2721,20 @@ set = function(args, kwargs) { } s = []; if (__test_if_true__(fallback)) { - var __iter21 = a; - if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } - for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { - var item = __iter21[ __idx21 ]; + var __iter22 = a; + if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } + for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { + var item = __iter22[ __idx22 ]; if (( s.indexOf(item) ) == -1) { s.push(item); } } } else { __sort_method(keys); - var __iter22 = keys; - if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } - for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { - var key = __iter22[ __idx22 ]; + var __iter23 = keys; + if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } + for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { + var key = __iter23[ __idx23 ]; s.push(hashtable[key]); } } @@ -2718,7 +2743,7 @@ set = function(args, kwargs) { set.pythonscript_function = true; frozenset = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2757,7 +2782,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1289: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1289: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1302: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1302: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -2781,13 +2806,13 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1313: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1326: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; __array_attrs.__init__ = __array___init__; __array___len__ = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2816,7 +2841,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1321: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1334: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -2842,7 +2867,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1331: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1331: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1344: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1344: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -2881,7 +2906,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1350: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1350: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1363: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1363: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -2900,7 +2925,7 @@ __array___setitem__ = function(args, kwargs) { __array___setitem__.pythonscript_function = true; __array_attrs.__setitem__ = __array___setitem__; __array___iter__ = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2917,7 +2942,7 @@ __array___iter__ = function(args, kwargs) { __array___iter__.pythonscript_function = true; __array_attrs.__iter__ = __array___iter__; __array_get = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "index"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2952,13 +2977,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1375: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1375: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1388: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1388: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1380: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1393: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3018,14 +3043,14 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1408: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1421: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } __array_append.pythonscript_function = true; __array_attrs.append = __array_append; __array_extend = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "lst"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3037,13 +3062,13 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value,__iterator__34; - __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1412: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__34; - __next__34 = __get__(__iterator__34, "next"); - while (( __iterator__34.index ) < __iterator__34.length) { - value = __next__34(); - __get__(__get__(self, "append", "missing attribute `append` - line 1413: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + var value,__iterator__35; + __iterator__35 = __get__(__get__(lst, "__iter__", "no iterator - line 1425: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__35; + __next__35 = __get__(__iterator__35, "next"); + while (( __iterator__35.index ) < __iterator__35.length) { + value = __next__35(); + __get__(__get__(self, "append", "missing attribute `append` - line 1426: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3074,7 +3099,7 @@ __array_to_array = function(args, kwargs) { __array_to_array.pythonscript_function = true; __array_attrs.to_array = __array_to_array; __array_to_list = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3085,7 +3110,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1425: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1438: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3103,9 +3128,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1429: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1442: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1430: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1443: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3123,7 +3148,7 @@ __file_attrs = {}; __file_parents = []; __file_properties = {}; __file___init__ = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "path", "flags"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3204,7 +3229,7 @@ __file_write = function(args, kwargs) { __file_write.pythonscript_function = true; __file_attrs.write = __file_write; __file_close = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3222,7 +3247,7 @@ __file_close.pythonscript_function = true; __file_attrs.close = __file_close; file = __create_class__("file", __file_parents, __file_attrs, __file_properties); __open__ = function(args, kwargs) { - ; + var __sig__,__args__; __sig__ = { kwargs:{"mode": null},args:["path", "mode"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -3242,17 +3267,17 @@ json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (f __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; - var __iter23 = threading.workers; - if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } - for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { - var b = __iter23[ __idx23 ]; + var __iter24 = threading.workers; + if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } + for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { + var b = __iter24[ __idx24 ]; other = b["worker"]; args = b["args"]; if (( other ) !== worker) { - var __iter24 = args; - if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } - for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { - var arg = __iter24[ __idx24 ]; + var __iter25 = args; + if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } + for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { + var arg = __iter25[ __idx25 ]; if (( arg ) === ob) { if (! (__contains__(a, other))) { a.append(other); @@ -3284,10 +3309,10 @@ __start_new_thread = function(f, args) { if (( event.data.type ) == "append") { a = args[event.data.argindex]; a.push(event.data.value); - var __iter25 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } - for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { - var other = __iter25[ __idx25 ]; + var __iter26 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } + for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { + var other = __iter26[ __idx26 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); } } else { @@ -3299,10 +3324,10 @@ __start_new_thread = function(f, args) { } else { a[event.data.index] = value; } - var __iter26 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } - for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { - var other = __iter26[ __idx26 ]; + var __iter27 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } + for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { + var other = __iter27[ __idx27 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); } } else { @@ -3317,10 +3342,10 @@ __start_new_thread = function(f, args) { jsargs = []; var i; i = 0; - var __iter27 = args; - if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } - for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { - var arg = __iter27[ __idx27 ]; + var __iter28 = args; + if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } + for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { + var arg = __iter28[ __idx28 ]; if (__test_if_true__(arg.jsify)) { jsargs.append(arg.jsify()); } else { @@ -3336,9 +3361,9 @@ __start_new_thread = function(f, args) { } __gen_worker_append = function(worker, ob, index) { - ; + var append = function(item) { - ; + worker.postMessage(__jsdict([["type", "append"], ["argindex", index], ["value", item]])); ob.push(item); } @@ -3347,17 +3372,17 @@ __gen_worker_append = function(worker, ob, index) { } __webworker_wrap = function(ob, argindex) { - ; + if (__test_if_true__(ob instanceof Array)) { var func = function(index, item) { - ; + postMessage(__jsdict([["type", "__setitem__"], ["index", index], ["value", item], ["argindex", argindex]])); Array.prototype.__setitem__.call(ob, index, item); } Object.defineProperty(ob, "__setitem__", __jsdict([["enumerable", false], ["value", func], ["writeable", true], ["configurable", true]])); var func = function(item) { - ; + postMessage(__jsdict([["type", "append"], ["value", item], ["argindex", argindex]])); Array.prototype.push.call(ob, item); } @@ -3366,7 +3391,7 @@ __webworker_wrap = function(ob, argindex) { } else { if (( typeof(ob) ) == "object") { var func = function(key, item) { - ; + postMessage(__jsdict([["type", "__setitem__"], ["index", key], ["value", item], ["argindex", argindex]])); ob[key] = item; } diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 5399c26..12830ac 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -316,7 +316,13 @@ def _visit_function(self, node): lines.append(' __kernel.compile()') lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, return_buffer)') - lines.append(' return __webclgl.enqueueReadBuffer_Float( return_buffer )') + + if gpu_return_types: + rtype = gpu_return_types[ 'array' ] + lines.append(' var arrayres = __webclgl.enqueueReadBuffer_Float( return_buffer )') + lines.append(' return __unpack_array2d(arrayres, %s)' %rtype ) + else: + lines.append(' return __webclgl.enqueueReadBuffer_Float( return_buffer )') lines.append('} // end of wrapper') return '\n'.join(lines) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 10cdf79..1ec4fe8 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -16,6 +16,19 @@ JS('RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError";') with lowlevel: + def __unpack_array2d(arr, dims): + w,h = dims + row = [] + rows = [row] + for value in arr: + row.append(value) + if row.length >= w: + row = [] + rows.append(row) + if rows.length != h: + print('ERROR: __unpack_array2d, invalid height.') + return rows + def __getattr__(ob, a ): if ob.__getattr__: return JS("ob.__getattr__(a)") diff --git a/regtests/webclgl/mandel_purepy.py b/regtests/webclgl/mandel_purepy.py index 2cc5771..d7a84c8 100644 --- a/regtests/webclgl/mandel_purepy.py +++ b/regtests/webclgl/mandel_purepy.py @@ -30,5 +30,7 @@ def gpufunc(): return float(runaway) * 0.01 res = gpufunc() - pprint(res, 32) - + #pprint(res, 32) + for row in res: + a = [ round(v,3) for v in row ] + print( a ) From 9057cd5787623aaaf259f846b30cbbb3bf2409ea Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 18 Jun 2014 22:54:54 -0700 Subject: [PATCH 053/222] webclgl backend: fixes, new return type vec4. --- pythonjs/python_to_pythonjs.py | 10 +- pythonjs/pythonjs.js | 439 +++++++++++++++++-------------- pythonjs/pythonjs.py | 51 +++- pythonjs/runtime/builtins.py | 20 ++ regtests/webclgl/returns_vec4.py | 17 ++ regtests/webclgl/while_loop.py | 17 ++ 6 files changed, 336 insertions(+), 218 deletions(-) create mode 100644 regtests/webclgl/returns_vec4.py create mode 100644 regtests/webclgl/while_loop.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 071481a..60f0632 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1431,7 +1431,7 @@ def visit_Attribute(self, node): node_value = self.visit(node.value) - if self._with_dart or self._with_ll: + if self._with_dart or self._with_ll or self._with_glsl: return '%s.%s' %(node_value, node.attr) elif self._with_js: return '%s.%s' %(node_value, node.attr) @@ -2665,7 +2665,7 @@ def visit_FunctionDef(self, node): writer.write('var(%s)' %a) ##################################################################### - if self._with_dart: + if self._with_dart or self._with_glsl: pass elif self._with_js or javascript or self._with_ll: @@ -2939,6 +2939,10 @@ def visit_FunctionDef(self, node): writer.pull() ## end function body + if not self._with_dart and not self._with_lua and not self._with_js and not javascript and not self._with_glsl: + writer.write('%s.pythonscript_function=True'%node.name) + + if gpu: self._with_glsl = restore_with_glsl if gpu_main: @@ -2982,8 +2986,6 @@ def visit_FunctionDef(self, node): if return_type: writer.write('%s.return_type = "%s"'%(node.name, return_type)) - if not self._with_js and not javascript: - writer.write('%s.pythonscript_function=True'%node.name) if self._with_js and with_js_decorators: diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 5589adc..ba2de49 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -514,6 +514,7 @@ __unpack_array2d = function(arr, dims) { rows.append(row); } } + rows.pop(); if (( rows.length ) != h) { console.log("ERROR: __unpack_array2d, invalid height."); } @@ -521,6 +522,42 @@ __unpack_array2d = function(arr, dims) { } __unpack_array2d.pythonscript_function = true; +__unpack_vec4 = function(arr, dims) { + var rows,i,h,vec,w,row; + var __r_1; + __r_1 = dims; + w = ((__r_1 instanceof Array) ? __r_1[0] : __get__(__get__(__r_1, "__getitem__"), "__call__")([0], __NULL_OBJECT__)); + h = ((__r_1 instanceof Array) ? __r_1[1] : __get__(__get__(__r_1, "__getitem__"), "__call__")([1], __NULL_OBJECT__)); + rows = []; + i = 0; + var __iter2 = range(h); + if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } + for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { + var y = __iter2[ __idx2 ]; + row = []; + rows.append(row); + var __iter3 = range(w); + if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) ) { __iter3 = __object_keys__(__iter3) } + for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { + var x = __iter3[ __idx3 ]; + vec = []; + var __iter4 = range(4); + if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } + for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { + var j = __iter4[ __idx4 ]; + vec.append(arr[i]); + i += 1; + } + row.append(vec); + } + } + if (( rows.length ) != h) { + console.log("ERROR: __unpack_vec4, invalid height."); + } + return rows; +} + +__unpack_vec4.pythonscript_function = true; __getattr__ = function(ob, a) { if (ob.__getattr__) { @@ -639,10 +676,10 @@ __contains__ = function(ob, a) { throw new TypeError; } else { if (__test_if_true__(__is_typed_array(ob))) { - var __iter2 = ob; - if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } - for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { - var x = __iter2[ __idx2 ]; + var __iter5 = ob; + if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } + for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { + var x = __iter5[ __idx5 ]; if (( x ) == a) { return true; } @@ -725,10 +762,10 @@ __mul_op = function(a, b) { __jsdict = function(items) { var d,key; d = {}; - var __iter3 = items; - if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) ) { __iter3 = __object_keys__(__iter3) } - for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { - var item = __iter3[ __idx3 ]; + var __iter6 = items; + if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } + for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { + var item = __iter6[ __idx6 ]; key = item[0]; if (__test_if_true__(key.__uid__)) { key = key.__uid__; @@ -776,10 +813,10 @@ __jsdict_values = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object)) { arr = []; - var __iter4 = ob; - if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } - for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { - var key = __iter4[ __idx4 ]; + var __iter7 = ob; + if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } + for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { + var key = __iter7[ __idx7 ]; if (__test_if_true__(ob.hasOwnProperty(key))) { value = ob[key]; arr.push(value); @@ -795,10 +832,10 @@ __jsdict_items = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; - var __iter5 = ob; - if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } - for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { - var key = __iter5[ __idx5 ]; + var __iter8 = ob; + if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } + for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { + var key = __iter8[ __idx8 ]; if (__test_if_true__(Object.hasOwnProperty.call(ob, key))) { value = ob[key]; arr.push([key, value]); @@ -855,10 +892,10 @@ __object_keys__ = function(ob) { __bind_property_descriptors__ = function(o, klass) { var prop,desc; - var __iter6 = klass.__properties__; - if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } - for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { - var name = __iter6[ __idx6 ]; + var __iter9 = klass.__properties__; + if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } + for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { + var name = __iter9[ __idx9 ]; desc = __jsdict([["enumerable", true]]); prop = klass.__properties__[name]; if (__test_if_true__(prop["get"])) { @@ -869,10 +906,10 @@ __bind_property_descriptors__ = function(o, klass) { } Object.defineProperty(o, name, desc); } - var __iter7 = klass.__bases__; - if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } - for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { - var base = __iter7[ __idx7 ]; + var __iter10 = klass.__bases__; + if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } + for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { + var base = __iter10[ __idx10 ]; __bind_property_descriptors__(o, base); } } @@ -904,10 +941,10 @@ __sprintf = function(fmt, args) { arr = []; var i; i = 0; - var __iter8 = chunks; - if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } - for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { - var txt = __iter8[ __idx8 ]; + var __iter11 = chunks; + if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } + for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { + var txt = __iter11[ __idx11 ]; arr.append(txt); if (( i ) >= args.length) { break; @@ -940,10 +977,10 @@ __create_class__ = function(class_name, parents, attrs, props) { klass.__all_method_names__ = []; klass.__properties__ = props; klass.__attributes__ = attrs; - var __iter9 = attrs; - if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } - for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { - var key = __iter9[ __idx9 ]; + var __iter12 = attrs; + if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } + for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { + var key = __iter12[ __idx12 ]; if (( typeof(attrs[key]) ) == "function") { klass.__all_method_names__.push(key); f = attrs[key]; @@ -964,20 +1001,20 @@ __create_class__ = function(class_name, parents, attrs, props) { } klass.__setters__ = []; klass.__getters__ = []; - var __iter10 = klass.__properties__; - if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } - for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { - var name = __iter10[ __idx10 ]; + var __iter13 = klass.__properties__; + if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } + for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { + var name = __iter13[ __idx13 ]; prop = klass.__properties__[name]; klass.__getters__.push(name); if (__test_if_true__(prop["set"])) { klass.__setters__.push(name); } } - var __iter11 = klass.__bases__; - if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } - for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { - var base = __iter11[ __idx11 ]; + var __iter14 = klass.__bases__; + if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } + for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { + var base = __iter14[ __idx14 ]; Array.prototype.push.apply(klass.__getters__, base.__getters__); Array.prototype.push.apply(klass.__setters__, base.__setters__); Array.prototype.push.apply(klass.__all_method_names__, base.__all_method_names__); @@ -990,10 +1027,10 @@ __create_class__ = function(class_name, parents, attrs, props) { object.__dict__ = object; has_getattribute = false; has_getattr = false; - var __iter12 = klass.__all_method_names__; - if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } - for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { - var name = __iter12[ __idx12 ]; + var __iter15 = klass.__all_method_names__; + if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } + for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { + var name = __iter15[ __idx15 ]; if (( name ) == "__getattribute__") { has_getattribute = true; } else { @@ -1138,8 +1175,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 422: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 423: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 442: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 443: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1361,10 +1398,10 @@ _setup_str_prototype = function(args, kwargs) { arr = a["$wrapped"]; } i = 0; - var __iter13 = arr; - if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } - for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { - var value = __iter13[ __idx13 ]; + var __iter16 = arr; + if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } + for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { + var value = __iter16[ __idx16 ]; out += value; i += 1; if (( i ) < arr.length) { @@ -1406,10 +1443,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; - var __iter14 = this; - if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } - for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { - var char = __iter14[ __idx14 ]; + var __iter17 = this; + if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } + for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { + var char = __iter17[ __idx17 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1436,10 +1473,10 @@ _setup_str_prototype = function(args, kwargs) { var keys,r; r = this; keys = Object.keys(fmt); - var __iter15 = keys; - if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } - for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { - var key = __iter15[ __idx15 ]; + var __iter18 = keys; + if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } + for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { + var key = __iter18[ __idx18 ]; r = r.split(key).join(fmt[key]); } r = r.split("{").join("").split("}").join(""); @@ -1586,10 +1623,10 @@ _setup_array_prototype = function(args, kwargs) { stop = this.length; } arr = [start, (stop - start)]; - var __iter16 = items; - if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } - for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { - var item = __iter16[ __idx16 ]; + var __iter19 = items; + if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } + for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { + var item = __iter19[ __idx19 ]; arr.push(item); } this.splice.apply(this, arr); @@ -1605,10 +1642,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); var extend = function(other) { - var __iter17 = other; - if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } - for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { - var obj = __iter17[ __idx17 ]; + var __iter20 = other; + if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } + for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { + var obj = __iter20[ __idx20 ]; this.push(obj); } return this; @@ -1640,10 +1677,10 @@ _setup_array_prototype = function(args, kwargs) { var count = function(obj) { var a; a = 0; - var __iter18 = this; - if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } - for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { - var item = __iter18[ __idx18 ]; + var __iter21 = this; + if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } + for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { + var item = __iter21[ __idx21 ]; if (( item ) === obj) { a += 1; } @@ -1699,10 +1736,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { - var __iter19 = this; - if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } - for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { - var item = __iter19[ __idx19 ]; + var __iter22 = this; + if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } + for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { + var item = __iter22[ __idx22 ]; if (( other.indexOf(item) ) == -1) { return false; } @@ -1870,12 +1907,12 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b,__iterator__21; - __iterator__21 = __get__(__get__(arr, "__iter__", "no iterator - line 898: for b in arr:"), "__call__")([], __NULL_OBJECT__); - var __next__21; - __next__21 = __get__(__iterator__21, "next"); - while (( __iterator__21.index ) < __iterator__21.length) { - b = __next__21(); + var b,__iterator__24; + __iterator__24 = __get__(__get__(arr, "__iter__", "no iterator - line 918: for b in arr:"), "__call__")([], __NULL_OBJECT__); + var __next__24; + __next__24 = __get__(__iterator__24, "next"); + while (( __iterator__24.index ) < __iterator__24.length) { + b = __next__24(); a += b; } return a; @@ -1911,7 +1948,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 918: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 938: return ob.__len__()"), "__call__")(); } } } @@ -1931,7 +1968,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 922: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 942: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -1949,12 +1986,12 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__22; - __iterator__22 = __get__(__get__(objs, "__iter__", "no iterator - line 927: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__22; - __next__22 = __get__(__iterator__22, "next"); - while (( __iterator__22.index ) < __iterator__22.length) { - ob = __next__22(); + var ob,__iterator__25; + __iterator__25 = __get__(__get__(objs, "__iter__", "no iterator - line 947: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__25; + __next__25 = __get__(__iterator__25, "next"); + while (( __iterator__25.index ) < __iterator__25.length) { + ob = __next__25(); v = __get__(func, "__call__")([ob], __NULL_OBJECT__); arr.push(v); } @@ -1976,12 +2013,12 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__23; - __iterator__23 = __get__(__get__(objs, "__iter__", "no iterator - line 935: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__23; - __next__23 = __get__(__iterator__23, "next"); - while (( __iterator__23.index ) < __iterator__23.length) { - ob = __next__23(); + var ob,__iterator__26; + __iterator__26 = __get__(__get__(objs, "__iter__", "no iterator - line 955: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__26; + __next__26 = __get__(__iterator__26, "next"); + while (( __iterator__26.index ) < __iterator__26.length) { + ob = __next__26(); if (__test_if_true__(__get__(func, "__call__")([ob], __NULL_OBJECT__))) { arr.push(ob); } @@ -2003,12 +2040,12 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__24; - __iterator__24 = __get__(__get__(lst, "__iter__", "no iterator - line 944: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__24; - __next__24 = __get__(__iterator__24, "next"); - while (( __iterator__24.index ) < __iterator__24.length) { - value = __next__24(); + var value,__iterator__27; + __iterator__27 = __get__(__get__(lst, "__iter__", "no iterator - line 964: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__27; + __next__27 = __get__(__iterator__27, "next"); + while (( __iterator__27.index ) < __iterator__27.length) { + value = __next__27(); if (( a ) === null) { a = value; } else { @@ -2034,12 +2071,12 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__25; - __iterator__25 = __get__(__get__(lst, "__iter__", "no iterator - line 951: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__25; - __next__25 = __get__(__iterator__25, "next"); - while (( __iterator__25.index ) < __iterator__25.length) { - value = __next__25(); + var value,__iterator__28; + __iterator__28 = __get__(__get__(lst, "__iter__", "no iterator - line 971: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__28; + __next__28 = __get__(__iterator__28, "next"); + while (( __iterator__28.index ) < __iterator__28.length) { + value = __next__28(); if (( a ) === null) { a = value; } else { @@ -2149,7 +2186,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 986: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1006: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2259,28 +2296,28 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o,__iterator__26; - __iterator__26 = __get__(__get__(ob, "__iter__", "no iterator - line 1041: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__26; - __next__26 = __get__(__iterator__26, "next"); - while (( __iterator__26.index ) < __iterator__26.length) { - o = __next__26(); + var o,__iterator__29; + __iterator__29 = __get__(__get__(ob, "__iter__", "no iterator - line 1061: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__29; + __next__29 = __get__(__iterator__29, "next"); + while (( __iterator__29.index ) < __iterator__29.length) { + o = __next__29(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1043: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1043: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1043: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1063: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1063: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1063: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1045: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1045: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1045: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1065: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1065: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1065: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key,__iterator__27; - __iterator__27 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1047: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__27; - __next__27 = __get__(__iterator__27, "next"); - while (( __iterator__27.index ) < __iterator__27.length) { - key = __next__27(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1048: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1049: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + var key,__iterator__30; + __iterator__30 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1067: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__30; + __next__30 = __get__(__iterator__30, "next"); + while (( __iterator__30.index ) < __iterator__30.length) { + key = __next__30(); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1068: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1069: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2306,16 +2343,16 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key,__iterator__28; - __iterator__28 = __get__(__get__(keys, "__iter__", "no iterator - line 1057: for key in keys:"), "__call__")([], __NULL_OBJECT__); - var __next__28; - __next__28 = __get__(__iterator__28, "next"); - while (( __iterator__28.index ) < __iterator__28.length) { - key = __next__28(); - value = __get__(self["$wrapped"], "__getitem__", "line 1058: value = self[...][key]")([key], __NULL_OBJECT__); + var key,__iterator__31; + __iterator__31 = __get__(__get__(keys, "__iter__", "no iterator - line 1077: for key in keys:"), "__call__")([], __NULL_OBJECT__); + var __next__31; + __next__31 = __get__(__iterator__31, "next"); + while (( __iterator__31.index ) < __iterator__31.length) { + key = __next__31(); + value = __get__(self["$wrapped"], "__getitem__", "line 1078: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1061: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1081: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2377,7 +2414,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1077: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1097: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2401,13 +2438,13 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key,__iterator__29; - __iterator__29 = __get__(__get__(other, "__iter__", "no iterator - line 1085: for key in other:"), "__call__")([], __NULL_OBJECT__); - var __next__29; - __next__29 = __get__(__iterator__29, "next"); - while (( __iterator__29.index ) < __iterator__29.length) { - key = __next__29(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1086: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1086: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + var key,__iterator__32; + __iterator__32 = __get__(__get__(other, "__iter__", "no iterator - line 1105: for key in other:"), "__call__")([], __NULL_OBJECT__); + var __next__32; + __next__32 = __get__(__iterator__32, "next"); + while (( __iterator__32.index ) < __iterator__32.length) { + key = __next__32(); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1106: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1106: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2426,13 +2463,13 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key,__iterator__30; - __iterator__30 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1090: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__30; - __next__30 = __get__(__iterator__30, "next"); - while (( __iterator__30.index ) < __iterator__30.length) { - key = __next__30(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1091: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + var key,__iterator__33; + __iterator__33 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1110: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__33; + __next__33 = __get__(__iterator__33, "next"); + while (( __iterator__33.index ) < __iterator__33.length) { + key = __next__33(); + __get__(__get__(arr, "append", "missing attribute `append` - line 1111: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2477,7 +2514,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1101: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1121: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2613,10 +2650,10 @@ __dict_values = function(args, kwargs) { var self = __args__['self']; keys = Object.keys(self["$wrapped"]); out = []; - var __iter20 = keys; - if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } - for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { - var key = __iter20[ __idx20 ]; + var __iter23 = keys; + if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } + for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { + var key = __iter23[ __idx23 ]; out.push(self["$wrapped"][key]); } return out; @@ -2703,10 +2740,10 @@ set = function(args, kwargs) { } fallback = false; if (__test_if_true__(hashtable)) { - var __iter21 = a; - if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } - for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { - var b = __iter21[ __idx21 ]; + var __iter24 = a; + if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } + for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { + var b = __iter24[ __idx24 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[key] = b; @@ -2721,20 +2758,20 @@ set = function(args, kwargs) { } s = []; if (__test_if_true__(fallback)) { - var __iter22 = a; - if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } - for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { - var item = __iter22[ __idx22 ]; + var __iter25 = a; + if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } + for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { + var item = __iter25[ __idx25 ]; if (( s.indexOf(item) ) == -1) { s.push(item); } } } else { __sort_method(keys); - var __iter23 = keys; - if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } - for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { - var key = __iter23[ __idx23 ]; + var __iter26 = keys; + if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } + for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { + var key = __iter26[ __idx26 ]; s.push(hashtable[key]); } } @@ -2782,7 +2819,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1302: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1302: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1322: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1322: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -2806,7 +2843,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1326: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1346: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -2841,7 +2878,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1334: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1354: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -2867,7 +2904,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1344: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1344: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1364: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1364: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -2906,7 +2943,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1363: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1363: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1383: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1383: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -2977,13 +3014,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1388: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1388: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1408: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1408: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1393: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1413: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3043,7 +3080,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1421: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1441: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3062,13 +3099,13 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value,__iterator__35; - __iterator__35 = __get__(__get__(lst, "__iter__", "no iterator - line 1425: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__35; - __next__35 = __get__(__iterator__35, "next"); - while (( __iterator__35.index ) < __iterator__35.length) { - value = __next__35(); - __get__(__get__(self, "append", "missing attribute `append` - line 1426: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + var value,__iterator__38; + __iterator__38 = __get__(__get__(lst, "__iter__", "no iterator - line 1445: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__38; + __next__38 = __get__(__iterator__38, "next"); + while (( __iterator__38.index ) < __iterator__38.length) { + value = __next__38(); + __get__(__get__(self, "append", "missing attribute `append` - line 1446: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3110,7 +3147,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1438: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1458: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3128,9 +3165,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1442: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1462: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1443: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1463: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3267,17 +3304,17 @@ json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (f __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; - var __iter24 = threading.workers; - if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } - for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { - var b = __iter24[ __idx24 ]; + var __iter27 = threading.workers; + if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } + for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { + var b = __iter27[ __idx27 ]; other = b["worker"]; args = b["args"]; if (( other ) !== worker) { - var __iter25 = args; - if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } - for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { - var arg = __iter25[ __idx25 ]; + var __iter28 = args; + if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } + for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { + var arg = __iter28[ __idx28 ]; if (( arg ) === ob) { if (! (__contains__(a, other))) { a.append(other); @@ -3309,10 +3346,10 @@ __start_new_thread = function(f, args) { if (( event.data.type ) == "append") { a = args[event.data.argindex]; a.push(event.data.value); - var __iter26 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } - for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { - var other = __iter26[ __idx26 ]; + var __iter29 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } + for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { + var other = __iter29[ __idx29 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); } } else { @@ -3324,10 +3361,10 @@ __start_new_thread = function(f, args) { } else { a[event.data.index] = value; } - var __iter27 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } - for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { - var other = __iter27[ __idx27 ]; + var __iter30 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } + for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { + var other = __iter30[ __idx30 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); } } else { @@ -3342,10 +3379,10 @@ __start_new_thread = function(f, args) { jsargs = []; var i; i = 0; - var __iter28 = args; - if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } - for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { - var arg = __iter28[ __idx28 ]; + var __iter31 = args; + if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } + for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { + var arg = __iter31[ __idx31 ]; if (__test_if_true__(arg.jsify)) { jsargs.append(arg.jsify()); } else { diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 12830ac..3397400 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -298,33 +298,58 @@ def _visit_function(self, node): lines.append(' var shader = "\\n".join(__shader__)') lines.append(' var __kernel = __webclgl.createKernel( shader, header );') - lines.append(' var __return_length = 64') ## minimum size is 64 + if gpu_return_types: + if 'array' in gpu_return_types: + w,h = gpu_return_types['array'][1:-1].split(',') + elif 'vec4' in gpu_return_types: + w,h = gpu_return_types['vec4'][1:-1].split(',') + else: + raise NotImplementedError + lines.append(' var __return_length = %s * %s' %(w,h)) + else: + lines.append(' var __return_length = 64') ## minimum size is 64 for i,arg in enumerate(args): lines.append(' if (%s instanceof Array) {' %arg) - lines.append(' __return_length = %s.length==2 ? %s : %s.length' %(arg,arg, arg) ) + #lines.append(' __return_length = %s.length==2 ? %s : %s.length' %(arg,arg, arg) ) lines.append(' var %s_buffer = __webclgl.createBuffer(%s.length, "FLOAT", %s.scale || __offset)' %(arg,arg,arg)) lines.append(' __webclgl.enqueueWriteBuffer(%s_buffer, %s)' %(arg, arg)) lines.append(' __kernel.setKernelArg(%s, %s_buffer)' %(i, arg)) lines.append(' } else { __kernel.setKernelArg(%s, %s) }' %(i, arg)) - if gpu_return_types: - rtype = gpu_return_types[ 'array' ] - lines.append(' __return_length = %s' %rtype) - - lines.append(' var return_buffer = __webclgl.createBuffer(__return_length, "FLOAT", __offset)') + #lines.append(' console.log("kernel.compile...")') lines.append(' __kernel.compile()') - - lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, return_buffer)') + #lines.append(' console.log("kernel.compile OK")') if gpu_return_types: - rtype = gpu_return_types[ 'array' ] - lines.append(' var arrayres = __webclgl.enqueueReadBuffer_Float( return_buffer )') - lines.append(' return __unpack_array2d(arrayres, %s)' %rtype ) + if 'array' in gpu_return_types: + dim = gpu_return_types[ 'array' ] + lines.append(' var rbuffer_array = __webclgl.createBuffer(%s, "FLOAT", __offset)' %dim) + lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, rbuffer_array)') + lines.append(' var _raw_array_res = __webclgl.enqueueReadBuffer_Float( rbuffer_array )') + else: + dim = gpu_return_types[ 'vec4' ] + lines.append(' var rbuffer_vec4 = __webclgl.createBuffer(%s, "FLOAT4", __offset)' %dim) + lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, rbuffer_vec4)') + lines.append(' var _raw_vec4_res = __webclgl.enqueueReadBuffer_Float4( rbuffer_vec4 )') + + if 'array' in gpu_return_types and 'vec4' in gpu_return_types: + adim = gpu_return_types['array'] + vdim = gpu_return_types['vec4'] + lines.append(' return [__unpack_array2d(_raw_array_res, %s),__unpack_vec4(_raw_vec4_res, %s)]' %(adim, vdim)) + elif 'vec4' in gpu_return_types: + lines.append(' return __unpack_vec4(_raw_vec4_res, %s)' %gpu_return_types['vec4']) + else: + lines.append(' return __unpack_array2d(_raw_array_res, %s)' %gpu_return_types['array']) + else: - lines.append(' return __webclgl.enqueueReadBuffer_Float( return_buffer )') + lines.append(' var __return = __webclgl.createBuffer(__return_length, "FLOAT", __offset)') + lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, __return)') + lines.append(' return __webclgl.enqueueReadBuffer_Float( __return )') + lines.append('} // end of wrapper') + return '\n'.join(lines) elif len(node.decorator_list)==1 and not ( isinstance(node.decorator_list[0], ast.Call) and node.decorator_list[0].func.id not in self.special_decorators ): diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 1ec4fe8..c008b88 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -25,10 +25,30 @@ def __unpack_array2d(arr, dims): if row.length >= w: row = [] rows.append(row) + rows.pop() if rows.length != h: print('ERROR: __unpack_array2d, invalid height.') return rows + def __unpack_vec4(arr, dims): + w,h = dims + rows = [] + i=0 + for y in range(h): + row = [] + rows.append( row ) + for x in range(w): + vec = [] + for j in range(4): + vec.append( arr[i]) + i += 1 + row.append( vec ) + + if rows.length != h: + print('ERROR: __unpack_vec4, invalid height.') + return rows + + def __getattr__(ob, a ): if ob.__getattr__: return JS("ob.__getattr__(a)") diff --git a/regtests/webclgl/returns_vec4.py b/regtests/webclgl/returns_vec4.py new file mode 100644 index 0000000..69305f9 --- /dev/null +++ b/regtests/webclgl/returns_vec4.py @@ -0,0 +1,17 @@ +"""while loop""" + + +def main(): + + @returns( vec4=[32,32] ) + @gpu.main + def gpufunc(x,y,z,w): + float x + float y + float z + float w + vec4 V = vec4(x,y,z,w) + return V + + res = gpufunc( 0.1, 0.2, 0.3, 0.4 ) + print(res) diff --git a/regtests/webclgl/while_loop.py b/regtests/webclgl/while_loop.py new file mode 100644 index 0000000..85e5816 --- /dev/null +++ b/regtests/webclgl/while_loop.py @@ -0,0 +1,17 @@ +"""while loop""" + + +def main(): + + @returns( array=[32,32] ) + @gpu.main + def gpufunc(): + int i = 0 + while i < 10: + i += 1 + return float(i) * 0.01 + + res = gpufunc() + for row in res: + a = [ round(v,3) for v in row ] + print( a ) From 61569030285a23526cf8fab09b385620f7cefdb3 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 19 Jun 2014 02:00:32 -0700 Subject: [PATCH 054/222] webCLgl: when calling GPU wrapper function, inline object attributes from javascript wrapper scope. dynamically inserts as constants into shader main kernel. (main kernel shader is recompiled each call) --- pythonjs/python_to_pythonjs.py | 8 ++++++-- pythonjs/pythonjs.py | 20 ++++++++++++++++++-- regtests/webclgl/inline_objects.py | 25 +++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 regtests/webclgl/inline_objects.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 60f0632..dbd0f32 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1430,8 +1430,12 @@ def visit_Attribute(self, node): node_value = self.visit(node.value) - - if self._with_dart or self._with_ll or self._with_glsl: + if self._with_glsl: + if node_value not in self._typedef_vars: ## dynamic var + return 'glsl_inline_object(%s.%s)' %(node_value, node.attr) + else: + return '%s.%s' %(node_value, node.attr) + elif self._with_dart or self._with_ll: return '%s.%s' %(node_value, node.attr) elif self._with_js: return '%s.%s' %(node_value, node.attr) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 3397400..e3083fc 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -249,6 +249,7 @@ def _visit_function(self, node): x.append( 'float* %s' %arg ) if is_main: + lines.append( 'var __shader__ = [];') ## dynamic lines.append( '__shader__.push("void main( %s ) {");' %', '.join(x) ) elif return_type: lines.append( '__shader_header__.push("%s %s( %s ) {");' %(return_type, node.name, ', '.join(x)) ) @@ -269,7 +270,20 @@ def _visit_function(self, node): else: for sub in self.visit(child).splitlines(): if is_main: - lines.append( '__shader__.push("%s");' %(self.indent()+sub) ) + if '`' in sub: + chunks = sub.split('`') + sub = [] + for ci,chk in enumerate(chunks): + if not ci%2: + if ci==0: + sub.append('"%s"'%chk) + else: + sub.append(' + "%s"'%chk) + else: + sub.append(' + __glsl_inline_object(%s)' %chk) + lines.append( '__shader__.push(%s);' %''.join(sub)) + else: + lines.append( '__shader__.push("%s");' %(self.indent()+sub) ) else: lines.append( '__shader_header__.push("%s");' %(self.indent()+sub) ) self._glsl = False @@ -461,7 +475,9 @@ def _visit_call_helper_new(self, node): def visit_Call(self, node): name = self.visit(node.func) - if name == 'instanceof': ## this gets used by "with javascript:" blocks to test if an instance is a JavaScript type + if name == 'glsl_inline_object': + return '`%s`' %self.visit(node.args[0]) + elif name == 'instanceof': ## this gets used by "with javascript:" blocks to test if an instance is a JavaScript type return self._visit_call_helper_instanceof( node ) elif name == 'new': diff --git a/regtests/webclgl/inline_objects.py b/regtests/webclgl/inline_objects.py new file mode 100644 index 0000000..b4c0c30 --- /dev/null +++ b/regtests/webclgl/inline_objects.py @@ -0,0 +1,25 @@ +"""inline dynamic object data""" +class A: + def __init__(self): + self.myattr = 0.4 + +def main(): + def my_wrapper(a,b, x,y,z,w): + + @returns( vec4=[32,32] ) + @gpu.main + def gpufunc(x,y,z,w): + float x + float y + float z + float w + float D = a.myattr + vec4 V = vec4( x+D, y+D,z,w) + return V + + return gpufunc( x,y,z,w ) + + ai = A() + bi = A() + res = my_wrapper(ai,bi, 0.1, 0.2, 0.3, 0.4) + print(res) From c4cd822b5694fa011f99d6db8f53a0a24e06ac8a Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 19 Jun 2014 03:02:32 -0700 Subject: [PATCH 055/222] __glsl_inline_object prototype. --- pythonjs/pythonjs.js | 86 ++++++++++++++++++++---------------- pythonjs/runtime/builtins.py | 7 +++ 2 files changed, 55 insertions(+), 38 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index ba2de49..206d9c6 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -496,6 +496,16 @@ KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Obj ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError"; AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError"; RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError"; +__glsl_inline_object = function(ob) { + + if (ob instanceof Array) { + return "TODO"; + } else { + return ob; + } +} + +__glsl_inline_object.pythonscript_function = true; __unpack_array2d = function(arr, dims) { var h,rows,w,row; var __r_0; @@ -1175,8 +1185,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 442: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 443: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 449: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 450: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1908,7 +1918,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__24; - __iterator__24 = __get__(__get__(arr, "__iter__", "no iterator - line 918: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__24 = __get__(__get__(arr, "__iter__", "no iterator - line 925: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__24; __next__24 = __get__(__iterator__24, "next"); while (( __iterator__24.index ) < __iterator__24.length) { @@ -1948,7 +1958,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 938: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 945: return ob.__len__()"), "__call__")(); } } } @@ -1968,7 +1978,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 942: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 949: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -1987,7 +1997,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__25; - __iterator__25 = __get__(__get__(objs, "__iter__", "no iterator - line 947: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__25 = __get__(__get__(objs, "__iter__", "no iterator - line 954: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__25; __next__25 = __get__(__iterator__25, "next"); while (( __iterator__25.index ) < __iterator__25.length) { @@ -2014,7 +2024,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__26; - __iterator__26 = __get__(__get__(objs, "__iter__", "no iterator - line 955: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__26 = __get__(__get__(objs, "__iter__", "no iterator - line 962: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { @@ -2041,7 +2051,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__27; - __iterator__27 = __get__(__get__(lst, "__iter__", "no iterator - line 964: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__27 = __get__(__get__(lst, "__iter__", "no iterator - line 971: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); while (( __iterator__27.index ) < __iterator__27.length) { @@ -2072,7 +2082,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__28; - __iterator__28 = __get__(__get__(lst, "__iter__", "no iterator - line 971: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__28 = __get__(__get__(lst, "__iter__", "no iterator - line 978: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { @@ -2186,7 +2196,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1006: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1013: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2297,27 +2307,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__29; - __iterator__29 = __get__(__get__(ob, "__iter__", "no iterator - line 1061: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__29 = __get__(__get__(ob, "__iter__", "no iterator - line 1068: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__29; __next__29 = __get__(__iterator__29, "next"); while (( __iterator__29.index ) < __iterator__29.length) { o = __next__29(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1063: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1063: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1063: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1070: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1070: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1070: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1065: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1065: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1065: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1072: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1072: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1072: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__30; - __iterator__30 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1067: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__30 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1074: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__30; __next__30 = __get__(__iterator__30, "next"); while (( __iterator__30.index ) < __iterator__30.length) { key = __next__30(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1068: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1069: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1075: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1076: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2344,15 +2354,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__31; - __iterator__31 = __get__(__get__(keys, "__iter__", "no iterator - line 1077: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__31 = __get__(__get__(keys, "__iter__", "no iterator - line 1084: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__31; __next__31 = __get__(__iterator__31, "next"); while (( __iterator__31.index ) < __iterator__31.length) { key = __next__31(); - value = __get__(self["$wrapped"], "__getitem__", "line 1078: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1085: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1081: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1088: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2414,7 +2424,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1097: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1104: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2439,12 +2449,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__32; - __iterator__32 = __get__(__get__(other, "__iter__", "no iterator - line 1105: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__32 = __get__(__get__(other, "__iter__", "no iterator - line 1112: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__32; __next__32 = __get__(__iterator__32, "next"); while (( __iterator__32.index ) < __iterator__32.length) { key = __next__32(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1106: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1106: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1113: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1113: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2464,12 +2474,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__33; - __iterator__33 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1110: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__33 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1117: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__33; __next__33 = __get__(__iterator__33, "next"); while (( __iterator__33.index ) < __iterator__33.length) { key = __next__33(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1111: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1118: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2514,7 +2524,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1121: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1128: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2819,7 +2829,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1322: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1322: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1329: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1329: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -2843,7 +2853,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1346: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1353: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -2878,7 +2888,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1354: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1361: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -2904,7 +2914,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1364: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1364: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1371: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1371: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -2943,7 +2953,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1383: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1383: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1390: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1390: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3014,13 +3024,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1408: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1408: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1415: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1415: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1413: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1420: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3080,7 +3090,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1441: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1448: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3100,12 +3110,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__38; - __iterator__38 = __get__(__get__(lst, "__iter__", "no iterator - line 1445: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__38 = __get__(__get__(lst, "__iter__", "no iterator - line 1452: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__38; __next__38 = __get__(__iterator__38, "next"); while (( __iterator__38.index ) < __iterator__38.length) { value = __next__38(); - __get__(__get__(self, "append", "missing attribute `append` - line 1446: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1453: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3147,7 +3157,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1458: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1465: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3165,9 +3175,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1462: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1469: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1463: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1470: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index c008b88..8112173 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -16,6 +16,13 @@ JS('RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError";') with lowlevel: + + def __glsl_inline_object(ob): + if instanceof(ob,Array): + return 'TODO' + else: + return ob + def __unpack_array2d(arr, dims): w,h = dims row = [] From fff9f6051aa05b7a31ac35e39309bd0773db0eab Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 19 Jun 2014 14:48:58 -0700 Subject: [PATCH 056/222] webCLgl: fixed args passed to gpu main (webclgl parser is white space sensitive) --- pythonjs/pythonjs.py | 2 +- regtests/webclgl/inline_objects.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index e3083fc..0d6285e 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -250,7 +250,7 @@ def _visit_function(self, node): if is_main: lines.append( 'var __shader__ = [];') ## dynamic - lines.append( '__shader__.push("void main( %s ) {");' %', '.join(x) ) + lines.append( '__shader__.push("void main(%s) {");' %','.join(x) ) ## if shader failed to compile with error like "uniform float float" syntax error something likely went wrong here. elif return_type: lines.append( '__shader_header__.push("%s %s( %s ) {");' %(return_type, node.name, ', '.join(x)) ) else: diff --git a/regtests/webclgl/inline_objects.py b/regtests/webclgl/inline_objects.py index b4c0c30..147bc91 100644 --- a/regtests/webclgl/inline_objects.py +++ b/regtests/webclgl/inline_objects.py @@ -1,12 +1,12 @@ """inline dynamic object data""" class A: def __init__(self): - self.myattr = 0.4 + self.myattr = 22/7.0 def main(): def my_wrapper(a,b, x,y,z,w): - @returns( vec4=[32,32] ) + @returns( array=[32,32] ) @gpu.main def gpufunc(x,y,z,w): float x @@ -15,9 +15,9 @@ def gpufunc(x,y,z,w): float w float D = a.myattr vec4 V = vec4( x+D, y+D,z,w) - return V + return x+y+z+w+D - return gpufunc( x,y,z,w ) + return gpufunc(x,y,z,w) ai = A() bi = A() From bdb473c819c119ad86789b0aa56ddb33ad2a6d7a Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 19 Jun 2014 16:45:43 -0700 Subject: [PATCH 057/222] webCLgl backend: fixed return array of vec4 --- pythonjs/python_to_pythonjs.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index dbd0f32..1c3da6f 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -156,7 +156,7 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._with_glsl = False self._in_gpu_main = False - self._gpu_return_type = 'array' ## 'array' or float32 or array of 'vec4' float32's. + self._gpu_return_types = set() ## 'array' or float32, or array of 'vec4' float32's. self._source = source.splitlines() self._classes = dict() ## class name : [method names] @@ -1137,13 +1137,10 @@ def visit_Return(self, node): if self._with_glsl and self._in_gpu_main: ## _id_ is inserted into all function headers by pythonjs.py for glsl functions. - if self._gpu_return_type == 'array': + if 'array' in self._gpu_return_types: writer.write('out_float = %s' %self.visit(node.value)) - elif self._gpu_return_type == 'vec4': + if 'vec4' in self._gpu_return_types: writer.write('out_float4 = %s' %self.visit(node.value)) - else: - raise NotImplementedError(node) - elif self._inline: writer.write('__returns__%s = %s' %(self._inline[-1], self.visit(node.value)) ) @@ -2407,6 +2404,7 @@ def visit_FunctionDef(self, node): threaded = self._with_webworker jsfile = None + self._gpu_return_types = set() gpu = False gpu_main = False gpu_vectorize = False @@ -2449,6 +2447,7 @@ def visit_FunctionDef(self, node): for k in decorator.keywords: key = k.arg assert key == 'array' or key == 'vec4' + self._gpu_return_types.add(key) ## used in visit_Return ## return_type_keywords[ key ] = self.visit(k.value) else: From abcf2aad5e649c05560a9604af3fd196373d74d0 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Fri, 20 Jun 2014 16:23:06 -0700 Subject: [PATCH 058/222] webCLgl backend: fixed dynamic array inline into shader. --- pythonjs/python_to_pythonjs.py | 16 ++++- pythonjs/pythonjs.js | 93 +++++++++++++++++------------- pythonjs/pythonjs.py | 41 ++++++++++--- pythonjs/runtime/builtins.py | 18 +++++- regtests/webclgl/dynamic_list.py | 29 ++++++++++ regtests/webclgl/inline_objects.py | 14 ++--- 6 files changed, 154 insertions(+), 57 deletions(-) create mode 100644 regtests/webclgl/dynamic_list.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 1c3da6f..5cee38a 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1630,7 +1630,7 @@ def _visit_assign_helper(self, node, target): elif isinstance(target.slice, ast.Slice): code = '%s.__setslice__(%s, %s)' %(self.visit(target.value), self.visit(target.slice), self.visit(node.value)) - elif self._with_dart or self._with_ll: + elif self._with_dart or self._with_ll or self._with_glsl: code = '%s[ %s ] = %s' code = code % (self.visit(target.value), self.visit(target.slice.value), self.visit(node.value)) @@ -1722,6 +1722,20 @@ def _visit_assign_helper(self, node, target): elif isinstance(target, Name): node_value = self.visit( node.value ) ## node.value may have extra attributes after being visited + ######################### inserts glsl object at runtime ################################ + if 'glsl_inline_object' in node_value: + if isinstance(node.value, ast.Attribute): + ## this triggers special logic in pythonjs.py that will check if the object to + ## inline is an array, and if so this will be injected into the shader, + ## otherwise it will fallback to using glsl_inline_object. + ## this is a workaround because WebGL GLSL is missing support for array literals. + writer.write('glsl_inline_array(%s.%s, "%s")' %(node.value.value.id, node.value.attr, target.id)) + else: + pass + + ########################################################################################### + + if writer.is_at_global_level(): log('GLOBAL: %s : %s'%(target.id, node_value)) self._globals[ target.id ] = None diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 206d9c6..6bc674a 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -496,10 +496,23 @@ KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Obj ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError"; AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError"; RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError"; -__glsl_inline_object = function(ob) { +__glsl_inline_array = function(ob, name) { + var a,i; + a = [(((("float " + name) + "[") + ob.length) + "]")]; + i = 0; + while (( i ) < ob.length) { + a.push((((((";" + name) + "[") + i) + "]=") + ob[i])); + i += 1; + } + return "".join(a); +} + +__glsl_inline_array.pythonscript_function = true; +__glsl_inline_object = function(ob, name) { if (ob instanceof Array) { - return "TODO"; + console.log("ERROR: WebGL GLSL arrays can not be inlined in __glsl_inline_object"); + return ""; } else { return ob; } @@ -1185,8 +1198,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 449: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 450: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 463: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 464: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1918,7 +1931,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__24; - __iterator__24 = __get__(__get__(arr, "__iter__", "no iterator - line 925: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__24 = __get__(__get__(arr, "__iter__", "no iterator - line 939: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__24; __next__24 = __get__(__iterator__24, "next"); while (( __iterator__24.index ) < __iterator__24.length) { @@ -1958,7 +1971,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 945: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 959: return ob.__len__()"), "__call__")(); } } } @@ -1978,7 +1991,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 949: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 963: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -1997,7 +2010,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__25; - __iterator__25 = __get__(__get__(objs, "__iter__", "no iterator - line 954: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__25 = __get__(__get__(objs, "__iter__", "no iterator - line 968: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__25; __next__25 = __get__(__iterator__25, "next"); while (( __iterator__25.index ) < __iterator__25.length) { @@ -2024,7 +2037,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__26; - __iterator__26 = __get__(__get__(objs, "__iter__", "no iterator - line 962: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__26 = __get__(__get__(objs, "__iter__", "no iterator - line 976: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { @@ -2051,7 +2064,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__27; - __iterator__27 = __get__(__get__(lst, "__iter__", "no iterator - line 971: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__27 = __get__(__get__(lst, "__iter__", "no iterator - line 985: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); while (( __iterator__27.index ) < __iterator__27.length) { @@ -2082,7 +2095,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__28; - __iterator__28 = __get__(__get__(lst, "__iter__", "no iterator - line 978: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__28 = __get__(__get__(lst, "__iter__", "no iterator - line 992: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { @@ -2196,7 +2209,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1013: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1027: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2307,27 +2320,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__29; - __iterator__29 = __get__(__get__(ob, "__iter__", "no iterator - line 1068: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__29 = __get__(__get__(ob, "__iter__", "no iterator - line 1082: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__29; __next__29 = __get__(__iterator__29, "next"); while (( __iterator__29.index ) < __iterator__29.length) { o = __next__29(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1070: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1070: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1070: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1084: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1084: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1084: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1072: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1072: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1072: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1086: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1086: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1086: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__30; - __iterator__30 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1074: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__30 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1088: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__30; __next__30 = __get__(__iterator__30, "next"); while (( __iterator__30.index ) < __iterator__30.length) { key = __next__30(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1075: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1076: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1089: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1090: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2354,15 +2367,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__31; - __iterator__31 = __get__(__get__(keys, "__iter__", "no iterator - line 1084: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__31 = __get__(__get__(keys, "__iter__", "no iterator - line 1098: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__31; __next__31 = __get__(__iterator__31, "next"); while (( __iterator__31.index ) < __iterator__31.length) { key = __next__31(); - value = __get__(self["$wrapped"], "__getitem__", "line 1085: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1099: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1088: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1102: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2424,7 +2437,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1104: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1118: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2449,12 +2462,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__32; - __iterator__32 = __get__(__get__(other, "__iter__", "no iterator - line 1112: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__32 = __get__(__get__(other, "__iter__", "no iterator - line 1126: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__32; __next__32 = __get__(__iterator__32, "next"); while (( __iterator__32.index ) < __iterator__32.length) { key = __next__32(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1113: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1113: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1127: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1127: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2474,12 +2487,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__33; - __iterator__33 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1117: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__33 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1131: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__33; __next__33 = __get__(__iterator__33, "next"); while (( __iterator__33.index ) < __iterator__33.length) { key = __next__33(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1118: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1132: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2524,7 +2537,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1128: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1142: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2829,7 +2842,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1329: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1329: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1343: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1343: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -2853,7 +2866,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1353: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1367: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -2888,7 +2901,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1361: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1375: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -2914,7 +2927,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1371: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1371: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1385: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1385: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -2953,7 +2966,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1390: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1390: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1404: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1404: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3024,13 +3037,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1415: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1415: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1429: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1429: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1420: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1434: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3090,7 +3103,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1448: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1462: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3110,12 +3123,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__38; - __iterator__38 = __get__(__get__(lst, "__iter__", "no iterator - line 1452: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__38 = __get__(__get__(lst, "__iter__", "no iterator - line 1466: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__38; __next__38 = __get__(__iterator__38, "next"); while (( __iterator__38.index ) < __iterator__38.length) { value = __next__38(); - __get__(__get__(self, "append", "missing attribute `append` - line 1453: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1467: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3157,7 +3170,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1465: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1479: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3175,9 +3188,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1469: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1483: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1470: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1484: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 0d6285e..3bed46a 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -105,6 +105,8 @@ def visit_Module(self, node): lines.append('}) //end requirejs define') if self._has_glsl: + #header.append( 'var __shader_header__ = ["float a[4]=float[4](0.1,0.2,0.3,0.4);"]' ) + #header.append( 'var __shader_header__ = ["float a[4];a=1.1;"]' ) header.append( 'var __shader_header__ = []' ) header.append( 'var __shader__ = []' ) @@ -195,7 +197,19 @@ def visit_FunctionDef(self, node): def _visit_call_helper_var_glsl(self, node): lines = [] for key in node.keywords: - lines.append( '%s %s' %(key.value.id, key.arg)) + ptrs = key.value.id.count('POINTER') + if ptrs: + ## TODO - preallocate array size - if nonliteral arrays are used later ## + #name = key.arg + #pid = '[`%s.length`]' %name + #ptrs = pid * ptrs + #lines.append( '%s %s' %(key.value.id.replace('POINTER',''), name+ptrs)) + + ## assume that this is a dynamic variable and will be typedef'ed by + ## __glsl_dynamic_typedef() is inserted just before the assignment. + pass + else: + lines.append( '%s %s' %(key.value.id, key.arg)) return ';'.join(lines) @@ -271,6 +285,8 @@ def _visit_function(self, node): for sub in self.visit(child).splitlines(): if is_main: if '`' in sub: + check_for_array = False + chunks = sub.split('`') sub = [] for ci,chk in enumerate(chunks): @@ -280,10 +296,20 @@ def _visit_function(self, node): else: sub.append(' + "%s"'%chk) else: - sub.append(' + __glsl_inline_object(%s)' %chk) - lines.append( '__shader__.push(%s);' %''.join(sub)) + if chk.startswith('__glsl_inline_array'): + check_for_array = chk.split('(')[-1].split(',')[0] + sub.append(' + %s' %chk) + + if check_for_array: + lines.append( 'if (%s instanceof Array) { __shader__.push(%s); } else{' %(check_for_array,''.join(sub)) ) + elif lines[-1].endswith(' else{'): + lines.append( '__shader__.push(%s); } /*end else*/' %''.join(sub)) + else: + lines.append( '__shader__.push(%s);' %''.join(sub)) + else: lines.append( '__shader__.push("%s");' %(self.indent()+sub) ) + else: lines.append( '__shader_header__.push("%s");' %(self.indent()+sub) ) self._glsl = False @@ -310,6 +336,7 @@ def _visit_function(self, node): lines.append(' var __webclgl = new WebCLGL()') lines.append(' var header = "\\n".join(__shader_header__)') lines.append(' var shader = "\\n".join(__shader__)') + #lines.append(' console.log(shader)') lines.append(' var __kernel = __webclgl.createKernel( shader, header );') if gpu_return_types: @@ -476,7 +503,10 @@ def _visit_call_helper_new(self, node): def visit_Call(self, node): name = self.visit(node.func) if name == 'glsl_inline_object': - return '`%s`' %self.visit(node.args[0]) + return '`__glsl_inline_object(%s)`' %self.visit(node.args[0]) + elif name == 'glsl_inline_array': + return '`__glsl_inline_array(%s, "%s")`' %(self.visit(node.args[0]), node.args[1].s) + elif name == 'instanceof': ## this gets used by "with javascript:" blocks to test if an instance is a JavaScript type return self._visit_call_helper_instanceof( node ) @@ -603,14 +633,11 @@ def _visit_call_helper_var(self, node): fnode._local_vars.add( arg ) for arg in rem: args.remove( arg ) - out = [] - if args: out.append( 'var ' + ','.join(args) ) if node.keywords: out.append( 'var ' + ','.join([key.arg for key in node.keywords]) ) - return ';'.join(out) def _inline_code_helper(self, s): diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 8112173..d5fdb16 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -16,10 +16,24 @@ JS('RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError";') with lowlevel: + def __glsl_inline_array(ob, name): + ## normally it would be ok to just return `float name[n]`, and then in __glsl_inline_object + ## return the literal array as `{a,b,c}`, but no static arrays are allowed in WebGL GLSL. + ## note: only array types need to be dynamically typedef with fixed size given ## + a = ['float ' + name + '[' + ob.length + ']'] + i = 0 + while i < ob.length: + a.push(';'+name+'['+i+']='+ob[i]) + i += 1 + return ''.join(a) + - def __glsl_inline_object(ob): + def __glsl_inline_object(ob, name): if instanceof(ob,Array): - return 'TODO' + #return '{'+ob.toString()+'}' ## no static arrays in WebGL GLSL + #return 'float['+ob.length+'](' + ob.toString() + ')' ## this will not work either + print('ERROR: WebGL GLSL arrays can not be inlined in __glsl_inline_object') + return '' else: return ob diff --git a/regtests/webclgl/dynamic_list.py b/regtests/webclgl/dynamic_list.py new file mode 100644 index 0000000..ac12f83 --- /dev/null +++ b/regtests/webclgl/dynamic_list.py @@ -0,0 +1,29 @@ +"""inline dynamic list""" +from random import random + +class G: + def __init__(self): + self.pi = 7/22.0 + self.scale = 0.1 + self.arr1 = [ random() for i in range(4) ] + self.arr2 = [ random()*0.01 for i in range(32) ] + + @returns( array=[16,16] ) + @gpu.main + def gpufunc(x,y,z,w): + float x + float y + float z + float w + float* a = self.arr1 + float m = self.scale + a[3] = 0.5 + return a[0] * self.pi * m + + self.gpufunc = gpufunc + + +def main(): + g = G() + res = g.gpufunc(0.1, 0.2, 0.3, 0.4) + print(res) diff --git a/regtests/webclgl/inline_objects.py b/regtests/webclgl/inline_objects.py index 147bc91..c2e7e32 100644 --- a/regtests/webclgl/inline_objects.py +++ b/regtests/webclgl/inline_objects.py @@ -1,7 +1,7 @@ """inline dynamic object data""" class A: - def __init__(self): - self.myattr = 22/7.0 + def __init__(self, value): + self.readonly_attr = value def main(): def my_wrapper(a,b, x,y,z,w): @@ -13,13 +13,13 @@ def gpufunc(x,y,z,w): float y float z float w - float D = a.myattr - vec4 V = vec4( x+D, y+D,z,w) - return x+y+z+w+D + float D = a.readonly_attr + vec4 V = vec4( x+D, y+b.readonly_attr,z,w) + return V.x return gpufunc(x,y,z,w) - ai = A() - bi = A() + ai = A(22/7.0) + bi = A(0.420) res = my_wrapper(ai,bi, 0.1, 0.2, 0.3, 0.4) print(res) From a073ac78b064641ead977480e439660eae82815d Mon Sep 17 00:00:00 2001 From: hartsantler Date: Fri, 20 Jun 2014 20:52:39 -0700 Subject: [PATCH 059/222] webCLgl backend: use `len(a)` and iterate `for i in range(len(a)):` loop over lists (inlined GLSL arrays) --- pythonjs/pythonjs.js | 77 ++++++++++++----------- pythonjs/pythonjs.py | 46 ++++++++------ pythonjs/runtime/builtins.py | 2 + regtests/webclgl/for_loop_dynamic_list.py | 38 +++++++++++ 4 files changed, 107 insertions(+), 56 deletions(-) create mode 100644 regtests/webclgl/for_loop_dynamic_list.py diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 6bc674a..748408f 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -504,6 +504,7 @@ __glsl_inline_array = function(ob, name) { a.push((((((";" + name) + "[") + i) + "]=") + ob[i])); i += 1; } + a.push((((";int _len_" + name) + "=") + ob.length)); return "".join(a); } @@ -1198,8 +1199,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 463: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 464: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 465: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 466: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1931,7 +1932,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__24; - __iterator__24 = __get__(__get__(arr, "__iter__", "no iterator - line 939: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__24 = __get__(__get__(arr, "__iter__", "no iterator - line 941: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__24; __next__24 = __get__(__iterator__24, "next"); while (( __iterator__24.index ) < __iterator__24.length) { @@ -1971,7 +1972,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 959: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 961: return ob.__len__()"), "__call__")(); } } } @@ -1991,7 +1992,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 963: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 965: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2010,7 +2011,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__25; - __iterator__25 = __get__(__get__(objs, "__iter__", "no iterator - line 968: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__25 = __get__(__get__(objs, "__iter__", "no iterator - line 970: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__25; __next__25 = __get__(__iterator__25, "next"); while (( __iterator__25.index ) < __iterator__25.length) { @@ -2037,7 +2038,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__26; - __iterator__26 = __get__(__get__(objs, "__iter__", "no iterator - line 976: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__26 = __get__(__get__(objs, "__iter__", "no iterator - line 978: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { @@ -2064,7 +2065,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__27; - __iterator__27 = __get__(__get__(lst, "__iter__", "no iterator - line 985: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__27 = __get__(__get__(lst, "__iter__", "no iterator - line 987: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); while (( __iterator__27.index ) < __iterator__27.length) { @@ -2095,7 +2096,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__28; - __iterator__28 = __get__(__get__(lst, "__iter__", "no iterator - line 992: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__28 = __get__(__get__(lst, "__iter__", "no iterator - line 994: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { @@ -2209,7 +2210,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1027: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1029: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2320,27 +2321,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__29; - __iterator__29 = __get__(__get__(ob, "__iter__", "no iterator - line 1082: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__29 = __get__(__get__(ob, "__iter__", "no iterator - line 1084: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__29; __next__29 = __get__(__iterator__29, "next"); while (( __iterator__29.index ) < __iterator__29.length) { o = __next__29(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1084: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1084: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1084: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1086: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1086: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1086: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1086: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1086: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1086: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1088: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1088: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1088: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__30; - __iterator__30 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1088: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__30 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1090: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__30; __next__30 = __get__(__iterator__30, "next"); while (( __iterator__30.index ) < __iterator__30.length) { key = __next__30(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1089: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1090: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1091: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1092: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2367,15 +2368,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__31; - __iterator__31 = __get__(__get__(keys, "__iter__", "no iterator - line 1098: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__31 = __get__(__get__(keys, "__iter__", "no iterator - line 1100: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__31; __next__31 = __get__(__iterator__31, "next"); while (( __iterator__31.index ) < __iterator__31.length) { key = __next__31(); - value = __get__(self["$wrapped"], "__getitem__", "line 1099: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1101: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1102: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1104: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2437,7 +2438,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1118: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1120: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2462,12 +2463,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__32; - __iterator__32 = __get__(__get__(other, "__iter__", "no iterator - line 1126: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__32 = __get__(__get__(other, "__iter__", "no iterator - line 1128: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__32; __next__32 = __get__(__iterator__32, "next"); while (( __iterator__32.index ) < __iterator__32.length) { key = __next__32(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1127: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1127: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1129: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1129: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2487,12 +2488,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__33; - __iterator__33 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1131: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__33 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1133: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__33; __next__33 = __get__(__iterator__33, "next"); while (( __iterator__33.index ) < __iterator__33.length) { key = __next__33(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1132: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1134: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2537,7 +2538,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1142: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1144: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2842,7 +2843,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1343: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1343: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1345: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1345: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -2866,7 +2867,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1367: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1369: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -2901,7 +2902,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1375: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1377: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -2927,7 +2928,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1385: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1385: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1387: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1387: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -2966,7 +2967,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1404: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1404: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1406: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1406: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3037,13 +3038,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1429: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1429: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1431: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1431: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1434: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1436: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3103,7 +3104,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1462: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1464: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3123,12 +3124,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__38; - __iterator__38 = __get__(__get__(lst, "__iter__", "no iterator - line 1466: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__38 = __get__(__get__(lst, "__iter__", "no iterator - line 1468: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__38; __next__38 = __get__(__iterator__38, "next"); while (( __iterator__38.index ) < __iterator__38.length) { value = __next__38(); - __get__(__get__(self, "append", "missing attribute `append` - line 1467: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1469: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3170,7 +3171,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1479: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1481: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3188,9 +3189,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1483: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1485: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1484: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1486: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 3bed46a..2dc4ed4 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -105,19 +105,11 @@ def visit_Module(self, node): lines.append('}) //end requirejs define') if self._has_glsl: - #header.append( 'var __shader_header__ = ["float a[4]=float[4](0.1,0.2,0.3,0.4);"]' ) - #header.append( 'var __shader_header__ = ["float a[4];a=1.1;"]' ) header.append( 'var __shader_header__ = []' ) - header.append( 'var __shader__ = []' ) lines = header + lines - if False: - for line in lines: - assert isinstance(line, str) - return '\n'.join(lines) - else: - ## fixed by Foxboron - return '\n'.join(l if isinstance(l,str) else l.encode("utf-8") for l in lines) + ## fixed by Foxboron + return '\n'.join(l if isinstance(l,str) else l.encode("utf-8") for l in lines) def visit_Expr(self, node): # XXX: this is UGLY @@ -250,7 +242,7 @@ def _visit_function(self, node): args = self.visit(node.args) if glsl: - self._has_glsl = True ## writes `__shader__ = []` in header + self._has_glsl = True ## triggers extras in header lines = [] x = [] for i,arg in enumerate(args): @@ -263,7 +255,7 @@ def _visit_function(self, node): x.append( 'float* %s' %arg ) if is_main: - lines.append( 'var __shader__ = [];') ## dynamic + lines.append( 'var __shader__ = [];') ## each call to the wrapper function recompiles the shader lines.append( '__shader__.push("void main(%s) {");' %','.join(x) ) ## if shader failed to compile with error like "uniform float float" syntax error something likely went wrong here. elif return_type: lines.append( '__shader_header__.push("%s %s( %s ) {");' %(return_type, node.name, ', '.join(x)) ) @@ -284,8 +276,10 @@ def _visit_function(self, node): else: for sub in self.visit(child).splitlines(): if is_main: - if '`' in sub: + if '`' in sub: ## "`" runtime lookups check_for_array = False + array_value = None + array_name = None chunks = sub.split('`') sub = [] @@ -296,14 +290,23 @@ def _visit_function(self, node): else: sub.append(' + "%s"'%chk) else: + ## this is a special case because: + ## . arrays need runtime info to be inserted into the shader, + ## . some python syntax is wrapped with "`" back-quotes (inlines into shader) if chk.startswith('__glsl_inline_array'): - check_for_array = chk.split('(')[-1].split(',')[0] + cargs = chk.split('(')[-1].split(')')[0] + array_value, array_name = cargs.split(',') + array_name = array_name.strip()[1:-1] ## strip quotes + check_for_array = array_value + ## . inline the array with the same name into the current javascript scope, + ## this is required for "len(a)" and looping over arrays. + lines.append('%s = %s' %(array_name, array_value)) sub.append(' + %s' %chk) if check_for_array: - lines.append( 'if (%s instanceof Array) { __shader__.push(%s); } else{' %(check_for_array,''.join(sub)) ) - elif lines[-1].endswith(' else{'): - lines.append( '__shader__.push(%s); } /*end else*/' %''.join(sub)) + lines.append( 'if (%s instanceof Array) { __shader__.push(%s); } else {' %(check_for_array,''.join(sub)) ) + elif lines[-1].endswith(' else {'): + lines.append( '__shader__.push(%s); }' %''.join(sub)) else: lines.append( '__shader__.push(%s);' %''.join(sub)) @@ -337,6 +340,7 @@ def _visit_function(self, node): lines.append(' var header = "\\n".join(__shader_header__)') lines.append(' var shader = "\\n".join(__shader__)') #lines.append(' console.log(shader)') + ## create the webCLGL kernel, compiles GLSL source lines.append(' var __kernel = __webclgl.createKernel( shader, header );') if gpu_return_types: @@ -502,7 +506,13 @@ def _visit_call_helper_new(self, node): def visit_Call(self, node): name = self.visit(node.func) - if name == 'glsl_inline_object': + if self._glsl and name == 'len': + assert isinstance(node.args[0], ast.Name) + #return '_len_%s' %node.args[0].id + #return '`%s.length`' %node.args[0].id + return '4' + + elif name == 'glsl_inline_object': return '`__glsl_inline_object(%s)`' %self.visit(node.args[0]) elif name == 'glsl_inline_array': return '`__glsl_inline_array(%s, "%s")`' %(self.visit(node.args[0]), node.args[1].s) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index d5fdb16..a949b23 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -25,6 +25,8 @@ def __glsl_inline_array(ob, name): while i < ob.length: a.push(';'+name+'['+i+']='+ob[i]) i += 1 + ## in WebGL GLSL, array.length() is not available, workaround: cache it here as `_len_NAME` + a.push( ';int _len_' + name + '=' +ob.length ) return ''.join(a) diff --git a/regtests/webclgl/for_loop_dynamic_list.py b/regtests/webclgl/for_loop_dynamic_list.py new file mode 100644 index 0000000..63ce9b9 --- /dev/null +++ b/regtests/webclgl/for_loop_dynamic_list.py @@ -0,0 +1,38 @@ +"""iterate over dynamic list""" +from random import random + +class G: + def __init__(self, s): + self.arr1 = [ random() for i in range(s) ] + + def run(self, X): + + @returns( array=[8,8] ) + @gpu.main + def gpufunc(x): + float x + float* a = self.arr1 + #return float( len(a) ) *0.1 ## this also works + float b = x * 0.5 + for i in range( len(a) ): + b += a[i] + return b + + return gpufunc(X) + + +def main(): + u = -1.0 + g = G(64) + res = g.run( u ) + print(res) + for i in range(3): ## test dynamic size + if i==0: + g.arr1 = [ 0.01 for x in range(8) ] + elif i==1: + g.arr1 = [ 0.01 for x in range(16) ] + else: + g.arr1 = [ 0.01 for x in range(32) ] + + res = g.run( u ) + print(res) \ No newline at end of file From 08ff532cb17de78324c819ac2c9963c295e6d7cf Mon Sep 17 00:00:00 2001 From: hartsantler Date: Fri, 20 Jun 2014 21:43:50 -0700 Subject: [PATCH 060/222] webCLgl backend: fixed functions with no arguments. --- pythonjs/pythonjs.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 2dc4ed4..aa3cc9e 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -256,7 +256,11 @@ def _visit_function(self, node): if is_main: lines.append( 'var __shader__ = [];') ## each call to the wrapper function recompiles the shader - lines.append( '__shader__.push("void main(%s) {");' %','.join(x) ) ## if shader failed to compile with error like "uniform float float" syntax error something likely went wrong here. + if x: + lines.append( '__shader__.push("void main(%s) {");' %','.join(x) ) + else: + lines.append( '__shader__.push("void main( ) {");') ## WebCLGL parser requires the space in `main( )` + elif return_type: lines.append( '__shader_header__.push("%s %s( %s ) {");' %(return_type, node.name, ', '.join(x)) ) else: From 70da183996a42ca1a285d53626f7aa91b0601ae5 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Fri, 20 Jun 2014 22:44:59 -0700 Subject: [PATCH 061/222] webCLgl backend: fixed pure python typedef vars that use an attribute `a.x` --- pythonjs/python_to_pythonjs.py | 2 ++ regtests/webclgl/hello_gpu.py | 27 ++++++++++++++------------- regtests/webclgl/mandel_purepy.py | 11 +++++++---- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 5cee38a..f68c97a 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2418,6 +2418,7 @@ def visit_FunctionDef(self, node): threaded = self._with_webworker jsfile = None + self._typedef_vars = dict() ## clear typed variables: filled in below by @typedef or in visit_Assign self._gpu_return_types = set() gpu = False gpu_main = False @@ -2441,6 +2442,7 @@ def visit_FunctionDef(self, node): assert len(c.args) == 0 and len(c.keywords) for kw in c.keywords: assert isinstance( kw.value, Name) + self._typedef_vars[ kw.arg ] = kw.value.id self._instances[ kw.arg ] = kw.value.id self._func_typedefs[ kw.arg ] = kw.value.id local_typedefs.append( '%s=%s' %(kw.arg, kw.value.id)) diff --git a/regtests/webclgl/hello_gpu.py b/regtests/webclgl/hello_gpu.py index 65cf6f5..2161d3a 100644 --- a/regtests/webclgl/hello_gpu.py +++ b/regtests/webclgl/hello_gpu.py @@ -1,18 +1,19 @@ """gpu test""" def main(): - with glsl as myfunc: - def main(buffA, buffB, num): - float* buffA - float* buffB - float num - vec2 n = get_global_id() ## WebCL API - float result = 0.0 - for i in range(1000): - result = sqrt(result + A[n] + B[n] + float(i)) - return result * num + @returns( array=[4,16]) + @gpu.main + def myfunc(a, b, num): + float* a + float* b + float num + vec2 n = get_global_id() ## WebCL API + float result = 0.0 + for i in range(1000): + result = sqrt(result + a[n] + b[n] + float(i)) + return result * num - A = [1,2,3] - B = [4,5,6] - res = myfunc( A, B, 2.0 ) + A = [ 0.5 for x in range(64) ] + B = [ 0.25 for x in range(64) ] + res = myfunc( A, B, 0.1 ) print(res) \ No newline at end of file diff --git a/regtests/webclgl/mandel_purepy.py b/regtests/webclgl/mandel_purepy.py index d7a84c8..5071a13 100644 --- a/regtests/webclgl/mandel_purepy.py +++ b/regtests/webclgl/mandel_purepy.py @@ -10,7 +10,7 @@ def pprint(arr, w): def main(): - @returns( array=[32,32] ) + @returns( array=[64,64] ) @typedef( x=float, y=float, tempX=float, i=int, runaway=int, c=vec2) @gpu.main def gpufunc(): @@ -30,7 +30,10 @@ def gpufunc(): return float(runaway) * 0.01 res = gpufunc() + print(res) + TestError( len(res)==64*64 ) + #pprint(res, 32) - for row in res: - a = [ round(v,3) for v in row ] - print( a ) + #for row in res: + # a = [ round(v,3) for v in row ] + # print( a ) From e5c0b3922220ae0155c1aafc5ad7b15e26cf2dc0 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 22 Jun 2014 00:19:41 -0700 Subject: [PATCH 062/222] webCLgl backend: allow list slice on dynamic variables. new helper class `glsljit` --- pythonjs/python_to_pythonjs.py | 40 +- pythonjs/pythonjs.js | 547 ++++++++++++++----------- pythonjs/pythonjs.py | 106 +++-- pythonjs/runtime/builtins.py | 125 +++--- regtests/webclgl/slice_dynamic_list.py | 37 ++ regtests/webclgl/subroutine.py | 5 +- 6 files changed, 508 insertions(+), 352 deletions(-) create mode 100644 regtests/webclgl/slice_dynamic_list.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index f68c97a..c984c8a 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1137,6 +1137,8 @@ def visit_Return(self, node): if self._with_glsl and self._in_gpu_main: ## _id_ is inserted into all function headers by pythonjs.py for glsl functions. + if not self._gpu_return_types: + raise SyntaxError( self.format_error('function return type unknown - required decorator `@returns(array/vec4=[w,h])`') ) if 'array' in self._gpu_return_types: writer.write('out_float = %s' %self.visit(node.value)) if 'vec4' in self._gpu_return_types: @@ -1428,10 +1430,10 @@ def visit_Attribute(self, node): node_value = self.visit(node.value) if self._with_glsl: - if node_value not in self._typedef_vars: ## dynamic var - return 'glsl_inline_object(%s.%s)' %(node_value, node.attr) - else: - return '%s.%s' %(node_value, node.attr) + #if node_value not in self._typedef_vars: ## dynamic var DEPRECATED + # return 'glsl_inline(%s.%s)' %(node_value, node.attr) + #else: + return '%s.%s' %(node_value, node.attr) elif self._with_dart or self._with_ll: return '%s.%s' %(node_value, node.attr) elif self._with_js: @@ -1719,23 +1721,31 @@ def _visit_assign_helper(self, node, target): ) writer.write(code) - elif isinstance(target, Name): + elif isinstance(target, Name) and self._with_glsl: ## assignment to variable + assert target.id in self._typedef_vars node_value = self.visit( node.value ) ## node.value may have extra attributes after being visited - ######################### inserts glsl object at runtime ################################ - if 'glsl_inline_object' in node_value: - if isinstance(node.value, ast.Attribute): - ## this triggers special logic in pythonjs.py that will check if the object to - ## inline is an array, and if so this will be injected into the shader, - ## otherwise it will fallback to using glsl_inline_object. - ## this is a workaround because WebGL GLSL is missing support for array literals. - writer.write('glsl_inline_array(%s.%s, "%s")' %(node.value.value.id, node.value.attr, target.id)) + if node_value in self._typedef_vars: + writer.write('%s = %s' % (self.visit(target), self.visit(node.value))) + + else: + + ## also assign variable in current javascript scope ## + if not isinstance(node.value, (ast.BinOp, ast.Call)): + if isinstance(node.value, ast.Subscript) and isinstance(node.value.slice, ast.Slice): + x = node_value.split('(')[-1].split(')')[0].split('[')[0] + writer.write('glsl_inline_push_js_assign("%s", %s.__getslice__(%s))'%(target.id, x, self.visit(node.value.slice)) ) + else: + writer.write('glsl_inline_push_js_assign("%s", %s)'%(target.id, self.visit(node.value)) ) else: - pass + writer.write('%s = %s' % (target.id, self.visit(node.value))) - ########################################################################################### + return None + elif isinstance(target, Name): ## assignment to variable + node_value = self.visit( node.value ) ## node.value may have extra attributes after being visited + if writer.is_at_global_level(): log('GLOBAL: %s : %s'%(target.id, node_value)) self._globals[ target.id ] = None diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 748408f..1a1233e 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -496,7 +496,29 @@ KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Obj ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError"; AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError"; RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError"; -__glsl_inline_array = function(ob, name) { +glsljit_runtime = function(header) { + + return new GLSLJITRuntime(header); +} + +GLSLJITRuntime = function(header) { + GLSLJITRuntime.__init__(this, header); + this.__class__ = GLSLJITRuntime; + this.__uid__ = ("" + _PythonJS_UID); + _PythonJS_UID += 1; +} + +GLSLJITRuntime.__uid__ = ("" + _PythonJS_UID); +_PythonJS_UID += 1; +GLSLJITRuntime.prototype.__init__ = function(header) { + + this.header = header; + this.shader = []; + this.object_packagers = []; +} + +GLSLJITRuntime.__init__ = function () { return GLSLJITRuntime.prototype.__init__.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.array = function(ob, name) { var a,i; a = [(((("float " + name) + "[") + ob.length) + "]")]; i = 0; @@ -504,76 +526,98 @@ __glsl_inline_array = function(ob, name) { a.push((((((";" + name) + "[") + i) + "]=") + ob[i])); i += 1; } - a.push((((";int _len_" + name) + "=") + ob.length)); - return "".join(a); + this.shader.push("".join(a)); } -__glsl_inline_array.pythonscript_function = true; -__glsl_inline_object = function(ob, name) { - - if (ob instanceof Array) { - console.log("ERROR: WebGL GLSL arrays can not be inlined in __glsl_inline_object"); - return ""; - } else { - return ob; +GLSLJITRuntime.array = function () { return GLSLJITRuntime.prototype.array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.object = function(ob, name) { + var func,cls; + var __iter1 = this.object_packagers; + if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) ) { __iter1 = __object_keys__(__iter1) } + for (var __idx1=0; __idx1 < __iter1.length; __idx1++) { + var p = __iter1[ __idx1 ]; + var __r_0; + __r_0 = p; + cls = __r_0[0]; + func = __r_0[1]; + if (__test_if_true__(ob instanceof cls)) { + return func(ob); + } } } -__glsl_inline_object.pythonscript_function = true; -__unpack_array2d = function(arr, dims) { +GLSLJITRuntime.object = function () { return GLSLJITRuntime.prototype.object.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.push = function(s) { + + this.shader.push(s); +} + +GLSLJITRuntime.push = function () { return GLSLJITRuntime.prototype.push.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.unpack_array2d = function(arr, dims) { var h,rows,w,row; - var __r_0; - __r_0 = dims; - w = ((__r_0 instanceof Array) ? __r_0[0] : __get__(__get__(__r_0, "__getitem__"), "__call__")([0], __NULL_OBJECT__)); - h = ((__r_0 instanceof Array) ? __r_0[1] : __get__(__get__(__r_0, "__getitem__"), "__call__")([1], __NULL_OBJECT__)); + if (( typeof(dims) ) == "number") { + return arr; + } + var __r_1; + __r_1 = dims; + w = __r_1[0]; + h = __r_1[1]; row = []; rows = [row]; - var __iter1 = arr; - if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) ) { __iter1 = __object_keys__(__iter1) } - for (var __idx1=0; __idx1 < __iter1.length; __idx1++) { - var value = __iter1[ __idx1 ]; + var __iter2 = arr; + if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } + for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { + var value = __iter2[ __idx2 ]; row.append(value); if (( row.length ) >= w) { row = []; rows.append(row); } } - rows.pop(); + __jsdict_pop(rows); if (( rows.length ) != h) { console.log("ERROR: __unpack_array2d, invalid height."); } return rows; } -__unpack_array2d.pythonscript_function = true; -__unpack_vec4 = function(arr, dims) { +GLSLJITRuntime.unpack_array2d = function () { return GLSLJITRuntime.prototype.unpack_array2d.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.unpack_vec4 = function(arr, dims) { var rows,i,h,vec,w,row; - var __r_1; - __r_1 = dims; - w = ((__r_1 instanceof Array) ? __r_1[0] : __get__(__get__(__r_1, "__getitem__"), "__call__")([0], __NULL_OBJECT__)); - h = ((__r_1 instanceof Array) ? __r_1[1] : __get__(__get__(__r_1, "__getitem__"), "__call__")([1], __NULL_OBJECT__)); + if (( typeof(dims) ) == "number") { + w = dims; + h = 1; + } else { + var __r_2; + __r_2 = dims; + w = __r_2[0]; + h = __r_2[1]; + } rows = []; i = 0; - var __iter2 = range(h); - if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } - for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { - var y = __iter2[ __idx2 ]; + var y,y__end__; + y = 0; + y__end__ = h; + while (( y ) < y__end__) { row = []; rows.append(row); - var __iter3 = range(w); - if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) ) { __iter3 = __object_keys__(__iter3) } - for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { - var x = __iter3[ __idx3 ]; + var x,x__end__; + x = 0; + x__end__ = w; + while (( x ) < x__end__) { vec = []; - var __iter4 = range(4); - if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } - for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { - var j = __iter4[ __idx4 ]; + var j,j__end__; + j = 0; + j__end__ = 4; + while (( j ) < j__end__) { vec.append(arr[i]); i += 1; + j += 1; } row.append(vec); + x += 1; } + y += 1; } if (( rows.length ) != h) { console.log("ERROR: __unpack_vec4, invalid height."); @@ -581,7 +625,9 @@ __unpack_vec4 = function(arr, dims) { return rows; } -__unpack_vec4.pythonscript_function = true; +GLSLJITRuntime.unpack_vec4 = function () { return GLSLJITRuntime.prototype.unpack_vec4.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.__properties__ = { }; +GLSLJITRuntime.prototype.__unbound_methods__ = { }; __getattr__ = function(ob, a) { if (ob.__getattr__) { @@ -700,10 +746,10 @@ __contains__ = function(ob, a) { throw new TypeError; } else { if (__test_if_true__(__is_typed_array(ob))) { - var __iter5 = ob; - if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } - for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { - var x = __iter5[ __idx5 ]; + var __iter3 = ob; + if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) ) { __iter3 = __object_keys__(__iter3) } + for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { + var x = __iter3[ __idx3 ]; if (( x ) == a) { return true; } @@ -786,10 +832,10 @@ __mul_op = function(a, b) { __jsdict = function(items) { var d,key; d = {}; - var __iter6 = items; - if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } - for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { - var item = __iter6[ __idx6 ]; + var __iter4 = items; + if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } + for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { + var item = __iter4[ __idx4 ]; key = item[0]; if (__test_if_true__(key.__uid__)) { key = key.__uid__; @@ -837,10 +883,10 @@ __jsdict_values = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object)) { arr = []; - var __iter7 = ob; - if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } - for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { - var key = __iter7[ __idx7 ]; + var __iter5 = ob; + if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } + for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { + var key = __iter5[ __idx5 ]; if (__test_if_true__(ob.hasOwnProperty(key))) { value = ob[key]; arr.push(value); @@ -856,10 +902,10 @@ __jsdict_items = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; - var __iter8 = ob; - if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } - for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { - var key = __iter8[ __idx8 ]; + var __iter6 = ob; + if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } + for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { + var key = __iter6[ __idx6 ]; if (__test_if_true__(Object.hasOwnProperty.call(ob, key))) { value = ob[key]; arr.push([key, value]); @@ -916,10 +962,10 @@ __object_keys__ = function(ob) { __bind_property_descriptors__ = function(o, klass) { var prop,desc; - var __iter9 = klass.__properties__; - if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } - for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { - var name = __iter9[ __idx9 ]; + var __iter7 = klass.__properties__; + if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } + for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { + var name = __iter7[ __idx7 ]; desc = __jsdict([["enumerable", true]]); prop = klass.__properties__[name]; if (__test_if_true__(prop["get"])) { @@ -930,10 +976,10 @@ __bind_property_descriptors__ = function(o, klass) { } Object.defineProperty(o, name, desc); } - var __iter10 = klass.__bases__; - if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } - for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { - var base = __iter10[ __idx10 ]; + var __iter8 = klass.__bases__; + if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } + for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { + var base = __iter8[ __idx8 ]; __bind_property_descriptors__(o, base); } } @@ -965,10 +1011,10 @@ __sprintf = function(fmt, args) { arr = []; var i; i = 0; - var __iter11 = chunks; - if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } - for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { - var txt = __iter11[ __idx11 ]; + var __iter9 = chunks; + if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } + for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { + var txt = __iter9[ __idx9 ]; arr.append(txt); if (( i ) >= args.length) { break; @@ -1001,10 +1047,10 @@ __create_class__ = function(class_name, parents, attrs, props) { klass.__all_method_names__ = []; klass.__properties__ = props; klass.__attributes__ = attrs; - var __iter12 = attrs; - if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } - for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { - var key = __iter12[ __idx12 ]; + var __iter10 = attrs; + if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } + for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { + var key = __iter10[ __idx10 ]; if (( typeof(attrs[key]) ) == "function") { klass.__all_method_names__.push(key); f = attrs[key]; @@ -1025,20 +1071,20 @@ __create_class__ = function(class_name, parents, attrs, props) { } klass.__setters__ = []; klass.__getters__ = []; - var __iter13 = klass.__properties__; - if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } - for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { - var name = __iter13[ __idx13 ]; + var __iter11 = klass.__properties__; + if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } + for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { + var name = __iter11[ __idx11 ]; prop = klass.__properties__[name]; klass.__getters__.push(name); if (__test_if_true__(prop["set"])) { klass.__setters__.push(name); } } - var __iter14 = klass.__bases__; - if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } - for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { - var base = __iter14[ __idx14 ]; + var __iter12 = klass.__bases__; + if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } + for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { + var base = __iter12[ __idx12 ]; Array.prototype.push.apply(klass.__getters__, base.__getters__); Array.prototype.push.apply(klass.__setters__, base.__setters__); Array.prototype.push.apply(klass.__all_method_names__, base.__all_method_names__); @@ -1051,10 +1097,10 @@ __create_class__ = function(class_name, parents, attrs, props) { object.__dict__ = object; has_getattribute = false; has_getattr = false; - var __iter15 = klass.__all_method_names__; - if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } - for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { - var name = __iter15[ __idx15 ]; + var __iter13 = klass.__all_method_names__; + if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } + for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { + var name = __iter13[ __idx13 ]; if (( name ) == "__getattribute__") { has_getattribute = true; } else { @@ -1199,8 +1245,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 465: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 466: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 480: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 481: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1422,10 +1468,10 @@ _setup_str_prototype = function(args, kwargs) { arr = a["$wrapped"]; } i = 0; - var __iter16 = arr; - if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } - for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { - var value = __iter16[ __idx16 ]; + var __iter14 = arr; + if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } + for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { + var value = __iter14[ __idx14 ]; out += value; i += 1; if (( i ) < arr.length) { @@ -1467,10 +1513,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; - var __iter17 = this; - if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } - for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { - var char = __iter17[ __idx17 ]; + var __iter15 = this; + if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } + for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { + var char = __iter15[ __idx15 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1481,6 +1527,23 @@ _setup_str_prototype = function(args, kwargs) { } Object.defineProperty(String.prototype, "isdigit", { enumerable:false,value:func,writeable:true,configurable:true }); + var func = function() { + var digits; + digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."]; + var __iter16 = this; + if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } + for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { + var char = __iter16[ __idx16 ]; + if (__contains__(digits, char)) { + /*pass*/ + } else { + return false; + } + } + return true; + } + + Object.defineProperty(String.prototype, "isnumber", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(encoding) { return this; @@ -1497,10 +1560,10 @@ _setup_str_prototype = function(args, kwargs) { var keys,r; r = this; keys = Object.keys(fmt); - var __iter18 = keys; - if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } - for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { - var key = __iter18[ __idx18 ]; + var __iter17 = keys; + if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } + for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { + var key = __iter17[ __idx17 ]; r = r.split(key).join(fmt[key]); } r = r.split("{").join("").split("}").join(""); @@ -1647,10 +1710,10 @@ _setup_array_prototype = function(args, kwargs) { stop = this.length; } arr = [start, (stop - start)]; - var __iter19 = items; - if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } - for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { - var item = __iter19[ __idx19 ]; + var __iter18 = items; + if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } + for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { + var item = __iter18[ __idx18 ]; arr.push(item); } this.splice.apply(this, arr); @@ -1666,10 +1729,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); var extend = function(other) { - var __iter20 = other; - if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } - for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { - var obj = __iter20[ __idx20 ]; + var __iter19 = other; + if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } + for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { + var obj = __iter19[ __idx19 ]; this.push(obj); } return this; @@ -1701,10 +1764,10 @@ _setup_array_prototype = function(args, kwargs) { var count = function(obj) { var a; a = 0; - var __iter21 = this; - if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } - for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { - var item = __iter21[ __idx21 ]; + var __iter20 = this; + if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } + for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { + var item = __iter20[ __idx20 ]; if (( item ) === obj) { a += 1; } @@ -1760,10 +1823,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { - var __iter22 = this; - if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } - for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { - var item = __iter22[ __idx22 ]; + var __iter21 = this; + if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } + for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { + var item = __iter21[ __idx21 ]; if (( other.indexOf(item) ) == -1) { return false; } @@ -1931,12 +1994,12 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b,__iterator__24; - __iterator__24 = __get__(__get__(arr, "__iter__", "no iterator - line 941: for b in arr:"), "__call__")([], __NULL_OBJECT__); - var __next__24; - __next__24 = __get__(__iterator__24, "next"); - while (( __iterator__24.index ) < __iterator__24.length) { - b = __next__24(); + var b,__iterator__26; + __iterator__26 = __get__(__get__(arr, "__iter__", "no iterator - line 964: for b in arr:"), "__call__")([], __NULL_OBJECT__); + var __next__26; + __next__26 = __get__(__iterator__26, "next"); + while (( __iterator__26.index ) < __iterator__26.length) { + b = __next__26(); a += b; } return a; @@ -1972,7 +2035,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 961: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 984: return ob.__len__()"), "__call__")(); } } } @@ -1992,7 +2055,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 965: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 988: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2010,12 +2073,12 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__25; - __iterator__25 = __get__(__get__(objs, "__iter__", "no iterator - line 970: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__25; - __next__25 = __get__(__iterator__25, "next"); - while (( __iterator__25.index ) < __iterator__25.length) { - ob = __next__25(); + var ob,__iterator__27; + __iterator__27 = __get__(__get__(objs, "__iter__", "no iterator - line 993: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__27; + __next__27 = __get__(__iterator__27, "next"); + while (( __iterator__27.index ) < __iterator__27.length) { + ob = __next__27(); v = __get__(func, "__call__")([ob], __NULL_OBJECT__); arr.push(v); } @@ -2037,12 +2100,12 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__26; - __iterator__26 = __get__(__get__(objs, "__iter__", "no iterator - line 978: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__26; - __next__26 = __get__(__iterator__26, "next"); - while (( __iterator__26.index ) < __iterator__26.length) { - ob = __next__26(); + var ob,__iterator__28; + __iterator__28 = __get__(__get__(objs, "__iter__", "no iterator - line 1001: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__28; + __next__28 = __get__(__iterator__28, "next"); + while (( __iterator__28.index ) < __iterator__28.length) { + ob = __next__28(); if (__test_if_true__(__get__(func, "__call__")([ob], __NULL_OBJECT__))) { arr.push(ob); } @@ -2064,12 +2127,12 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__27; - __iterator__27 = __get__(__get__(lst, "__iter__", "no iterator - line 987: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__27; - __next__27 = __get__(__iterator__27, "next"); - while (( __iterator__27.index ) < __iterator__27.length) { - value = __next__27(); + var value,__iterator__29; + __iterator__29 = __get__(__get__(lst, "__iter__", "no iterator - line 1010: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__29; + __next__29 = __get__(__iterator__29, "next"); + while (( __iterator__29.index ) < __iterator__29.length) { + value = __next__29(); if (( a ) === null) { a = value; } else { @@ -2095,12 +2158,12 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__28; - __iterator__28 = __get__(__get__(lst, "__iter__", "no iterator - line 994: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__28; - __next__28 = __get__(__iterator__28, "next"); - while (( __iterator__28.index ) < __iterator__28.length) { - value = __next__28(); + var value,__iterator__30; + __iterator__30 = __get__(__get__(lst, "__iter__", "no iterator - line 1017: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__30; + __next__30 = __get__(__iterator__30, "next"); + while (( __iterator__30.index ) < __iterator__30.length) { + value = __next__30(); if (( a ) === null) { a = value; } else { @@ -2210,7 +2273,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1029: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1052: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2320,28 +2383,28 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o,__iterator__29; - __iterator__29 = __get__(__get__(ob, "__iter__", "no iterator - line 1084: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__29; - __next__29 = __get__(__iterator__29, "next"); - while (( __iterator__29.index ) < __iterator__29.length) { - o = __next__29(); + var o,__iterator__31; + __iterator__31 = __get__(__get__(ob, "__iter__", "no iterator - line 1107: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__31; + __next__31 = __get__(__iterator__31, "next"); + while (( __iterator__31.index ) < __iterator__31.length) { + o = __next__31(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1086: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1086: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1086: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1109: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1109: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1109: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1088: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1088: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1088: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1111: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1111: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1111: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key,__iterator__30; - __iterator__30 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1090: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__30; - __next__30 = __get__(__iterator__30, "next"); - while (( __iterator__30.index ) < __iterator__30.length) { - key = __next__30(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1091: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1092: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + var key,__iterator__32; + __iterator__32 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1113: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__32; + __next__32 = __get__(__iterator__32, "next"); + while (( __iterator__32.index ) < __iterator__32.length) { + key = __next__32(); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1114: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1115: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2367,16 +2430,16 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key,__iterator__31; - __iterator__31 = __get__(__get__(keys, "__iter__", "no iterator - line 1100: for key in keys:"), "__call__")([], __NULL_OBJECT__); - var __next__31; - __next__31 = __get__(__iterator__31, "next"); - while (( __iterator__31.index ) < __iterator__31.length) { - key = __next__31(); - value = __get__(self["$wrapped"], "__getitem__", "line 1101: value = self[...][key]")([key], __NULL_OBJECT__); + var key,__iterator__33; + __iterator__33 = __get__(__get__(keys, "__iter__", "no iterator - line 1123: for key in keys:"), "__call__")([], __NULL_OBJECT__); + var __next__33; + __next__33 = __get__(__iterator__33, "next"); + while (( __iterator__33.index ) < __iterator__33.length) { + key = __next__33(); + value = __get__(self["$wrapped"], "__getitem__", "line 1124: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1104: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1127: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2438,7 +2501,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1120: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1143: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2462,13 +2525,13 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key,__iterator__32; - __iterator__32 = __get__(__get__(other, "__iter__", "no iterator - line 1128: for key in other:"), "__call__")([], __NULL_OBJECT__); - var __next__32; - __next__32 = __get__(__iterator__32, "next"); - while (( __iterator__32.index ) < __iterator__32.length) { - key = __next__32(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1129: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1129: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + var key,__iterator__34; + __iterator__34 = __get__(__get__(other, "__iter__", "no iterator - line 1151: for key in other:"), "__call__")([], __NULL_OBJECT__); + var __next__34; + __next__34 = __get__(__iterator__34, "next"); + while (( __iterator__34.index ) < __iterator__34.length) { + key = __next__34(); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1152: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1152: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2487,13 +2550,13 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key,__iterator__33; - __iterator__33 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1133: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__33; - __next__33 = __get__(__iterator__33, "next"); - while (( __iterator__33.index ) < __iterator__33.length) { - key = __next__33(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1134: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + var key,__iterator__35; + __iterator__35 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1156: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__35; + __next__35 = __get__(__iterator__35, "next"); + while (( __iterator__35.index ) < __iterator__35.length) { + key = __next__35(); + __get__(__get__(arr, "append", "missing attribute `append` - line 1157: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2538,7 +2601,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1144: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1167: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2674,10 +2737,10 @@ __dict_values = function(args, kwargs) { var self = __args__['self']; keys = Object.keys(self["$wrapped"]); out = []; - var __iter23 = keys; - if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } - for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { - var key = __iter23[ __idx23 ]; + var __iter22 = keys; + if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } + for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { + var key = __iter22[ __idx22 ]; out.push(self["$wrapped"][key]); } return out; @@ -2764,10 +2827,10 @@ set = function(args, kwargs) { } fallback = false; if (__test_if_true__(hashtable)) { - var __iter24 = a; - if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } - for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { - var b = __iter24[ __idx24 ]; + var __iter23 = a; + if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } + for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { + var b = __iter23[ __idx23 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[key] = b; @@ -2782,20 +2845,20 @@ set = function(args, kwargs) { } s = []; if (__test_if_true__(fallback)) { - var __iter25 = a; - if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } - for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { - var item = __iter25[ __idx25 ]; + var __iter24 = a; + if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } + for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { + var item = __iter24[ __idx24 ]; if (( s.indexOf(item) ) == -1) { s.push(item); } } } else { __sort_method(keys); - var __iter26 = keys; - if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } - for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { - var key = __iter26[ __idx26 ]; + var __iter25 = keys; + if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } + for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { + var key = __iter25[ __idx25 ]; s.push(hashtable[key]); } } @@ -2843,7 +2906,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1345: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1345: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1368: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1368: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -2867,7 +2930,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1369: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1392: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -2902,7 +2965,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1377: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1400: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -2928,7 +2991,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1387: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1387: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1410: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1410: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -2967,7 +3030,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1406: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1406: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1429: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1429: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3038,13 +3101,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1431: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1431: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1454: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1454: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1436: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1459: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3104,7 +3167,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1464: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1487: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3123,13 +3186,13 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value,__iterator__38; - __iterator__38 = __get__(__get__(lst, "__iter__", "no iterator - line 1468: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__38; - __next__38 = __get__(__iterator__38, "next"); - while (( __iterator__38.index ) < __iterator__38.length) { - value = __next__38(); - __get__(__get__(self, "append", "missing attribute `append` - line 1469: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + var value,__iterator__40; + __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1491: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__40; + __next__40 = __get__(__iterator__40, "next"); + while (( __iterator__40.index ) < __iterator__40.length) { + value = __next__40(); + __get__(__get__(self, "append", "missing attribute `append` - line 1492: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3171,7 +3234,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1481: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1504: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3189,9 +3252,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1485: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1508: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1486: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1509: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3328,17 +3391,17 @@ json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (f __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; - var __iter27 = threading.workers; - if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } - for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { - var b = __iter27[ __idx27 ]; + var __iter26 = threading.workers; + if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } + for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { + var b = __iter26[ __idx26 ]; other = b["worker"]; args = b["args"]; if (( other ) !== worker) { - var __iter28 = args; - if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } - for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { - var arg = __iter28[ __idx28 ]; + var __iter27 = args; + if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } + for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { + var arg = __iter27[ __idx27 ]; if (( arg ) === ob) { if (! (__contains__(a, other))) { a.append(other); @@ -3370,10 +3433,10 @@ __start_new_thread = function(f, args) { if (( event.data.type ) == "append") { a = args[event.data.argindex]; a.push(event.data.value); - var __iter29 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } - for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { - var other = __iter29[ __idx29 ]; + var __iter28 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } + for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { + var other = __iter28[ __idx28 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); } } else { @@ -3385,10 +3448,10 @@ __start_new_thread = function(f, args) { } else { a[event.data.index] = value; } - var __iter30 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } - for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { - var other = __iter30[ __idx30 ]; + var __iter29 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } + for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { + var other = __iter29[ __idx29 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); } } else { @@ -3403,10 +3466,10 @@ __start_new_thread = function(f, args) { jsargs = []; var i; i = 0; - var __iter31 = args; - if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } - for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { - var arg = __iter31[ __idx31 ]; + var __iter30 = args; + if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } + for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { + var arg = __iter30[ __idx30 ]; if (__test_if_true__(arg.jsify)) { jsargs.append(arg.jsify()); } else { diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index aa3cc9e..0b06101 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -201,6 +201,7 @@ def _visit_call_helper_var_glsl(self, node): ## __glsl_dynamic_typedef() is inserted just before the assignment. pass else: + self._typed_vars[ key.arg ] = key.value.id lines.append( '%s %s' %(key.value.id, key.arg)) return ';'.join(lines) @@ -255,11 +256,11 @@ def _visit_function(self, node): x.append( 'float* %s' %arg ) if is_main: - lines.append( 'var __shader__ = [];') ## each call to the wrapper function recompiles the shader + lines.append( 'var glsljit = glsljit_runtime(__shader_header__);') ## each call to the wrapper function recompiles the shader if x: - lines.append( '__shader__.push("void main(%s) {");' %','.join(x) ) + lines.append( 'glsljit.push("void main(%s) {");' %','.join(x) ) else: - lines.append( '__shader__.push("void main( ) {");') ## WebCLGL parser requires the space in `main( )` + lines.append( 'glsljit.push("void main( ) {");') ## WebCLGL parser requires the space in `main( )` elif return_type: lines.append( '__shader_header__.push("%s %s( %s ) {");' %(return_type, node.name, ', '.join(x)) ) @@ -269,7 +270,7 @@ def _visit_function(self, node): self.push() # `_id_` always write out an array of floats or array of vec4floats if is_main: - lines.append( '__shader__.push("vec2 _id_ = get_global_id();");') + lines.append( 'glsljit.push("vec2 _id_ = get_global_id();");') else: lines.append( '__shader_header__.push("vec2 _id_ = get_global_id();");') @@ -281,41 +282,27 @@ def _visit_function(self, node): for sub in self.visit(child).splitlines(): if is_main: if '`' in sub: ## "`" runtime lookups - check_for_array = False - array_value = None - array_name = None chunks = sub.split('`') + if len(chunks) == 1: + raise RuntimeError(chunks) sub = [] for ci,chk in enumerate(chunks): if not ci%2: + assert '@' not in chk if ci==0: sub.append('"%s"'%chk) else: sub.append(' + "%s"'%chk) + elif chk.startswith('@'): + lines.append( chk[1:] ) else: - ## this is a special case because: - ## . arrays need runtime info to be inserted into the shader, - ## . some python syntax is wrapped with "`" back-quotes (inlines into shader) - if chk.startswith('__glsl_inline_array'): - cargs = chk.split('(')[-1].split(')')[0] - array_value, array_name = cargs.split(',') - array_name = array_name.strip()[1:-1] ## strip quotes - check_for_array = array_value - ## . inline the array with the same name into the current javascript scope, - ## this is required for "len(a)" and looping over arrays. - lines.append('%s = %s' %(array_name, array_value)) sub.append(' + %s' %chk) - if check_for_array: - lines.append( 'if (%s instanceof Array) { __shader__.push(%s); } else {' %(check_for_array,''.join(sub)) ) - elif lines[-1].endswith(' else {'): - lines.append( '__shader__.push(%s); }' %''.join(sub)) - else: - lines.append( '__shader__.push(%s);' %''.join(sub)) + lines.append( 'glsljit.push(%s);' %''.join(sub)) else: - lines.append( '__shader__.push("%s");' %(self.indent()+sub) ) + lines.append( 'glsljit.push("%s");' %(self.indent()+sub) ) else: lines.append( '__shader_header__.push("%s");' %(self.indent()+sub) ) @@ -323,13 +310,16 @@ def _visit_function(self, node): #buffer += '\n'.join(body) self.pull() if is_main: - lines.append('__shader__.push("%s}");' %self.indent()) + lines.append('glsljit.push("%s}");' %self.indent()) else: lines.append('__shader_header__.push("%s}");' %self.indent()) lines.append(';') if is_main: + insert = lines + lines = [] + if not glsl_wrapper_name: glsl_wrapper_name = node.name @@ -340,21 +330,30 @@ def _visit_function(self, node): lines.append(' __offset = __offset || 0') ## note by default: 0 allows 0-1.0 ## TODO this needs to be set per-buffer + lines.extend( insert ) + lines.append(' var __webclgl = new WebCLGL()') lines.append(' var header = "\\n".join(__shader_header__)') - lines.append(' var shader = "\\n".join(__shader__)') + lines.append(' var shader = "\\n".join(glsljit.shader)') #lines.append(' console.log(shader)') ## create the webCLGL kernel, compiles GLSL source lines.append(' var __kernel = __webclgl.createKernel( shader, header );') if gpu_return_types: if 'array' in gpu_return_types: - w,h = gpu_return_types['array'][1:-1].split(',') + if ',' in gpu_return_types['array']: + w,h = gpu_return_types['array'][1:-1].split(',') + lines.append(' var __return_length = %s * %s' %(w,h)) + else: + lines.append(' var __return_length = %s' %gpu_return_types['array']) elif 'vec4' in gpu_return_types: - w,h = gpu_return_types['vec4'][1:-1].split(',') + if ',' in gpu_return_types['vec4']: + w,h = gpu_return_types['vec4'][1:-1].split(',') + lines.append(' var __return_length_vec4 = %s * %s' %(w,h)) + else: + lines.append(' var __return_length_vec4 = %s' %gpu_return_types['vec4']) else: raise NotImplementedError - lines.append(' var __return_length = %s * %s' %(w,h)) else: lines.append(' var __return_length = 64') ## minimum size is 64 @@ -385,11 +384,11 @@ def _visit_function(self, node): if 'array' in gpu_return_types and 'vec4' in gpu_return_types: adim = gpu_return_types['array'] vdim = gpu_return_types['vec4'] - lines.append(' return [__unpack_array2d(_raw_array_res, %s),__unpack_vec4(_raw_vec4_res, %s)]' %(adim, vdim)) + lines.append(' return [glsljit.unpack_array2d(_raw_array_res, %s),glsljit.unpack_vec4(_raw_vec4_res, %s)]' %(adim, vdim)) elif 'vec4' in gpu_return_types: - lines.append(' return __unpack_vec4(_raw_vec4_res, %s)' %gpu_return_types['vec4']) + lines.append(' return glsljit.unpack_vec4(_raw_vec4_res, %s)' %gpu_return_types['vec4']) else: - lines.append(' return __unpack_array2d(_raw_array_res, %s)' %gpu_return_types['array']) + lines.append(' return glsljit.unpack_array2d(_raw_array_res, %s)' %gpu_return_types['array']) else: lines.append(' var __return = __webclgl.createBuffer(__return_length, "FLOAT", __offset)') @@ -449,7 +448,10 @@ def _visit_subscript_ellipsis(self, node): def visit_Subscript(self, node): if isinstance(node.slice, ast.Ellipsis): - return self._visit_subscript_ellipsis( node ) + if self._glsl: + return '%s[_id_]' % self.visit(node.value) + else: + return self._visit_subscript_ellipsis( node ) else: return '%s[%s]' % (self.visit(node.value), self.visit(node.slice)) @@ -482,6 +484,11 @@ def visit_Name(self, node): def visit_Attribute(self, node): name = self.visit(node.value) attr = node.attr + if self._glsl: + if name not in self._typed_vars: + return '`%s.%s`' % (name, attr) + else: + return '%s.%s' % (name, attr) return '%s.%s' % (name, attr) def visit_Print(self, node): @@ -512,14 +519,29 @@ def visit_Call(self, node): name = self.visit(node.func) if self._glsl and name == 'len': assert isinstance(node.args[0], ast.Name) - #return '_len_%s' %node.args[0].id - #return '`%s.length`' %node.args[0].id - return '4' - - elif name == 'glsl_inline_object': - return '`__glsl_inline_object(%s)`' %self.visit(node.args[0]) - elif name == 'glsl_inline_array': - return '`__glsl_inline_array(%s, "%s")`' %(self.visit(node.args[0]), node.args[1].s) + #return '_len_%s' %node.args[0].id ## this will not work with loops + return '`%s.length`' %node.args[0].id + + elif name == 'glsl_inline_push_js_assign': + # '@' triggers a new line of generated code + n = node.args[0].s + if isinstance(node.args[1], ast.Attribute): ## special case bypass visit_Attribute + v = '%s.%s' %(node.args[1].value.id, node.args[1].attr ) + else: + v = self.visit(node.args[1]) + ## check if number is required because literal floats like `1.0` will get transformed to `1` by javascript toString + orelse = 'typeof(%s)=="object" ? glsljit.object(%s, "%s") : glsljit.push("%s="+%s+";")' %(n, n,n, n,n) + if v.isdigit() or (v.count('.')==1 and v.split('.')[0].isdigit() and v.split('.')[1].isdigit()): + if_number = ' if (typeof(%s)=="number") { glsljit.push("%s=%s;") } else {' %(n, n,v) + return '`@%s=%s; %s if (%s instanceof Array) {glsljit.array(%s, "%s")} else {%s}};`' %(n,v, if_number, n, n,n, orelse) + else: + return '`@%s=%s; if (%s instanceof Array) {glsljit.array(%s, "%s")} else {%s};`' %(n,v, n, n,n, orelse) + + #elif name == 'glsl_inline': + # return '`%s`' %self.visit(node.args[0]) + #elif name == 'glsl_inline_array': + # raise NotImplementedError + # return '`__glsl_inline_array(%s, "%s")`' %(self.visit(node.args[0]), node.args[1].s) elif name == 'instanceof': ## this gets used by "with javascript:" blocks to test if an instance is a JavaScript type return self._visit_call_helper_instanceof( node ) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index a949b23..410749e 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -15,63 +15,78 @@ JS('AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError";') JS('RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError";') -with lowlevel: - def __glsl_inline_array(ob, name): - ## normally it would be ok to just return `float name[n]`, and then in __glsl_inline_object - ## return the literal array as `{a,b,c}`, but no static arrays are allowed in WebGL GLSL. - ## note: only array types need to be dynamically typedef with fixed size given ## - a = ['float ' + name + '[' + ob.length + ']'] - i = 0 - while i < ob.length: - a.push(';'+name+'['+i+']='+ob[i]) - i += 1 - ## in WebGL GLSL, array.length() is not available, workaround: cache it here as `_len_NAME` - a.push( ';int _len_' + name + '=' +ob.length ) - return ''.join(a) +with javascript: + def glsljit_runtime(header): + return new( GLSLJITRuntime(header) ) + class GLSLJITRuntime: + def __init__(self, header): + self.header = header + self.shader = [] + self.object_packagers = [] - def __glsl_inline_object(ob, name): - if instanceof(ob,Array): - #return '{'+ob.toString()+'}' ## no static arrays in WebGL GLSL - #return 'float['+ob.length+'](' + ob.toString() + ')' ## this will not work either - print('ERROR: WebGL GLSL arrays can not be inlined in __glsl_inline_object') - return '' - else: - return ob - - def __unpack_array2d(arr, dims): - w,h = dims - row = [] - rows = [row] - for value in arr: - row.append(value) - if row.length >= w: - row = [] - rows.append(row) - rows.pop() - if rows.length != h: - print('ERROR: __unpack_array2d, invalid height.') - return rows - - def __unpack_vec4(arr, dims): - w,h = dims - rows = [] - i=0 - for y in range(h): + def push(self, s): + self.shader.push(s) + + def array(self, ob, name): + a = ['float ' + name + '[' + ob.length + ']'] + i = 0 + while i < ob.length: + a.push(';'+name+'['+i+']='+ob[i]) + i += 1 + ## in WebGL GLSL, array.length() is not available, workaround: cache it here as `_len_NAME`, + ## but this fails to work with loops that require literals. + #a.push( ';int _len_' + name + '=' +ob.length ) + self.shader.push( ''.join(a) ) + + def object(self, ob, name): + for p in self.object_packagers: + cls, func = p + if instanceof(ob, cls): + return func(ob) + + def unpack_array2d(self, arr, dims): + if typeof(dims)=='number': + return arr + + w,h = dims row = [] - rows.append( row ) - for x in range(w): - vec = [] - for j in range(4): - vec.append( arr[i]) - i += 1 - row.append( vec ) + rows = [row] + for value in arr: + row.append(value) + if row.length >= w: + row = [] + rows.append(row) + rows.pop() + if rows.length != h: + print('ERROR: __unpack_array2d, invalid height.') + return rows + + def unpack_vec4(self, arr, dims): + if typeof(dims)=='number': + w = dims + h = 1 + else: + w,h = dims + rows = [] + i=0 + for y in range(h): + row = [] + rows.append( row ) + for x in range(w): + vec = [] + for j in range(4): + vec.append( arr[i]) + i += 1 + row.append( vec ) - if rows.length != h: - print('ERROR: __unpack_vec4, invalid height.') - return rows + if rows.length != h: + print('ERROR: __unpack_vec4, invalid height.') + return rows +with lowlevel: + def __getattr__(ob, a ): if ob.__getattr__: return JS("ob.__getattr__(a)") @@ -630,6 +645,14 @@ def func(): else: return False return True + @String.prototype.isnumber + def func(): + digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.'] + for char in this: + if char in digits: pass + else: return False + return True + ## TODO - for now these are just dummy functions. @String.prototype.decode def func(encoding): diff --git a/regtests/webclgl/slice_dynamic_list.py b/regtests/webclgl/slice_dynamic_list.py new file mode 100644 index 0000000..aab4591 --- /dev/null +++ b/regtests/webclgl/slice_dynamic_list.py @@ -0,0 +1,37 @@ +"""iterate over dynamic list""" +from random import random + +class G: + def __init__(self, s): + self.arr1 = [ random() for i in range(s) ] + + def run(self, X): + + @returns( array=[8,8] ) + @gpu.main + def gpufunc(x): + float x + float b = x * 0.5 + float* a = self.arr1[ 4: ] + for i in range( len(a) ): + b += a[i] + return b + + return gpufunc(X) + + +def main(): + u = -1.0 + g = G(10) + res = g.run( u ) + print(res) + for i in range(3): ## test dynamic size + if i==0: + g.arr1 = [ 0.01 for x in range(8) ] + elif i==1: + g.arr1 = [ 0.01 for x in range(16) ] + else: + g.arr1 = [ 0.01 for x in range(32) ] + + res = g.run( u ) + print(res) \ No newline at end of file diff --git a/regtests/webclgl/subroutine.py b/regtests/webclgl/subroutine.py index 11efdf9..bfc4327 100644 --- a/regtests/webclgl/subroutine.py +++ b/regtests/webclgl/subroutine.py @@ -7,11 +7,12 @@ def main(): float y return x-y - #@gpu.returns.vec4 + @returns( array=64 ) @gpu.main def myfunc(a): float* a - return mysub( 1.1 * a[_id_], 2.2 ) + #return mysub( 1.1 * a[_id_], 2.2 ) + return mysub( 1.1 * a[...], 2.2 ) A = [1.3 for i in range(64)] From 534054b3008197eb12e1471774484abfa3ca4eb2 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 22 Jun 2014 02:14:16 -0700 Subject: [PATCH 063/222] webCLgl backend: fixed dynamic attributes, js-mode needs glsljit code outside of wrapper function so that `this` can be bound properly. --- pythonjs/pythonjs.py | 8 ++++---- regtests/webclgl/dynamic_attributes.py | 28 ++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 regtests/webclgl/dynamic_attributes.py diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 0b06101..87b6237 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -317,8 +317,8 @@ def _visit_function(self, node): lines.append(';') if is_main: - insert = lines - lines = [] + #insert = lines + #lines = [] if not glsl_wrapper_name: glsl_wrapper_name = node.name @@ -328,9 +328,9 @@ def _visit_function(self, node): else: lines.append('function %s( __offset ) {' %glsl_wrapper_name ) - lines.append(' __offset = __offset || 0') ## note by default: 0 allows 0-1.0 ## TODO this needs to be set per-buffer + lines.append(' __offset = __offset || 1024*512') ## note by default: 0 allows 0-1.0 ## TODO this needs to be set per-buffer - lines.extend( insert ) + #lines.extend( insert ) lines.append(' var __webclgl = new WebCLGL()') lines.append(' var header = "\\n".join(__shader_header__)') diff --git a/regtests/webclgl/dynamic_attributes.py b/regtests/webclgl/dynamic_attributes.py new file mode 100644 index 0000000..ff4fb31 --- /dev/null +++ b/regtests/webclgl/dynamic_attributes.py @@ -0,0 +1,28 @@ +class myclass: + def __init__(self): + self.width = 100 + self.height = 64 + self.step = 0.01 + + def run(self, w, h, s): + self.width = w + self.height = h + self.step = s + + @returns( array=[8,8] ) + @gpu.main + def gpufunc(): + float b = 0.0 + for x in range( self.width ): + for y in range( self.height ): + b += self.step + return b + + return gpufunc() + +def main(): + A = myclass() + r = A.run(4,4, 0.8) + print(r) + r = A.run(16,16, 0.5) + print(r) \ No newline at end of file From 1f97e18c024728957c5f5d25b1993e8d741e25f0 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 22 Jun 2014 02:28:34 -0700 Subject: [PATCH 064/222] webCLgl: regression test for dynamic return size --- regtests/webclgl/dynamic_return_size.py | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 regtests/webclgl/dynamic_return_size.py diff --git a/regtests/webclgl/dynamic_return_size.py b/regtests/webclgl/dynamic_return_size.py new file mode 100644 index 0000000..b90f863 --- /dev/null +++ b/regtests/webclgl/dynamic_return_size.py @@ -0,0 +1,30 @@ +class myclass: + def __init__(self): + self.width = 100 + self.height = 64 + self.step = 0.01 + + def run(self, w, h, s, retw, reth): + self.width = w + self.height = h + self.step = s + + @returns( array=[retw,reth] ) + @gpu.main + def gpufunc(): + float b = 0.0 + for x in range( self.width ): + for y in range( self.height ): + b += self.step + return b + + return gpufunc() + +def main(): + A = myclass() + r = A.run(4,4, 0.8, 16,128) + TestError( len(r)==128 ) + TestError( len(r[0])==16 ) + r = A.run(16,16, 0.5, 64,16) + TestError( len(r[0])==64 ) + TestError( len(r)==16 ) From 5f06ed42bbd11753b2ca75297d7f37bf9ab6e759 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 22 Jun 2014 07:14:06 -0700 Subject: [PATCH 065/222] webCLgl: loop over array of arrays --- pythonjs/pythonjs.js | 115 ++++++++++++++++++----------- pythonjs/pythonjs.py | 49 +++++++++--- pythonjs/runtime/builtins.py | 39 +++++++--- regtests/webclgl/array_of_array.py | 23 ++++++ 4 files changed, 162 insertions(+), 64 deletions(-) create mode 100644 regtests/webclgl/array_of_array.py diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 1a1233e..3543394 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -519,14 +519,39 @@ GLSLJITRuntime.prototype.__init__ = function(header) { GLSLJITRuntime.__init__ = function () { return GLSLJITRuntime.prototype.__init__.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.array = function(ob, name) { - var a,i; - a = [(((("float " + name) + "[") + ob.length) + "]")]; - i = 0; - while (( i ) < ob.length) { - a.push((((((";" + name) + "[") + i) + "]=") + ob[i])); - i += 1; + var a,i,j,subname,subarr,v; + if (__test_if_true__(ob[0] instanceof Array)) { + a = []; + i = 0; + while (( i ) < ob.length) { + subarr = ob[i]; + subname = __sprintf("%s_%s", [name, i]); + if (( a.length ) == 0) { + a.append((((("float " + subname) + "[") + subarr.length) + "]")); + } else { + a.append(((((";float " + subname) + "[") + subarr.length) + "]")); + } + j = 0; + while (( j ) < subarr.length) { + v = (subarr[j] + ""); + if (! (__contains__(v, "."))) { + v += ".0"; + } + a.push((((((";" + subname) + "[") + j) + "]=") + v)); + j += 1; + } + i += 1; + } + this.shader.push("".join(a)); + } else { + a = [(((("float " + name) + "[") + ob.length) + "]")]; + i = 0; + while (( i ) < ob.length) { + a.push((((((";" + name) + "[") + i) + "]=") + ob[i])); + i += 1; + } + this.shader.push("".join(a)); } - this.shader.push("".join(a)); } GLSLJITRuntime.array = function () { return GLSLJITRuntime.prototype.array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; @@ -1245,8 +1270,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 480: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 481: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 501: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 502: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1995,7 +2020,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__26; - __iterator__26 = __get__(__get__(arr, "__iter__", "no iterator - line 964: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__26 = __get__(__get__(arr, "__iter__", "no iterator - line 985: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { @@ -2035,7 +2060,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 984: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1005: return ob.__len__()"), "__call__")(); } } } @@ -2055,7 +2080,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 988: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1009: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2074,7 +2099,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__27; - __iterator__27 = __get__(__get__(objs, "__iter__", "no iterator - line 993: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__27 = __get__(__get__(objs, "__iter__", "no iterator - line 1014: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); while (( __iterator__27.index ) < __iterator__27.length) { @@ -2101,7 +2126,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__28; - __iterator__28 = __get__(__get__(objs, "__iter__", "no iterator - line 1001: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__28 = __get__(__get__(objs, "__iter__", "no iterator - line 1022: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { @@ -2128,7 +2153,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__29; - __iterator__29 = __get__(__get__(lst, "__iter__", "no iterator - line 1010: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__29 = __get__(__get__(lst, "__iter__", "no iterator - line 1031: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__29; __next__29 = __get__(__iterator__29, "next"); while (( __iterator__29.index ) < __iterator__29.length) { @@ -2159,7 +2184,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__30; - __iterator__30 = __get__(__get__(lst, "__iter__", "no iterator - line 1017: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__30 = __get__(__get__(lst, "__iter__", "no iterator - line 1038: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__30; __next__30 = __get__(__iterator__30, "next"); while (( __iterator__30.index ) < __iterator__30.length) { @@ -2273,7 +2298,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1052: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1073: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2384,27 +2409,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__31; - __iterator__31 = __get__(__get__(ob, "__iter__", "no iterator - line 1107: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__31 = __get__(__get__(ob, "__iter__", "no iterator - line 1128: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__31; __next__31 = __get__(__iterator__31, "next"); while (( __iterator__31.index ) < __iterator__31.length) { o = __next__31(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1109: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1109: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1109: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1130: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1130: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1130: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1111: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1111: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1111: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1132: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1132: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1132: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__32; - __iterator__32 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1113: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__32 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1134: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__32; __next__32 = __get__(__iterator__32, "next"); while (( __iterator__32.index ) < __iterator__32.length) { key = __next__32(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1114: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1115: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1135: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1136: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2431,15 +2456,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__33; - __iterator__33 = __get__(__get__(keys, "__iter__", "no iterator - line 1123: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__33 = __get__(__get__(keys, "__iter__", "no iterator - line 1144: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__33; __next__33 = __get__(__iterator__33, "next"); while (( __iterator__33.index ) < __iterator__33.length) { key = __next__33(); - value = __get__(self["$wrapped"], "__getitem__", "line 1124: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1145: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1127: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1148: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2501,7 +2526,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1143: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1164: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2526,12 +2551,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__34; - __iterator__34 = __get__(__get__(other, "__iter__", "no iterator - line 1151: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__34 = __get__(__get__(other, "__iter__", "no iterator - line 1172: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__34; __next__34 = __get__(__iterator__34, "next"); while (( __iterator__34.index ) < __iterator__34.length) { key = __next__34(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1152: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1152: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1173: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1173: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2551,12 +2576,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__35; - __iterator__35 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1156: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__35 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1177: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__35; __next__35 = __get__(__iterator__35, "next"); while (( __iterator__35.index ) < __iterator__35.length) { key = __next__35(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1157: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1178: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2601,7 +2626,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1167: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1188: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2906,7 +2931,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1368: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1368: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1389: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1389: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -2930,7 +2955,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1392: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1413: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -2965,7 +2990,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1400: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1421: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -2991,7 +3016,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1410: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1410: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1431: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1431: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3030,7 +3055,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1429: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1429: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1450: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1450: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3101,13 +3126,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1454: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1454: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1475: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1475: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1459: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1480: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3167,7 +3192,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1487: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1508: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3187,12 +3212,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__40; - __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1491: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1512: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { value = __next__40(); - __get__(__get__(self, "append", "missing attribute `append` - line 1492: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1513: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3234,7 +3259,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1504: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1525: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3252,9 +3277,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1508: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1529: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1509: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1530: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 87b6237..382808c 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -289,17 +289,25 @@ def _visit_function(self, node): sub = [] for ci,chk in enumerate(chunks): if not ci%2: - assert '@' not in chk + if '@' in chk: + raise SyntaxError(chunks) if ci==0: - sub.append('"%s"'%chk) + if chk: + sub.append('"%s"'%chk) else: - sub.append(' + "%s"'%chk) + if chk: + if sub: + sub.append(' + "%s"'%chk) + else: + sub.append('"%s"'%chk) + elif chk.startswith('@'): lines.append( chk[1:] ) else: sub.append(' + %s' %chk) - lines.append( 'glsljit.push(%s);' %''.join(sub)) + if sub: + lines.append( 'glsljit.push(%s);' %''.join(sub)) else: lines.append( 'glsljit.push("%s");' %(self.indent()+sub) ) @@ -335,7 +343,7 @@ def _visit_function(self, node): lines.append(' var __webclgl = new WebCLGL()') lines.append(' var header = "\\n".join(__shader_header__)') lines.append(' var shader = "\\n".join(glsljit.shader)') - #lines.append(' console.log(shader)') + lines.append(' console.log(shader)') ## create the webCLGL kernel, compiles GLSL source lines.append(' var __kernel = __webclgl.createKernel( shader, header );') @@ -518,9 +526,12 @@ def _visit_call_helper_new(self, node): def visit_Call(self, node): name = self.visit(node.func) if self._glsl and name == 'len': - assert isinstance(node.args[0], ast.Name) - #return '_len_%s' %node.args[0].id ## this will not work with loops - return '`%s.length`' %node.args[0].id + if isinstance(node.args[0], ast.Name): + return '`%s.length`' %node.args[0].id + elif isinstance(node.args[0], ast.Subscript): + s = node.args[0] + v = self.visit(s).replace('`', '') + return '`%s.length`' %v elif name == 'glsl_inline_push_js_assign': # '@' triggers a new line of generated code @@ -876,8 +887,26 @@ def visit_For(self, node): ''' if self._glsl: target = self.visit(node.target) - iter = self.visit(node.iter.args[0]) - lines = ['for (int %s=0; %s < %s; %s++) {' %(target, target, iter, target)] + + if isinstance(node.iter, ast.Call): ## `for i in range(n):` + iter = self.visit(node.iter.args[0]) + lines = ['for (int %s=0; %s < %s; %s++) {' %(target, target, iter, target)] + elif isinstance(node.iter, ast.Name): ## `for subarray in arrayofarrays:` + lines = ['for (int _iter=0; _iter < `%s.length`; _iter++) {' %node.iter.id ] + ## capture the length of the subarray into the current javascript scope + lines.append( '`@var __len = %s[0].length;`' %node.iter.id) + ## declare array with size ## + lines.append( 'float %s[`__len`];' %target) + ## at runtime loop over subarray, for each index inline into the shader's for-loop an if test, + ## that checks if the top-level iterator is the same index, and if so copy its contents into the local subarray, + ## this works because the function glsljit.array will unpack an array of arrays using the variable name with postfix "_n" + ## note the extra for loop `_J` is required because the local subarray can not be assigned to `A_n` + lines.append( '`@for (var __j=0; __j<__len; __j++) {`') + lines.append( '`@glsljit.push("if (_iter==" +__j+") { for (int _J=0; _J<"+__j+"; _J++) {%s[_J] = %s_"+__j+"[_J];} }");`' %(target, node.iter.id)) + lines.append( '`@}`') + else: + raise SyntaxError(node.iter) + for b in node.body: lines.append( self.visit(b) ) lines.append( '}' ) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 410749e..0e85b8f 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -29,15 +29,36 @@ def push(self, s): self.shader.push(s) def array(self, ob, name): - a = ['float ' + name + '[' + ob.length + ']'] - i = 0 - while i < ob.length: - a.push(';'+name+'['+i+']='+ob[i]) - i += 1 - ## in WebGL GLSL, array.length() is not available, workaround: cache it here as `_len_NAME`, - ## but this fails to work with loops that require literals. - #a.push( ';int _len_' + name + '=' +ob.length ) - self.shader.push( ''.join(a) ) + if instanceof(ob[0], Array): + a = [] #'float ' + name + '[' + ob.length + ']'] + i = 0 + while i < ob.length: + subarr = ob[i] + subname = '%s_%s'%(name,i) + if a.length==0: + a.append('float ' + subname + '[' + subarr.length + ']') + else: + a.append(';float ' + subname + '[' + subarr.length + ']') + j = 0 + while j < subarr.length: + v = subarr[j] + '' + if '.' not in v: + v += '.0' + a.push(';'+subname+'['+j+']='+v) + j += 1 + + i += 1 + + self.shader.push( ''.join(a) ) + + else: + a = ['float ' + name + '[' + ob.length + ']'] + i = 0 + while i < ob.length: + a.push(';'+name+'['+i+']='+ob[i]) + i += 1 + + self.shader.push( ''.join(a) ) def object(self, ob, name): for p in self.object_packagers: diff --git a/regtests/webclgl/array_of_array.py b/regtests/webclgl/array_of_array.py new file mode 100644 index 0000000..f7a2c7d --- /dev/null +++ b/regtests/webclgl/array_of_array.py @@ -0,0 +1,23 @@ +class myclass: + def __init__(self): + pass + + def run(self, w, h, length): + self.array = [ [x*y*0.5 for y in range(h)] for x in range(w) ] + + @returns( array=64 ) + @gpu.main + def gpufunc(): + float* A = self.array + float b = 0.0 + for subarray in A: + for j in range( len(self.array[0]) ): + b += subarray[j] + return b + + return gpufunc() + +def main(): + m = myclass() + r = m.run(8,4) + print(r) \ No newline at end of file From 4a963925c2ad367c8790ff765ab4c5e003b41a88 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 22 Jun 2014 18:49:20 -0700 Subject: [PATCH 066/222] webCLgl: support for integer arrays using Int16Array --- pythonjs/pythonjs.js | 88 ++++++++++++++++++------------- pythonjs/pythonjs.py | 11 ++-- pythonjs/runtime/builtins.py | 9 ++++ pythonjs/typedpython.py | 4 +- regtests/webclgl/integer_array.py | 21 ++++++++ 5 files changed, 89 insertions(+), 44 deletions(-) create mode 100644 regtests/webclgl/integer_array.py diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 3543394..6b44e60 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -555,6 +555,18 @@ GLSLJITRuntime.prototype.array = function(ob, name) { } GLSLJITRuntime.array = function () { return GLSLJITRuntime.prototype.array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.int16array = function(ob, name) { + var a,i; + a = [(((("int " + name) + "[") + ob.length) + "]")]; + i = 0; + while (( i ) < ob.length) { + a.push((((((";" + name) + "[") + i) + "]=") + ob[i])); + i += 1; + } + this.shader.push("".join(a)); +} + +GLSLJITRuntime.int16array = function () { return GLSLJITRuntime.prototype.int16array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.object = function(ob, name) { var func,cls; var __iter1 = this.object_packagers; @@ -1270,8 +1282,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 501: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 502: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 510: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 511: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2020,7 +2032,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__26; - __iterator__26 = __get__(__get__(arr, "__iter__", "no iterator - line 985: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__26 = __get__(__get__(arr, "__iter__", "no iterator - line 994: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__26; __next__26 = __get__(__iterator__26, "next"); while (( __iterator__26.index ) < __iterator__26.length) { @@ -2060,7 +2072,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1005: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1014: return ob.__len__()"), "__call__")(); } } } @@ -2080,7 +2092,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1009: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1018: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2099,7 +2111,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__27; - __iterator__27 = __get__(__get__(objs, "__iter__", "no iterator - line 1014: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__27 = __get__(__get__(objs, "__iter__", "no iterator - line 1023: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__27; __next__27 = __get__(__iterator__27, "next"); while (( __iterator__27.index ) < __iterator__27.length) { @@ -2126,7 +2138,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__28; - __iterator__28 = __get__(__get__(objs, "__iter__", "no iterator - line 1022: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__28 = __get__(__get__(objs, "__iter__", "no iterator - line 1031: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__28; __next__28 = __get__(__iterator__28, "next"); while (( __iterator__28.index ) < __iterator__28.length) { @@ -2153,7 +2165,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__29; - __iterator__29 = __get__(__get__(lst, "__iter__", "no iterator - line 1031: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__29 = __get__(__get__(lst, "__iter__", "no iterator - line 1040: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__29; __next__29 = __get__(__iterator__29, "next"); while (( __iterator__29.index ) < __iterator__29.length) { @@ -2184,7 +2196,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__30; - __iterator__30 = __get__(__get__(lst, "__iter__", "no iterator - line 1038: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__30 = __get__(__get__(lst, "__iter__", "no iterator - line 1047: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__30; __next__30 = __get__(__iterator__30, "next"); while (( __iterator__30.index ) < __iterator__30.length) { @@ -2298,7 +2310,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1073: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1082: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2409,27 +2421,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__31; - __iterator__31 = __get__(__get__(ob, "__iter__", "no iterator - line 1128: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__31 = __get__(__get__(ob, "__iter__", "no iterator - line 1137: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__31; __next__31 = __get__(__iterator__31, "next"); while (( __iterator__31.index ) < __iterator__31.length) { o = __next__31(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1130: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1130: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1130: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1139: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1139: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1139: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1132: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1132: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1132: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1141: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1141: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1141: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__32; - __iterator__32 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1134: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__32 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1143: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__32; __next__32 = __get__(__iterator__32, "next"); while (( __iterator__32.index ) < __iterator__32.length) { key = __next__32(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1135: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1136: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1144: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1145: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2456,15 +2468,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__33; - __iterator__33 = __get__(__get__(keys, "__iter__", "no iterator - line 1144: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__33 = __get__(__get__(keys, "__iter__", "no iterator - line 1153: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__33; __next__33 = __get__(__iterator__33, "next"); while (( __iterator__33.index ) < __iterator__33.length) { key = __next__33(); - value = __get__(self["$wrapped"], "__getitem__", "line 1145: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1154: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1148: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1157: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2526,7 +2538,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1164: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1173: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2551,12 +2563,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__34; - __iterator__34 = __get__(__get__(other, "__iter__", "no iterator - line 1172: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__34 = __get__(__get__(other, "__iter__", "no iterator - line 1181: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__34; __next__34 = __get__(__iterator__34, "next"); while (( __iterator__34.index ) < __iterator__34.length) { key = __next__34(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1173: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1173: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1182: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1182: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2576,12 +2588,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__35; - __iterator__35 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1177: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__35 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1186: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__35; __next__35 = __get__(__iterator__35, "next"); while (( __iterator__35.index ) < __iterator__35.length) { key = __next__35(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1178: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1187: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2626,7 +2638,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1188: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1197: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2931,7 +2943,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1389: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1389: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1398: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1398: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -2955,7 +2967,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1413: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1422: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -2990,7 +3002,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1421: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1430: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3016,7 +3028,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1431: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1431: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1440: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1440: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3055,7 +3067,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1450: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1450: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1459: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1459: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3126,13 +3138,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1475: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1475: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1484: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1484: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1480: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1489: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3192,7 +3204,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1508: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1517: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3212,12 +3224,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__40; - __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1512: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1521: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { value = __next__40(); - __get__(__get__(self, "append", "missing attribute `append` - line 1513: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1522: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3259,7 +3271,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1525: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1534: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3277,9 +3289,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1529: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1538: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1530: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1539: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 382808c..8e310f4 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -368,7 +368,7 @@ def _visit_function(self, node): for i,arg in enumerate(args): lines.append(' if (%s instanceof Array) {' %arg) #lines.append(' __return_length = %s.length==2 ? %s : %s.length' %(arg,arg, arg) ) - lines.append(' var %s_buffer = __webclgl.createBuffer(%s.length, "FLOAT", %s.scale || __offset)' %(arg,arg,arg)) + lines.append(' var %s_buffer = __webclgl.createBuffer(%s.dims || %s.length, "FLOAT", %s.scale || __offset)' %(arg,arg,arg,arg)) lines.append(' __webclgl.enqueueWriteBuffer(%s_buffer, %s)' %(arg, arg)) lines.append(' __kernel.setKernelArg(%s, %s_buffer)' %(i, arg)) lines.append(' } else { __kernel.setKernelArg(%s, %s) }' %(i, arg)) @@ -542,11 +542,14 @@ def visit_Call(self, node): v = self.visit(node.args[1]) ## check if number is required because literal floats like `1.0` will get transformed to `1` by javascript toString orelse = 'typeof(%s)=="object" ? glsljit.object(%s, "%s") : glsljit.push("%s="+%s+";")' %(n, n,n, n,n) + + ## if a constant number literal directly inline if v.isdigit() or (v.count('.')==1 and v.split('.')[0].isdigit() and v.split('.')[1].isdigit()): - if_number = ' if (typeof(%s)=="number") { glsljit.push("%s=%s;") } else {' %(n, n,v) - return '`@%s=%s; %s if (%s instanceof Array) {glsljit.array(%s, "%s")} else {%s}};`' %(n,v, if_number, n, n,n, orelse) + #if_number = ' if (typeof(%s)=="number") { glsljit.push("%s=%s;") } else {' %(n, n,v) + #return '`@%s=%s; %s if (%s instanceof Array) {glsljit.array(%s, "%s")} else {%s}};`' %(n,v, if_number, n, n,n, orelse) + return '`@%s=%s; glsljit.push("%s=%s;");`' %(n,v, n,v) else: - return '`@%s=%s; if (%s instanceof Array) {glsljit.array(%s, "%s")} else {%s};`' %(n,v, n, n,n, orelse) + return '`@%s=%s; if (%s instanceof Array) {glsljit.array(%s, "%s")} else { if (%s instanceof Int16Array) {glsljit.int16array(%s,"%s")} else {%s} };`' %(n,v, n, n,n, n,n,n, orelse) #elif name == 'glsl_inline': # return '`%s`' %self.visit(node.args[0]) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 0e85b8f..69c7de0 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -28,6 +28,15 @@ def __init__(self, header): def push(self, s): self.shader.push(s) + def int16array(self, ob, name): + a = ['int ' + name + '[' + ob.length + ']'] + i = 0 + while i < ob.length: + a.push(';'+name+'['+i+']='+ob[i]) + i += 1 + + self.shader.push( ''.join(a) ) + def array(self, ob, name): if instanceof(ob[0], Array): a = [] #'float ' + name + '[' + ob.length + ']'] diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 6460814..9b9e74e 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -1,7 +1,7 @@ types = ['str', 'list', 'dict'] -glsl_types = ['float*', 'vec2', 'vec3', 'vec4'] -glsl_aliases = ['floatPOINTER'] +glsl_types = ['int*', 'float*', 'vec2', 'vec3', 'vec4'] +glsl_aliases = ['floatPOINTER', 'intPOINTER'] types.extend( glsl_types ) types.extend( glsl_aliases ) diff --git a/regtests/webclgl/integer_array.py b/regtests/webclgl/integer_array.py new file mode 100644 index 0000000..be2df5f --- /dev/null +++ b/regtests/webclgl/integer_array.py @@ -0,0 +1,21 @@ +"""integer array""" + +class myclass: + def __init__(self): + pass + def run(self, n): + self.intarray = new(Int16Array(n)) + self.intarray[0] = 100 + @returns( array=n ) + @gpu.main + def gpufunc(): + int* A = self.intarray + return float( A[0] ) + + return gpufunc() + +def main(): + m = myclass() + r = m.run(64) + print(r) + TestError( int(r[0])==100 ) \ No newline at end of file From b8b6c970ed43aa25c1570554c36b0560ed24ec3b Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 22 Jun 2014 20:04:10 -0700 Subject: [PATCH 067/222] updated GPU readme, fixed list slice, and new test call external method call from GPU code. --- doc/gpu.md | 242 ++++++++++++++++++----- pythonjs/pythonjs.py | 13 +- regtests/webclgl/call_external_method.py | 31 +++ regtests/webclgl/slice_dynamic_list.py | 7 +- 4 files changed, 238 insertions(+), 55 deletions(-) create mode 100644 regtests/webclgl/call_external_method.py diff --git a/doc/gpu.md b/doc/gpu.md index 26834e5..c8ee94d 100644 --- a/doc/gpu.md +++ b/doc/gpu.md @@ -1,51 +1,51 @@ GPU Translation --------------- -A subset of Python with extra type information can be translated into a GLSL fragment shader. The `@gpu` decorator marks a function for translation to GLSL. All variables inside the function must be typed using GLSL types. You can type your variables using decorators or special PythonJS type syntax. +A subset of Python with extra type information can be translated into a WebGL GLSL fragment shader. +The shader program takes input in two ways: as arguments to the `main` function, argument types can be: int, float, or 1D and 2D arrays of floats or vec4. This is the most efficient way to load large arrays into the shader. The shader can also use input by inlining objects from the current javascript scope. -Python GPU Subset: +micro language: ----------------- - . for loops `for i in range(n):` - . if/elif/else - . subroutines - . input/output 1D/2D arrays of floats and or vec4 - . all variables must be given a GLSL typedef. + . GLSL standard types + . basic math ops and logic: if, elif, else, for i in range(n) + . list of lists iteration with dynamic size + + . define GPU `main` function with input arguments and subroutines + . `gpu.main` can take arguments typed as: int, float, and float* + . `gpu.main` returns an list of floats or vec4 + + . stream input variables into shader from attributes or method calls: + . attribute: `float gpu_variable = self.cpu_variable` + . method call: `float a = self.my_method( a,b,c, x=y,z=w )` + . slice list: `float* a = self.mylist[n:]` -GLSL Types: ----------- - . int - . float, float* - . vec2, vec3, vec4 -Typing with Decorators +gpu.main ---------------------- +The `@gpu.main` decorator marks a function as the entry point. The main function requires the `@returns` decorator to set the return type to array or vec4, and return length (n) or 2D dimensions ([x,y]). The example below would return 512x512 array of 1.1. + + ``` @returns( array=[512,512] ) - @typedef( x=float, y=float, tempX=float, i=int, runaway=int, c=vec2) + @typedef( x=float, y=float ) @gpu.main - def gpu_mandelbrot(): - c = get_global_id() - x = 0.0 - y = 0.0 - tempX = 0.0 - i = 0 - runaway = 0 - for i in range(100): - tempX = x * x - y * y + float(c.x) - y = 2.0 * x * y + float(c.y) - x = tempX - if runaway == 0 and x * x + y * y > 100.0: - runaway = i - return float(runaway) * 0.01 + def gpu_func(): + x = 0.5 + y = 0.6 + return x+y ``` - -Typing with PythonJS C-style type prefixes +output index array index ---------------------- +To get the index of the current fragment (index in the output array), +WebCLGL provides the function `get_global_id()` that returns a `vec2`. +The `x` and `y` attributes of the vec2 provide the 2D index. + + ``` @returns( array=[512,512] ) @gpu.main @@ -66,22 +66,10 @@ Typing with PythonJS C-style type prefixes ``` -@returns ---------- -The main entry point function marked with `@gpu.main` must also use the `@returns(array=[w,h])` decorator to declare the width and height of the 2D array that it will return. Subroutines must also use the `@returns` decorator to declare their GLSL return type like this: `@returns(float)` - -@typedef --------- -This decorator allows you to give a GLSL type to each variable in the function. The syntax is `@typedef( VARIABLE_NAME=GLSL_TYPE )`. - - -get_global_id() --------------- -The GLSL function `get_global_id()` is part of the WebCLGL API and returns a vec2 that contains the current `x` and `y` index. subroutines ----------- -Function subroutines are decorated with `@gpu`. The main entry point function is decorated with `@gpu.main`. Example: +Function subroutines are decorated with `@gpu` ``` @returns( float ) @@ -97,24 +85,176 @@ Function subroutines are decorated with `@gpu`. The main entry point function i ``` +note: instead of using the @returns decorator, the return type of the `mysub` could also be placed at the start of the function def. + +``` + @gpu + float def mysub(x,y): + float x + float y + return x-y + +``` + using arrays as arguments to gpu.main --------------------------------------- -You can pass a list of floats as arguments to your gpu entry point function, these will be translated into WebCLGL buffers and uploaded to the GPU. By default the input arrays are expected to have a range of 0.0-1.0. If you are using arrays with values outside of the default range, it can be changed by setting the `scale` variable on the list before passing it to the gpu entry point function, the scale integer sets the range from -scale to +scale. Example: +You can pass a list of floats as arguments to your gpu entry point function, these will be translated into WebCLGL buffers and uploaded to the GPU. By default the input arrays are expected to have a range of 0.0-1.0. If you are using arrays with values outside of the default range, it can be changed by setting the `scale` variable on the list before passing it to the gpu entry point function, the scale integer sets the range from -scale to +scale. +In the example below the scale of `A` is increased, and `B` is changed to a 2D array by setting its `dims` attribute to [x,y] dimensions. ``` @gpu.main -def gpufunc(a,b,c): +def gpufunc(a,b): float* a float* b - float* c A = [2.0 for i in range(64)] A.scale=2 -B = [-4.0 for i in range(64)] -B.scale=4 -C = [1.5 for i in range(64)] -A.scale=2 ## set scale to largest integer -gpufunc( A, B, C ) +B = [ [0.5 for j in range(8)] for i in range(16)] +B.dims = [8,16] + +gpufunc( A, B ) + +``` + +dynamic input variables +---------- + +Attributes on variables from the current javascript scope can be dynamically inlined into the shader. +In the example below, within the shader code, the variables `self.width`, `self.height` and `self.step` exist in the javascript scope, each call to `run` recompiles the shader and copies the variable attributes into the shader. + +``` +class myclass: + def __init__(self): + self.width = 100 + self.height = 64 + self.step = 0.01 + + def run(self, w, h, s): + self.width = w + self.height = h + self.step = s + + @returns( array=[8,8] ) + @gpu.main + def gpufunc(): + float b = 0.0 + for x in range( self.width ): + for y in range( self.height ): + b += self.step + return b + + return gpufunc() + +A = myclass() +A.run(4,4, 0.8) +A.run(16,16, 0.5) + + +``` + +float list +-------------- + +Lists are translated into float32 arrays. +Iteration over a list is allowed using this syntax: `for i in range(len(A)):`. The values of and length of `A` can vary for each call. The dynamic array is assigned to a local variable and typed as `float*` + +A list can be sliced when it is assigned to a local variable, in the example below the first 4 items of `mylist` are trimed away. + +``` +class myclass: + def __init__(self): + self.mylist = [0.0 for i in range(64)] + + def run(self): + @returns( array=[8,8] ) + @gpu.main + def gpufunc(): + float b = 0.0 + float* A = self.mylist[4:] + for i in range( len(A) ): + b += A[i] + return b + + return gpufunc() + + +``` + +int array +---------- + +Integer arrays are defined using the JavaScript type `Int16Array`. +note: GLSL 1.2 limits integers to 16bit precision. +[http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf](see GLSL 1.2 spec) + +``` + self.intarray = new(Int16Array(n)) + self.intarray[0] = 100 + @returns( array=n ) + @gpu.main + def gpufunc(): + int* A = self.intarray + return float( A[0] ) + +``` + +float list of lists +--------------- + +Looping over an array of arrays requires an outer iterator loop `for sub in arr`, +and the inner loop iterate over the length of the first sub-array: `for i in range(len(arr[0]))` +All sub-arrays should have the same length, or at least as long as the first item `arr[0]`. +The number of arrays inside the main array, and the values/lengths of the sub-arrays, can vary each call. +Note: looping over many large arrays of arrays could be slow or cause the GLSL compiler to fail, +this happens because WebGLSL has no builtin support for array of arrays, and the generated code is large. + +``` +class myclass: + def __init__(self): + pass + + def run(self, w, h, length): + self.array = [ [x*y*0.5 for y in range(h)] for x in range(w) ] + + @gpu.main + def gpufunc(): + float* A = self.array + float b = 0.0 + for subarray in A: + for j in range( len(self.array[0]) ): + b += subarray[j] + return b + + +``` + +external method calls +--------------------- +Methods on external objects can be called within the shader function. + +``` +class myclass: + def __init__(self, i): + self.index = i + + def get_index(self): + return self.index + + def run(self, n): + self.intarray = new(Int16Array(n)) + self.intarray[ self.index ] = 99 + + @returns( array=n ) + @gpu.main + def gpufunc(): + int* A = self.intarray + return float( A[self.get_index()] ) + + return gpufunc() + +def main(): + m = myclass(10) + r = m.run(64) ``` \ No newline at end of file diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 8e310f4..abd5558 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -283,6 +283,10 @@ def _visit_function(self, node): if is_main: if '`' in sub: ## "`" runtime lookups + if '``' in sub: + raise SyntaxError(sub) + + sub = sub.replace('``', '') chunks = sub.split('`') if len(chunks) == 1: raise RuntimeError(chunks) @@ -492,7 +496,7 @@ def visit_Name(self, node): def visit_Attribute(self, node): name = self.visit(node.value) attr = node.attr - if self._glsl: + if self._glsl and name not in ('self', 'this'): if name not in self._typed_vars: return '`%s.%s`' % (name, attr) else: @@ -525,7 +529,9 @@ def _visit_call_helper_new(self, node): def visit_Call(self, node): name = self.visit(node.func) - if self._glsl and name == 'len': + if self._glsl and isinstance(node.func, ast.Attribute): + return '`%s`' %self._visit_call_helper(node) + elif self._glsl and name == 'len': if isinstance(node.args[0], ast.Name): return '`%s.length`' %node.args[0].id elif isinstance(node.args[0], ast.Subscript): @@ -540,6 +546,9 @@ def visit_Call(self, node): v = '%s.%s' %(node.args[1].value.id, node.args[1].attr ) else: v = self.visit(node.args[1]) + + v = v.replace('`', '') ## this is known this entire expression is an external call. + ## check if number is required because literal floats like `1.0` will get transformed to `1` by javascript toString orelse = 'typeof(%s)=="object" ? glsljit.object(%s, "%s") : glsljit.push("%s="+%s+";")' %(n, n,n, n,n) diff --git a/regtests/webclgl/call_external_method.py b/regtests/webclgl/call_external_method.py new file mode 100644 index 0000000..3194a29 --- /dev/null +++ b/regtests/webclgl/call_external_method.py @@ -0,0 +1,31 @@ +"""external method""" + +class myclass: + def __init__(self, i): + self.index = i + + def get_index(self): + return self.index + + def run(self, n): + self.intarray = new(Int16Array(n)) + self.intarray[ self.index ] = 99 + + @returns( array=n ) + @gpu.main + def gpufunc(): + int* A = self.intarray + + ## GLSL compile error: `Index expression must be constant` + #int idx = self.get_index() + #return float( A[idx] ) + + return float( A[self.get_index()] ) + + return gpufunc() + +def main(): + m = myclass(10) + r = m.run(64) + print(r) + TestError( int(r[10])==99 ) \ No newline at end of file diff --git a/regtests/webclgl/slice_dynamic_list.py b/regtests/webclgl/slice_dynamic_list.py index aab4591..b80fc3a 100644 --- a/regtests/webclgl/slice_dynamic_list.py +++ b/regtests/webclgl/slice_dynamic_list.py @@ -1,17 +1,20 @@ -"""iterate over dynamic list""" +"""slice and iterate over dynamic list""" from random import random class G: def __init__(self, s): self.arr1 = [ random() for i in range(s) ] + def func(self, x,y): + return x+y + def run(self, X): @returns( array=[8,8] ) @gpu.main def gpufunc(x): float x - float b = x * 0.5 + float b = self.func(1.1, 2.1) #x * 0.5 float* a = self.arr1[ 4: ] for i in range( len(a) ): b += a[i] From a7076d54ec0379ec22791705db2030f7dfb770b5 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 22 Jun 2014 23:25:56 -0700 Subject: [PATCH 068/222] webCLgl: fixed subarray copy values. --- pythonjs/pythonjs.py | 25 +++++++++++++++---------- regtests/webclgl/array_of_array.py | 13 ++++++++----- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index abd5558..6176da0 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -284,7 +284,7 @@ def _visit_function(self, node): if '`' in sub: ## "`" runtime lookups if '``' in sub: - raise SyntaxError(sub) + raise SyntaxError('inliner syntax error: %s'%sub) sub = sub.replace('``', '') chunks = sub.split('`') @@ -305,7 +305,7 @@ def _visit_function(self, node): else: sub.append('"%s"'%chk) - elif chk.startswith('@'): + elif chk.startswith('@'): ## special inline javascript. lines.append( chk[1:] ) else: sub.append(' + %s' %chk) @@ -904,24 +904,29 @@ def visit_For(self, node): iter = self.visit(node.iter.args[0]) lines = ['for (int %s=0; %s < %s; %s++) {' %(target, target, iter, target)] elif isinstance(node.iter, ast.Name): ## `for subarray in arrayofarrays:` - lines = ['for (int _iter=0; _iter < `%s.length`; _iter++) {' %node.iter.id ] ## capture the length of the subarray into the current javascript scope - lines.append( '`@var __len = %s[0].length;`' %node.iter.id) + ## this is required to inline the lengths as constants into the GLSL for loops + lines.append( '`@var __length__ = %s[0].length;`' %node.iter.id) + ## start the GLSL for loop - `__length__` is set above ## + lines = ['for (int _iter=0; _iter < `__length__`; _iter++) {' ] + ## declare array with size ## - lines.append( 'float %s[`__len`];' %target) + lines.append( 'float %s[`__length__`];' %target) + ## at runtime loop over subarray, for each index inline into the shader's for-loop an if test, - ## that checks if the top-level iterator is the same index, and if so copy its contents into the local subarray, + lines.append( '`@for (var __j=0; __j<__length__; __j++) {`') + ## below checks if the top-level iterator is the same index, and if so copy its contents into the local subarray, + lines.append( '`@glsljit.push("if (_iter==" +__j+ ") { for (int _J=0; _J<" +__length__+ "; _J++) {%s[_J] = %s_" +__j+ "[_J];} }");`' %(target, node.iter.id)) + lines.append( '`@}`') ## this works because the function glsljit.array will unpack an array of arrays using the variable name with postfix "_n" ## note the extra for loop `_J` is required because the local subarray can not be assigned to `A_n` - lines.append( '`@for (var __j=0; __j<__len; __j++) {`') - lines.append( '`@glsljit.push("if (_iter==" +__j+") { for (int _J=0; _J<"+__j+"; _J++) {%s[_J] = %s_"+__j+"[_J];} }");`' %(target, node.iter.id)) - lines.append( '`@}`') + else: raise SyntaxError(node.iter) for b in node.body: lines.append( self.visit(b) ) - lines.append( '}' ) + lines.append( '}' ) ## end of for loop return '\n'.join(lines) diff --git a/regtests/webclgl/array_of_array.py b/regtests/webclgl/array_of_array.py index f7a2c7d..025863b 100644 --- a/regtests/webclgl/array_of_array.py +++ b/regtests/webclgl/array_of_array.py @@ -1,15 +1,18 @@ class myclass: - def __init__(self): - pass + def __init__(self, s): + self.s = s + def my_method(self): + return self.s - def run(self, w, h, length): + def run(self, w, h): self.array = [ [x*y*0.5 for y in range(h)] for x in range(w) ] @returns( array=64 ) @gpu.main def gpufunc(): float* A = self.array - float b = 0.0 + float b = self.my_method() + for subarray in A: for j in range( len(self.array[0]) ): b += subarray[j] @@ -18,6 +21,6 @@ def gpufunc(): return gpufunc() def main(): - m = myclass() + m = myclass( 0.1 ) r = m.run(8,4) print(r) \ No newline at end of file From 07b6fed17fb298cc8d76f973f9468b6598e48cd3 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 23 Jun 2014 04:02:35 -0700 Subject: [PATCH 069/222] webCLgl: array of structs --- pythonjs/pythonjs.js | 534 ++++++++++++++++------------ pythonjs/pythonjs.py | 35 +- pythonjs/runtime/builtins.py | 67 ++++ pythonjs/typedpython.py | 4 +- regtests/webclgl/array_of_struct.py | 25 ++ 5 files changed, 438 insertions(+), 227 deletions(-) create mode 100644 regtests/webclgl/array_of_struct.py diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 6b44e60..87718ed 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -515,6 +515,7 @@ GLSLJITRuntime.prototype.__init__ = function(header) { this.header = header; this.shader = []; this.object_packagers = []; + this.struct_types = __jsdict([]); } GLSLJITRuntime.__init__ = function () { return GLSLJITRuntime.prototype.__init__.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; @@ -544,17 +545,84 @@ GLSLJITRuntime.prototype.array = function(ob, name) { } this.shader.push("".join(a)); } else { - a = [(((("float " + name) + "[") + ob.length) + "]")]; - i = 0; - while (( i ) < ob.length) { - a.push((((((";" + name) + "[") + i) + "]=") + ob[i])); - i += 1; + if (__test_if_true__(ob[0] instanceof Object || ( ob[0].__class__ ) === dict)) { + i = 0; + while (( i ) < ob.length) { + this.structure(ob[i], ((name + "_") + i)); + i += 1; + } + } else { + a = [(((("float " + name) + "[") + ob.length) + "]")]; + i = 0; + while (( i ) < ob.length) { + a.push((((((";" + name) + "[") + i) + "]=") + ob[i])); + i += 1; + } + this.shader.push("".join(a)); } - this.shader.push("".join(a)); } } GLSLJITRuntime.array = function () { return GLSLJITRuntime.prototype.array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.compile_header = function() { + var a,b; + a = "\n".join(this.header); + b = []; + var __iter1 = __jsdict_values(this.struct_types); + if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) ) { __iter1 = __object_keys__(__iter1) } + for (var __idx1=0; __idx1 < __iter1.length; __idx1++) { + var stype = __iter1[ __idx1 ]; + b.push(stype["code"]); + } + b = "\n".join(b); + return "\n".join([a, b]); +} + +GLSLJITRuntime.compile_header = function () { return GLSLJITRuntime.prototype.compile_header.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.compile_main = function() { + + return "\n".join(this.shader); +} + +GLSLJITRuntime.compile_main = function () { return GLSLJITRuntime.prototype.compile_main.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.define_structure = function(ob) { + var code,arrays,struct_type,member_list,struct_name,t,members,numbers; + arrays = []; + numbers = []; + struct_type = []; + var __iter2 = __jsdict_keys(ob); + if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } + for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { + var key = __iter2[ __idx2 ]; + t = typeof(ob[key]); + if (__test_if_true__(( t ) == "object" && ob[key] instanceof Array)) { + struct_type.push((("A" + key) + "_")); + arrays.push(key); + } else { + if (( t ) == "number") { + struct_type.push((("N" + key) + "_")); + numbers.push(key); + } + } + } + struct_name = "".join(struct_type); + ob.__struct_name__ = struct_name; + if (! (__contains__(this.struct_types, struct_name))) { + member_list = []; + var __iter3 = numbers; + if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) ) { __iter3 = __object_keys__(__iter3) } + for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { + var key = __iter3[ __idx3 ]; + member_list.append((("float " + key) + ";")); + } + members = ",".join(member_list); + code = (((("struct " + struct_name) + " {") + members) + "};"); + this.struct_types[struct_name] = __jsdict([["arrays", arrays], ["numbers", numbers], ["code", code]]); + } + return struct_name; +} + +GLSLJITRuntime.define_structure = function () { return GLSLJITRuntime.prototype.define_structure.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.int16array = function(ob, name) { var a,i; a = [(((("int " + name) + "[") + ob.length) + "]")]; @@ -569,10 +637,10 @@ GLSLJITRuntime.prototype.int16array = function(ob, name) { GLSLJITRuntime.int16array = function () { return GLSLJITRuntime.prototype.int16array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.object = function(ob, name) { var func,cls; - var __iter1 = this.object_packagers; - if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) ) { __iter1 = __object_keys__(__iter1) } - for (var __idx1=0; __idx1 < __iter1.length; __idx1++) { - var p = __iter1[ __idx1 ]; + var __iter4 = this.object_packagers; + if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } + for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { + var p = __iter4[ __idx4 ]; var __r_0; __r_0 = p; cls = __r_0[0]; @@ -590,6 +658,34 @@ GLSLJITRuntime.prototype.push = function(s) { } GLSLJITRuntime.push = function () { return GLSLJITRuntime.prototype.push.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.structure = function(ob, name) { + var stype,args,sname,wrapper; + wrapper = null; + if (__test_if_true__(ob instanceof Object)) { + /*pass*/ + } else { + if (( ob.__class__ ) === dict) { + wrapper = ob; + ob = ob["$wrapped"]; + } + } + sname = this.define_structure(ob); + if (__test_if_true__(wrapper)) { + wrapper.__struct_name__ = sname; + } + stype = this.struct_types[sname]; + args = []; + var __iter5 = stype["numbers"]; + if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } + for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { + var key = __iter5[ __idx5 ]; + args.push(ob[key]); + } + args = ",".join(args); + this.shader.push((((((((sname + " ") + name) + "=") + sname) + "(") + args) + ");")); +} + +GLSLJITRuntime.structure = function () { return GLSLJITRuntime.prototype.structure.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.unpack_array2d = function(arr, dims) { var h,rows,w,row; if (( typeof(dims) ) == "number") { @@ -601,10 +697,10 @@ GLSLJITRuntime.prototype.unpack_array2d = function(arr, dims) { h = __r_1[1]; row = []; rows = [row]; - var __iter2 = arr; - if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } - for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { - var value = __iter2[ __idx2 ]; + var __iter6 = arr; + if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } + for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { + var value = __iter6[ __idx6 ]; row.append(value); if (( row.length ) >= w) { row = []; @@ -783,10 +879,10 @@ __contains__ = function(ob, a) { throw new TypeError; } else { if (__test_if_true__(__is_typed_array(ob))) { - var __iter3 = ob; - if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) ) { __iter3 = __object_keys__(__iter3) } - for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { - var x = __iter3[ __idx3 ]; + var __iter7 = ob; + if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } + for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { + var x = __iter7[ __idx7 ]; if (( x ) == a) { return true; } @@ -869,10 +965,10 @@ __mul_op = function(a, b) { __jsdict = function(items) { var d,key; d = {}; - var __iter4 = items; - if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } - for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { - var item = __iter4[ __idx4 ]; + var __iter8 = items; + if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } + for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { + var item = __iter8[ __idx8 ]; key = item[0]; if (__test_if_true__(key.__uid__)) { key = key.__uid__; @@ -920,10 +1016,10 @@ __jsdict_values = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object)) { arr = []; - var __iter5 = ob; - if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } - for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { - var key = __iter5[ __idx5 ]; + var __iter9 = ob; + if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } + for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { + var key = __iter9[ __idx9 ]; if (__test_if_true__(ob.hasOwnProperty(key))) { value = ob[key]; arr.push(value); @@ -939,10 +1035,10 @@ __jsdict_items = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; - var __iter6 = ob; - if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } - for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { - var key = __iter6[ __idx6 ]; + var __iter10 = ob; + if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } + for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { + var key = __iter10[ __idx10 ]; if (__test_if_true__(Object.hasOwnProperty.call(ob, key))) { value = ob[key]; arr.push([key, value]); @@ -999,10 +1095,10 @@ __object_keys__ = function(ob) { __bind_property_descriptors__ = function(o, klass) { var prop,desc; - var __iter7 = klass.__properties__; - if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } - for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { - var name = __iter7[ __idx7 ]; + var __iter11 = klass.__properties__; + if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } + for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { + var name = __iter11[ __idx11 ]; desc = __jsdict([["enumerable", true]]); prop = klass.__properties__[name]; if (__test_if_true__(prop["get"])) { @@ -1013,10 +1109,10 @@ __bind_property_descriptors__ = function(o, klass) { } Object.defineProperty(o, name, desc); } - var __iter8 = klass.__bases__; - if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } - for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { - var base = __iter8[ __idx8 ]; + var __iter12 = klass.__bases__; + if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } + for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { + var base = __iter12[ __idx12 ]; __bind_property_descriptors__(o, base); } } @@ -1048,10 +1144,10 @@ __sprintf = function(fmt, args) { arr = []; var i; i = 0; - var __iter9 = chunks; - if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } - for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { - var txt = __iter9[ __idx9 ]; + var __iter13 = chunks; + if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } + for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { + var txt = __iter13[ __idx13 ]; arr.append(txt); if (( i ) >= args.length) { break; @@ -1084,10 +1180,10 @@ __create_class__ = function(class_name, parents, attrs, props) { klass.__all_method_names__ = []; klass.__properties__ = props; klass.__attributes__ = attrs; - var __iter10 = attrs; - if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } - for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { - var key = __iter10[ __idx10 ]; + var __iter14 = attrs; + if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } + for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { + var key = __iter14[ __idx14 ]; if (( typeof(attrs[key]) ) == "function") { klass.__all_method_names__.push(key); f = attrs[key]; @@ -1108,20 +1204,20 @@ __create_class__ = function(class_name, parents, attrs, props) { } klass.__setters__ = []; klass.__getters__ = []; - var __iter11 = klass.__properties__; - if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } - for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { - var name = __iter11[ __idx11 ]; + var __iter15 = klass.__properties__; + if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } + for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { + var name = __iter15[ __idx15 ]; prop = klass.__properties__[name]; klass.__getters__.push(name); if (__test_if_true__(prop["set"])) { klass.__setters__.push(name); } } - var __iter12 = klass.__bases__; - if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } - for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { - var base = __iter12[ __idx12 ]; + var __iter16 = klass.__bases__; + if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } + for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { + var base = __iter16[ __idx16 ]; Array.prototype.push.apply(klass.__getters__, base.__getters__); Array.prototype.push.apply(klass.__setters__, base.__setters__); Array.prototype.push.apply(klass.__all_method_names__, base.__all_method_names__); @@ -1134,10 +1230,10 @@ __create_class__ = function(class_name, parents, attrs, props) { object.__dict__ = object; has_getattribute = false; has_getattr = false; - var __iter13 = klass.__all_method_names__; - if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } - for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { - var name = __iter13[ __idx13 ]; + var __iter17 = klass.__all_method_names__; + if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } + for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { + var name = __iter17[ __idx17 ]; if (( name ) == "__getattribute__") { has_getattribute = true; } else { @@ -1282,8 +1378,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 510: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 511: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 577: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 578: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1505,10 +1601,10 @@ _setup_str_prototype = function(args, kwargs) { arr = a["$wrapped"]; } i = 0; - var __iter14 = arr; - if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } - for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { - var value = __iter14[ __idx14 ]; + var __iter18 = arr; + if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } + for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { + var value = __iter18[ __idx18 ]; out += value; i += 1; if (( i ) < arr.length) { @@ -1550,10 +1646,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; - var __iter15 = this; - if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } - for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { - var char = __iter15[ __idx15 ]; + var __iter19 = this; + if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } + for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { + var char = __iter19[ __idx19 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1567,10 +1663,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."]; - var __iter16 = this; - if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } - for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { - var char = __iter16[ __idx16 ]; + var __iter20 = this; + if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } + for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { + var char = __iter20[ __idx20 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1597,10 +1693,10 @@ _setup_str_prototype = function(args, kwargs) { var keys,r; r = this; keys = Object.keys(fmt); - var __iter17 = keys; - if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } - for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { - var key = __iter17[ __idx17 ]; + var __iter21 = keys; + if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } + for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { + var key = __iter21[ __idx21 ]; r = r.split(key).join(fmt[key]); } r = r.split("{").join("").split("}").join(""); @@ -1747,10 +1843,10 @@ _setup_array_prototype = function(args, kwargs) { stop = this.length; } arr = [start, (stop - start)]; - var __iter18 = items; - if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } - for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { - var item = __iter18[ __idx18 ]; + var __iter22 = items; + if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } + for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { + var item = __iter22[ __idx22 ]; arr.push(item); } this.splice.apply(this, arr); @@ -1766,10 +1862,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); var extend = function(other) { - var __iter19 = other; - if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } - for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { - var obj = __iter19[ __idx19 ]; + var __iter23 = other; + if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } + for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { + var obj = __iter23[ __idx23 ]; this.push(obj); } return this; @@ -1801,10 +1897,10 @@ _setup_array_prototype = function(args, kwargs) { var count = function(obj) { var a; a = 0; - var __iter20 = this; - if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } - for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { - var item = __iter20[ __idx20 ]; + var __iter24 = this; + if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } + for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { + var item = __iter24[ __idx24 ]; if (( item ) === obj) { a += 1; } @@ -1860,10 +1956,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { - var __iter21 = this; - if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } - for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { - var item = __iter21[ __idx21 ]; + var __iter25 = this; + if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } + for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { + var item = __iter25[ __idx25 ]; if (( other.indexOf(item) ) == -1) { return false; } @@ -2031,12 +2127,12 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b,__iterator__26; - __iterator__26 = __get__(__get__(arr, "__iter__", "no iterator - line 994: for b in arr:"), "__call__")([], __NULL_OBJECT__); - var __next__26; - __next__26 = __get__(__iterator__26, "next"); - while (( __iterator__26.index ) < __iterator__26.length) { - b = __next__26(); + var b,__iterator__30; + __iterator__30 = __get__(__get__(arr, "__iter__", "no iterator - line 1061: for b in arr:"), "__call__")([], __NULL_OBJECT__); + var __next__30; + __next__30 = __get__(__iterator__30, "next"); + while (( __iterator__30.index ) < __iterator__30.length) { + b = __next__30(); a += b; } return a; @@ -2072,7 +2168,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1014: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1081: return ob.__len__()"), "__call__")(); } } } @@ -2092,7 +2188,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1018: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1085: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2110,12 +2206,12 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__27; - __iterator__27 = __get__(__get__(objs, "__iter__", "no iterator - line 1023: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__27; - __next__27 = __get__(__iterator__27, "next"); - while (( __iterator__27.index ) < __iterator__27.length) { - ob = __next__27(); + var ob,__iterator__31; + __iterator__31 = __get__(__get__(objs, "__iter__", "no iterator - line 1090: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__31; + __next__31 = __get__(__iterator__31, "next"); + while (( __iterator__31.index ) < __iterator__31.length) { + ob = __next__31(); v = __get__(func, "__call__")([ob], __NULL_OBJECT__); arr.push(v); } @@ -2137,12 +2233,12 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__28; - __iterator__28 = __get__(__get__(objs, "__iter__", "no iterator - line 1031: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__28; - __next__28 = __get__(__iterator__28, "next"); - while (( __iterator__28.index ) < __iterator__28.length) { - ob = __next__28(); + var ob,__iterator__32; + __iterator__32 = __get__(__get__(objs, "__iter__", "no iterator - line 1098: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__32; + __next__32 = __get__(__iterator__32, "next"); + while (( __iterator__32.index ) < __iterator__32.length) { + ob = __next__32(); if (__test_if_true__(__get__(func, "__call__")([ob], __NULL_OBJECT__))) { arr.push(ob); } @@ -2164,12 +2260,12 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__29; - __iterator__29 = __get__(__get__(lst, "__iter__", "no iterator - line 1040: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__29; - __next__29 = __get__(__iterator__29, "next"); - while (( __iterator__29.index ) < __iterator__29.length) { - value = __next__29(); + var value,__iterator__33; + __iterator__33 = __get__(__get__(lst, "__iter__", "no iterator - line 1107: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__33; + __next__33 = __get__(__iterator__33, "next"); + while (( __iterator__33.index ) < __iterator__33.length) { + value = __next__33(); if (( a ) === null) { a = value; } else { @@ -2195,12 +2291,12 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__30; - __iterator__30 = __get__(__get__(lst, "__iter__", "no iterator - line 1047: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__30; - __next__30 = __get__(__iterator__30, "next"); - while (( __iterator__30.index ) < __iterator__30.length) { - value = __next__30(); + var value,__iterator__34; + __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1114: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__34; + __next__34 = __get__(__iterator__34, "next"); + while (( __iterator__34.index ) < __iterator__34.length) { + value = __next__34(); if (( a ) === null) { a = value; } else { @@ -2310,7 +2406,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1082: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1149: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2420,28 +2516,28 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o,__iterator__31; - __iterator__31 = __get__(__get__(ob, "__iter__", "no iterator - line 1137: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__31; - __next__31 = __get__(__iterator__31, "next"); - while (( __iterator__31.index ) < __iterator__31.length) { - o = __next__31(); + var o,__iterator__35; + __iterator__35 = __get__(__get__(ob, "__iter__", "no iterator - line 1204: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__35; + __next__35 = __get__(__iterator__35, "next"); + while (( __iterator__35.index ) < __iterator__35.length) { + o = __next__35(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1139: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1139: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1139: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1206: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1206: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1206: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1141: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1141: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1141: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1208: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1208: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1208: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key,__iterator__32; - __iterator__32 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1143: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__32; - __next__32 = __get__(__iterator__32, "next"); - while (( __iterator__32.index ) < __iterator__32.length) { - key = __next__32(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1144: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1145: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + var key,__iterator__36; + __iterator__36 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1210: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__36; + __next__36 = __get__(__iterator__36, "next"); + while (( __iterator__36.index ) < __iterator__36.length) { + key = __next__36(); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1211: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1212: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2467,16 +2563,16 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key,__iterator__33; - __iterator__33 = __get__(__get__(keys, "__iter__", "no iterator - line 1153: for key in keys:"), "__call__")([], __NULL_OBJECT__); - var __next__33; - __next__33 = __get__(__iterator__33, "next"); - while (( __iterator__33.index ) < __iterator__33.length) { - key = __next__33(); - value = __get__(self["$wrapped"], "__getitem__", "line 1154: value = self[...][key]")([key], __NULL_OBJECT__); + var key,__iterator__37; + __iterator__37 = __get__(__get__(keys, "__iter__", "no iterator - line 1220: for key in keys:"), "__call__")([], __NULL_OBJECT__); + var __next__37; + __next__37 = __get__(__iterator__37, "next"); + while (( __iterator__37.index ) < __iterator__37.length) { + key = __next__37(); + value = __get__(self["$wrapped"], "__getitem__", "line 1221: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1157: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1224: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2538,7 +2634,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1173: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1240: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2562,13 +2658,13 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key,__iterator__34; - __iterator__34 = __get__(__get__(other, "__iter__", "no iterator - line 1181: for key in other:"), "__call__")([], __NULL_OBJECT__); - var __next__34; - __next__34 = __get__(__iterator__34, "next"); - while (( __iterator__34.index ) < __iterator__34.length) { - key = __next__34(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1182: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1182: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + var key,__iterator__38; + __iterator__38 = __get__(__get__(other, "__iter__", "no iterator - line 1248: for key in other:"), "__call__")([], __NULL_OBJECT__); + var __next__38; + __next__38 = __get__(__iterator__38, "next"); + while (( __iterator__38.index ) < __iterator__38.length) { + key = __next__38(); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1249: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1249: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2587,13 +2683,13 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key,__iterator__35; - __iterator__35 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1186: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__35; - __next__35 = __get__(__iterator__35, "next"); - while (( __iterator__35.index ) < __iterator__35.length) { - key = __next__35(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1187: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + var key,__iterator__39; + __iterator__39 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1253: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__39; + __next__39 = __get__(__iterator__39, "next"); + while (( __iterator__39.index ) < __iterator__39.length) { + key = __next__39(); + __get__(__get__(arr, "append", "missing attribute `append` - line 1254: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2638,7 +2734,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1197: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1264: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2774,10 +2870,10 @@ __dict_values = function(args, kwargs) { var self = __args__['self']; keys = Object.keys(self["$wrapped"]); out = []; - var __iter22 = keys; - if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } - for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { - var key = __iter22[ __idx22 ]; + var __iter26 = keys; + if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } + for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { + var key = __iter26[ __idx26 ]; out.push(self["$wrapped"][key]); } return out; @@ -2864,10 +2960,10 @@ set = function(args, kwargs) { } fallback = false; if (__test_if_true__(hashtable)) { - var __iter23 = a; - if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } - for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { - var b = __iter23[ __idx23 ]; + var __iter27 = a; + if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } + for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { + var b = __iter27[ __idx27 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[key] = b; @@ -2882,20 +2978,20 @@ set = function(args, kwargs) { } s = []; if (__test_if_true__(fallback)) { - var __iter24 = a; - if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } - for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { - var item = __iter24[ __idx24 ]; + var __iter28 = a; + if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } + for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { + var item = __iter28[ __idx28 ]; if (( s.indexOf(item) ) == -1) { s.push(item); } } } else { __sort_method(keys); - var __iter25 = keys; - if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } - for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { - var key = __iter25[ __idx25 ]; + var __iter29 = keys; + if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } + for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { + var key = __iter29[ __idx29 ]; s.push(hashtable[key]); } } @@ -2943,7 +3039,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1398: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1398: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1465: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1465: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -2967,7 +3063,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1422: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1489: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3002,7 +3098,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1430: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1497: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3028,7 +3124,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1440: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1440: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1507: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1507: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3067,7 +3163,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1459: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1459: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1526: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1526: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3138,13 +3234,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1484: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1484: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1551: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1551: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1489: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1556: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3204,7 +3300,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1517: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1584: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3223,13 +3319,13 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value,__iterator__40; - __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1521: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__40; - __next__40 = __get__(__iterator__40, "next"); - while (( __iterator__40.index ) < __iterator__40.length) { - value = __next__40(); - __get__(__get__(self, "append", "missing attribute `append` - line 1522: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + var value,__iterator__44; + __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1588: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__44; + __next__44 = __get__(__iterator__44, "next"); + while (( __iterator__44.index ) < __iterator__44.length) { + value = __next__44(); + __get__(__get__(self, "append", "missing attribute `append` - line 1589: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3271,7 +3367,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1534: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1601: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3289,9 +3385,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1538: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1605: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1539: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1606: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3428,17 +3524,17 @@ json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (f __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; - var __iter26 = threading.workers; - if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } - for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { - var b = __iter26[ __idx26 ]; + var __iter30 = threading.workers; + if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } + for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { + var b = __iter30[ __idx30 ]; other = b["worker"]; args = b["args"]; if (( other ) !== worker) { - var __iter27 = args; - if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } - for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { - var arg = __iter27[ __idx27 ]; + var __iter31 = args; + if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } + for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { + var arg = __iter31[ __idx31 ]; if (( arg ) === ob) { if (! (__contains__(a, other))) { a.append(other); @@ -3470,10 +3566,10 @@ __start_new_thread = function(f, args) { if (( event.data.type ) == "append") { a = args[event.data.argindex]; a.push(event.data.value); - var __iter28 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } - for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { - var other = __iter28[ __idx28 ]; + var __iter32 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter32 instanceof Array || typeof __iter32 == "string" || __is_typed_array(__iter32)) ) { __iter32 = __object_keys__(__iter32) } + for (var __idx32=0; __idx32 < __iter32.length; __idx32++) { + var other = __iter32[ __idx32 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); } } else { @@ -3485,10 +3581,10 @@ __start_new_thread = function(f, args) { } else { a[event.data.index] = value; } - var __iter29 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } - for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { - var other = __iter29[ __idx29 ]; + var __iter33 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter33 instanceof Array || typeof __iter33 == "string" || __is_typed_array(__iter33)) ) { __iter33 = __object_keys__(__iter33) } + for (var __idx33=0; __idx33 < __iter33.length; __idx33++) { + var other = __iter33[ __idx33 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); } } else { @@ -3503,10 +3599,10 @@ __start_new_thread = function(f, args) { jsargs = []; var i; i = 0; - var __iter30 = args; - if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } - for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { - var arg = __iter30[ __idx30 ]; + var __iter34 = args; + if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34)) ) { __iter34 = __object_keys__(__iter34) } + for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { + var arg = __iter34[ __idx34 ]; if (__test_if_true__(arg.jsify)) { jsargs.append(arg.jsify()); } else { diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 6176da0..13ec56d 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -105,6 +105,7 @@ def visit_Module(self, node): lines.append('}) //end requirejs define') if self._has_glsl: + #header.append( 'var __shader_header__ = ["struct MyStruct { float xxx; }; const MyStruct XX = MyStruct(1.1); MyStruct myarr[2]; myarr[0]= MyStruct(1.1);"]' ) header.append( 'var __shader_header__ = []' ) lines = header + lines @@ -345,8 +346,8 @@ def _visit_function(self, node): #lines.extend( insert ) lines.append(' var __webclgl = new WebCLGL()') - lines.append(' var header = "\\n".join(__shader_header__)') - lines.append(' var shader = "\\n".join(glsljit.shader)') + lines.append(' var header = glsljit.compile_header()') + lines.append(' var shader = glsljit.compile_main()') lines.append(' console.log(shader)') ## create the webCLGL kernel, compiles GLSL source lines.append(' var __kernel = __webclgl.createKernel( shader, header );') @@ -900,17 +901,39 @@ def visit_For(self, node): if self._glsl: target = self.visit(node.target) - if isinstance(node.iter, ast.Call): ## `for i in range(n):` + if isinstance(node.iter, ast.Call) and isinstance(node.iter.func, ast.Name) and node.iter.func.id=='iter': ## `for i in iter(n):` + assert isinstance(node.iter.args[0], ast.Name) + iter = node.iter.args[0].id + self._typed_vars[target] = 'struct*' ## this fixes attributes on structs + + lines = [ + '`@var __length__ = %s.length;`' %iter, + #'`@var __struct_name__ = %s[0].__struct_name__;`' %iter + '`@var __struct_name__ = glsljit.define_structure(%s[0]);`' %iter + ] + + lines.append('for (int _iter=0; _iter < `__length__`; _iter++) {' ) + + ## declare struct variable ## + lines.append( '`__struct_name__` %s;' %target) + + ## at runtime loop over subarray, for each index inline into the shader's for-loop an if test, + lines.append( '`@for (var __j=0; __j<__length__; __j++) {`') + lines.append( '`@glsljit.push("if (_iter==" +__j+ ") { %s=%s_" +__j+ ";}");`' %(target, iter)) + lines.append( '`@}`') + + + elif isinstance(node.iter, ast.Call): ## `for i in range(n):` iter = self.visit(node.iter.args[0]) lines = ['for (int %s=0; %s < %s; %s++) {' %(target, target, iter, target)] elif isinstance(node.iter, ast.Name): ## `for subarray in arrayofarrays:` ## capture the length of the subarray into the current javascript scope ## this is required to inline the lengths as constants into the GLSL for loops - lines.append( '`@var __length__ = %s[0].length;`' %node.iter.id) + lines = ['`@var __length__ = %s[0].length;`' %node.iter.id] ## start the GLSL for loop - `__length__` is set above ## - lines = ['for (int _iter=0; _iter < `__length__`; _iter++) {' ] + lines.append('for (int _iter=0; _iter < `__length__`; _iter++) {' ) - ## declare array with size ## + ## declare subarray with size ## lines.append( 'float %s[`__length__`];' %target) ## at runtime loop over subarray, for each index inline into the shader's for-loop an if test, diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 69c7de0..16f48ad 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -24,10 +24,71 @@ def __init__(self, header): self.header = header self.shader = [] self.object_packagers = [] + self.struct_types = {} + + def compile_header(self): + a = "\n".join(self.header) + b = [] + for stype in self.struct_types.values(): + b.push( stype['code'] ) + b = '\n'.join(b) + return '\n'.join([a,b]) + + def compile_main(self): + return '\n'.join(self.shader) def push(self, s): self.shader.push(s) + + def define_structure(self, ob): + arrays = [] + numbers = [] + struct_type = [] + for key in ob.keys(): + t = typeof( ob[key] ) + if t=='object' and instanceof(ob[key], Array): + struct_type.push( 'A'+key+'_' ) + arrays.push(key) + elif t=='number': + struct_type.push( 'N'+key+'_') + numbers.push(key) + + struct_name = ''.join( struct_type ) + ob.__struct_name__ = struct_name + if struct_name not in self.struct_types: + member_list = [] + for key in numbers: + member_list.append('float '+key+';') + + members = ','.join(member_list) + code = 'struct ' +struct_name+ ' {' +members+ '};' + self.struct_types[ struct_name ] = { + 'arrays' : arrays, + 'numbers': numbers, + 'code' : code + } + + return struct_name + + def structure(self, ob, name): + wrapper = None + if instanceof(ob, Object): + pass + elif ob.__class__ is dict: + wrapper = ob + ob = ob[...] + + sname = self.define_structure(ob) + if wrapper: + wrapper.__struct_name__ = sname + stype = self.struct_types[ sname ] + args = [] + for key in stype['numbers']: + args.push( ob[key] ) + args = ','.join(args) + self.shader.push( sname + ' ' +name+ '=' +sname+ '(' +args+ ');' ) + def int16array(self, ob, name): a = ['int ' + name + '[' + ob.length + ']'] i = 0 @@ -60,6 +121,12 @@ def array(self, ob, name): self.shader.push( ''.join(a) ) + elif instanceof(ob[0], Object) or ob[0].__class__ is dict: + i = 0 + while i < ob.length: + self.structure( ob[i], name+'_'+i) + i += 1 + else: a = ['float ' + name + '[' + ob.length + ']'] i = 0 diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 9b9e74e..4902ca9 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -1,7 +1,7 @@ types = ['str', 'list', 'dict'] -glsl_types = ['int*', 'float*', 'vec2', 'vec3', 'vec4'] -glsl_aliases = ['floatPOINTER', 'intPOINTER'] +glsl_types = ['struct*', 'int*', 'float*', 'vec2', 'vec3', 'vec4'] +glsl_aliases = ['floatPOINTER', 'intPOINTER', 'structPOINTER'] types.extend( glsl_types ) types.extend( glsl_aliases ) diff --git a/regtests/webclgl/array_of_struct.py b/regtests/webclgl/array_of_struct.py new file mode 100644 index 0000000..37cae31 --- /dev/null +++ b/regtests/webclgl/array_of_struct.py @@ -0,0 +1,25 @@ +class myclass: + def __init__(self, s): + self.s = s + def my_method(self): + return self.s + + def run(self, w): + self.array = [ {'myattr':1.1} for x in range(w) ] + + @returns( array=64 ) + @gpu.main + def gpufunc(): + struct* structs = self.array + float b = self.my_method() + + for structure in iter(structs): + b += structure.myattr + return b + + return gpufunc() + +def main(): + m = myclass( 0.1 ) + r = m.run(8) + print(r) \ No newline at end of file From e1c8271f8f49d05669faa0c281f9c4b2f3c408c9 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 23 Jun 2014 06:36:25 -0700 Subject: [PATCH 070/222] glsljit: fixed array of structs. --- pythonjs/pythonjs.js | 92 +++++++++++++++-------------- pythonjs/pythonjs.py | 14 +++-- pythonjs/runtime/builtins.py | 14 +++-- regtests/webclgl/array_of_struct.py | 36 +++++++---- 4 files changed, 94 insertions(+), 62 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 87718ed..c102e32 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -596,11 +596,11 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { var key = __iter2[ __idx2 ]; t = typeof(ob[key]); if (__test_if_true__(( t ) == "object" && ob[key] instanceof Array)) { - struct_type.push((("A" + key) + "_")); + struct_type.push(("ARY_" + key)); arrays.push(key); } else { if (( t ) == "number") { - struct_type.push((("N" + key) + "_")); + struct_type.push(("NUM_" + key)); numbers.push(key); } } @@ -615,8 +615,10 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { var key = __iter3[ __idx3 ]; member_list.append((("float " + key) + ";")); } - members = ",".join(member_list); + members = "".join(member_list); code = (((("struct " + struct_name) + " {") + members) + "};"); + console.log("new struct type"); + console.log(code); this.struct_types[struct_name] = __jsdict([["arrays", arrays], ["numbers", numbers], ["code", code]]); } return struct_name; @@ -659,7 +661,7 @@ GLSLJITRuntime.prototype.push = function(s) { GLSLJITRuntime.push = function () { return GLSLJITRuntime.prototype.push.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.structure = function(ob, name) { - var stype,args,sname,wrapper; + var sname,args,wrapper,value,stype; wrapper = null; if (__test_if_true__(ob instanceof Object)) { /*pass*/ @@ -679,7 +681,11 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { var key = __iter5[ __idx5 ]; - args.push(ob[key]); + value = (ob[key] + ""); + if (! (__contains__(value, "."))) { + value += ".0"; + } + args.push(value); } args = ",".join(args); this.shader.push((((((((sname + " ") + name) + "=") + sname) + "(") + args) + ");")); @@ -1378,8 +1384,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 577: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 578: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 581: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 582: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2128,7 +2134,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__30; - __iterator__30 = __get__(__get__(arr, "__iter__", "no iterator - line 1061: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__30 = __get__(__get__(arr, "__iter__", "no iterator - line 1065: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__30; __next__30 = __get__(__iterator__30, "next"); while (( __iterator__30.index ) < __iterator__30.length) { @@ -2168,7 +2174,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1081: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1085: return ob.__len__()"), "__call__")(); } } } @@ -2188,7 +2194,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1085: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1089: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2207,7 +2213,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__31; - __iterator__31 = __get__(__get__(objs, "__iter__", "no iterator - line 1090: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__31 = __get__(__get__(objs, "__iter__", "no iterator - line 1094: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__31; __next__31 = __get__(__iterator__31, "next"); while (( __iterator__31.index ) < __iterator__31.length) { @@ -2234,7 +2240,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__32; - __iterator__32 = __get__(__get__(objs, "__iter__", "no iterator - line 1098: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__32 = __get__(__get__(objs, "__iter__", "no iterator - line 1102: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__32; __next__32 = __get__(__iterator__32, "next"); while (( __iterator__32.index ) < __iterator__32.length) { @@ -2261,7 +2267,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__33; - __iterator__33 = __get__(__get__(lst, "__iter__", "no iterator - line 1107: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__33 = __get__(__get__(lst, "__iter__", "no iterator - line 1111: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__33; __next__33 = __get__(__iterator__33, "next"); while (( __iterator__33.index ) < __iterator__33.length) { @@ -2292,7 +2298,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__34; - __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1114: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1118: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__34; __next__34 = __get__(__iterator__34, "next"); while (( __iterator__34.index ) < __iterator__34.length) { @@ -2406,7 +2412,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1149: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1153: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2517,27 +2523,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__35; - __iterator__35 = __get__(__get__(ob, "__iter__", "no iterator - line 1204: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__35 = __get__(__get__(ob, "__iter__", "no iterator - line 1208: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__35; __next__35 = __get__(__iterator__35, "next"); while (( __iterator__35.index ) < __iterator__35.length) { o = __next__35(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1206: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1206: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1206: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1210: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1210: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1210: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1208: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1208: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1208: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1212: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1212: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1212: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__36; - __iterator__36 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1210: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__36 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1214: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__36; __next__36 = __get__(__iterator__36, "next"); while (( __iterator__36.index ) < __iterator__36.length) { key = __next__36(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1211: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1212: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1215: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1216: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2564,15 +2570,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__37; - __iterator__37 = __get__(__get__(keys, "__iter__", "no iterator - line 1220: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__37 = __get__(__get__(keys, "__iter__", "no iterator - line 1224: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__37; __next__37 = __get__(__iterator__37, "next"); while (( __iterator__37.index ) < __iterator__37.length) { key = __next__37(); - value = __get__(self["$wrapped"], "__getitem__", "line 1221: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1225: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1224: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1228: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2634,7 +2640,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1240: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1244: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2659,12 +2665,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__38; - __iterator__38 = __get__(__get__(other, "__iter__", "no iterator - line 1248: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__38 = __get__(__get__(other, "__iter__", "no iterator - line 1252: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__38; __next__38 = __get__(__iterator__38, "next"); while (( __iterator__38.index ) < __iterator__38.length) { key = __next__38(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1249: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1249: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1253: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1253: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2684,12 +2690,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__39; - __iterator__39 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1253: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__39 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1257: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__39; __next__39 = __get__(__iterator__39, "next"); while (( __iterator__39.index ) < __iterator__39.length) { key = __next__39(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1254: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1258: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2734,7 +2740,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1264: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1268: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -3039,7 +3045,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1465: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1465: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1469: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1469: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3063,7 +3069,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1489: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1493: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3098,7 +3104,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1497: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1501: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3124,7 +3130,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1507: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1507: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1511: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1511: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3163,7 +3169,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1526: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1526: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1530: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1530: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3234,13 +3240,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1551: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1551: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1555: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1555: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1556: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1560: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3300,7 +3306,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1584: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1588: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3320,12 +3326,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__44; - __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1588: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1592: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { value = __next__44(); - __get__(__get__(self, "append", "missing attribute `append` - line 1589: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1593: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3367,7 +3373,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1601: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1605: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3385,9 +3391,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1605: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1609: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1606: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1610: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 13ec56d..09b9fdc 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -309,7 +309,10 @@ def _visit_function(self, node): elif chk.startswith('@'): ## special inline javascript. lines.append( chk[1:] ) else: - sub.append(' + %s' %chk) + if sub: + sub.append(' + %s' %chk) + else: + sub.append(chk) if sub: lines.append( 'glsljit.push(%s);' %''.join(sub)) @@ -341,7 +344,7 @@ def _visit_function(self, node): else: lines.append('function %s( __offset ) {' %glsl_wrapper_name ) - lines.append(' __offset = __offset || 1024*512') ## note by default: 0 allows 0-1.0 ## TODO this needs to be set per-buffer + lines.append(' __offset = __offset || 1024') ## note by default: 0 allows 0-1.0 ## TODO this needs to be set per-buffer #lines.extend( insert ) @@ -908,8 +911,11 @@ def visit_For(self, node): lines = [ '`@var __length__ = %s.length;`' %iter, - #'`@var __struct_name__ = %s[0].__struct_name__;`' %iter - '`@var __struct_name__ = glsljit.define_structure(%s[0]);`' %iter + #'`@console.log("DEBUG iter: "+%s);`' %iter, + #'`@console.log("DEBUG first item: "+%s[0]);`' %iter, + '`@var __struct_name__ = %s[0].__struct_name__;`' %iter + ##same as above - slower ##'`@var __struct_name__ = glsljit.define_structure(%s[0]);`' %iter, + #'`@console.log("DEBUG sname: "+__struct_name__);`', ] lines.append('for (int _iter=0; _iter < `__length__`; _iter++) {' ) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 16f48ad..5bb18a1 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -48,10 +48,10 @@ def define_structure(self, ob): for key in ob.keys(): t = typeof( ob[key] ) if t=='object' and instanceof(ob[key], Array): - struct_type.push( 'A'+key+'_' ) + struct_type.push( 'ARY_'+key ) arrays.push(key) elif t=='number': - struct_type.push( 'N'+key+'_') + struct_type.push( 'NUM_'+key) numbers.push(key) struct_name = ''.join( struct_type ) @@ -61,14 +61,15 @@ def define_structure(self, ob): for key in numbers: member_list.append('float '+key+';') - members = ','.join(member_list) + members = ''.join(member_list) code = 'struct ' +struct_name+ ' {' +members+ '};' + print('new struct type') + print(code) self.struct_types[ struct_name ] = { 'arrays' : arrays, 'numbers': numbers, 'code' : code } - return struct_name def structure(self, ob, name): @@ -85,7 +86,10 @@ def structure(self, ob, name): stype = self.struct_types[ sname ] args = [] for key in stype['numbers']: - args.push( ob[key] ) + value = ob[key] + '' + if '.' not in value: + value += '.0' + args.push( value ) args = ','.join(args) self.shader.push( sname + ' ' +name+ '=' +sname+ '(' +args+ ');' ) diff --git a/regtests/webclgl/array_of_struct.py b/regtests/webclgl/array_of_struct.py index 37cae31..ff4a18c 100644 --- a/regtests/webclgl/array_of_struct.py +++ b/regtests/webclgl/array_of_struct.py @@ -1,25 +1,41 @@ +'''array of structs''' +from random import random + class myclass: - def __init__(self, s): - self.s = s - def my_method(self): - return self.s + def __init__(self, a): self.a = a + def my_method(self): return self.a + + def new_struct(self, g): + return { + 'attr1' : 0.6 + g, + 'attr2' : 0.4 + g + } + def run(self, w): - self.array = [ {'myattr':1.1} for x in range(w) ] + self.array = [ self.new_struct( x ) for x in range(w) ] @returns( array=64 ) @gpu.main def gpufunc(): - struct* structs = self.array + struct* A = self.array float b = self.my_method() - for structure in iter(structs): - b += structure.myattr + for s in iter(A): + b += s.attr1 + s.attr2 return b return gpufunc() def main(): - m = myclass( 0.1 ) + f = 0.1234 + m = myclass( f ) r = m.run(8) - print(r) \ No newline at end of file + print(r) + t = round(r[0]-64.0, 4) + print(t) + f = round(f, 4) + print(f) + ok = f==t + print('test passed: %s' %ok ) + #TestError( f==t ) \ No newline at end of file From 1ece051ed1fcf196da9ff608b6e4693715d1e53f Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 23 Jun 2014 16:05:37 -0700 Subject: [PATCH 071/222] glsljit: array of structs with member arrays. --- doc/gpu.md | 36 +- pythonjs/pythonjs.js | 462 +++++++++--------- pythonjs/pythonjs.py | 10 +- pythonjs/runtime/builtins.py | 20 +- .../webclgl/array_of_structs_with_array.py | 38 ++ 5 files changed, 339 insertions(+), 227 deletions(-) create mode 100644 regtests/webclgl/array_of_structs_with_array.py diff --git a/doc/gpu.md b/doc/gpu.md index c8ee94d..caaa9f7 100644 --- a/doc/gpu.md +++ b/doc/gpu.md @@ -9,10 +9,11 @@ micro language: . GLSL standard types . basic math ops and logic: if, elif, else, for i in range(n) . list of lists iteration with dynamic size + . iterate over list of structs (dicts) . define GPU `main` function with input arguments and subroutines . `gpu.main` can take arguments typed as: int, float, and float* - . `gpu.main` returns an list of floats or vec4 + . `gpu.main` returns a list of floats or vec4s . stream input variables into shader from attributes or method calls: . attribute: `float gpu_variable = self.cpu_variable` @@ -229,6 +230,39 @@ class myclass: ``` +list of dicts +--------------- +Use the for-iter loop to iterate over a list of dicts `for s in iter(A):` +Regular JavaScript objects and Python dicts are uploaded to the shader as GLSL structs. +The struct type name and GLSL code are generated at runtime based on the contents of +each dict. A struct may contain: floats and array of floats attributes. + +``` +class myclass: + + def new_struct(self, g): + return { + 'attr1' : 0.6 + g, + 'attr2' : 0.4 + g + } + + + def run(self, w): + self.array = [ self.new_struct( x ) for x in range(w) ] + + @returns( array=64 ) + @gpu.main + def gpufunc(): + struct* A = self.array + float b = 0.0 + for s in iter(A): + b += s.attr1 + s.attr2 + return b + + return gpufunc() + +``` + external method calls --------------------- Methods on external objects can be called within the shader function. diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index c102e32..50fc444 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -552,10 +552,10 @@ GLSLJITRuntime.prototype.array = function(ob, name) { i += 1; } } else { - a = [(((("float " + name) + "[") + ob.length) + "]")]; + a = [(((("float " + name) + "[") + ob.length) + "];")]; i = 0; while (( i ) < ob.length) { - a.push((((((";" + name) + "[") + i) + "]=") + ob[i])); + a.push((((((name + "[") + i) + "]=") + ob[i]) + ";")); i += 1; } this.shader.push("".join(a)); @@ -586,7 +586,10 @@ GLSLJITRuntime.prototype.compile_main = function() { GLSLJITRuntime.compile_main = function () { return GLSLJITRuntime.prototype.compile_main.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.define_structure = function(ob) { - var code,arrays,struct_type,member_list,struct_name,t,members,numbers; + var arr,code,arrays,struct_type,member_list,struct_name,t,members,numbers; + if (__test_if_true__(Object.hasOwnProperty(ob, "__struct_name__"))) { + return ob.__struct_name__; + } arrays = []; numbers = []; struct_type = []; @@ -595,7 +598,7 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { var key = __iter2[ __idx2 ]; t = typeof(ob[key]); - if (__test_if_true__(( t ) == "object" && ob[key] instanceof Array)) { + if (__test_if_true__(( t ) == "object" && ob[key] instanceof Array && ob[key].length && ( typeof(ob[key][0]) ) == "number")) { struct_type.push(("ARY_" + key)); arrays.push(key); } else { @@ -614,6 +617,13 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { var key = __iter3[ __idx3 ]; member_list.append((("float " + key) + ";")); + } + var __iter4 = arrays; + if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } + for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { + var key = __iter4[ __idx4 ]; + arr = ob[key]; + member_list.append((((("float " + key) + "[") + arr.length) + "];")); } members = "".join(member_list); code = (((("struct " + struct_name) + " {") + members) + "};"); @@ -639,10 +649,10 @@ GLSLJITRuntime.prototype.int16array = function(ob, name) { GLSLJITRuntime.int16array = function () { return GLSLJITRuntime.prototype.int16array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.object = function(ob, name) { var func,cls; - var __iter4 = this.object_packagers; - if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } - for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { - var p = __iter4[ __idx4 ]; + var __iter5 = this.object_packagers; + if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } + for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { + var p = __iter5[ __idx5 ]; var __r_0; __r_0 = p; cls = __r_0[0]; @@ -661,7 +671,7 @@ GLSLJITRuntime.prototype.push = function(s) { GLSLJITRuntime.push = function () { return GLSLJITRuntime.prototype.push.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.structure = function(ob, name) { - var sname,args,wrapper,value,stype; + var sname,args,wrapper,value,aname,stype; wrapper = null; if (__test_if_true__(ob instanceof Object)) { /*pass*/ @@ -677,15 +687,23 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { } stype = this.struct_types[sname]; args = []; - var __iter5 = stype["numbers"]; - if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } - for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { - var key = __iter5[ __idx5 ]; + var __iter6 = stype["numbers"]; + if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } + for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { + var key = __iter6[ __idx6 ]; value = (ob[key] + ""); if (! (__contains__(value, "."))) { value += ".0"; } args.push(value); + } + var __iter7 = stype["arrays"]; + if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } + for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { + var key = __iter7[ __idx7 ]; + aname = (("_" + key) + name); + this.array(ob[key], aname); + args.push(aname); } args = ",".join(args); this.shader.push((((((((sname + " ") + name) + "=") + sname) + "(") + args) + ");")); @@ -703,10 +721,10 @@ GLSLJITRuntime.prototype.unpack_array2d = function(arr, dims) { h = __r_1[1]; row = []; rows = [row]; - var __iter6 = arr; - if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } - for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { - var value = __iter6[ __idx6 ]; + var __iter8 = arr; + if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } + for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { + var value = __iter8[ __idx8 ]; row.append(value); if (( row.length ) >= w) { row = []; @@ -885,10 +903,10 @@ __contains__ = function(ob, a) { throw new TypeError; } else { if (__test_if_true__(__is_typed_array(ob))) { - var __iter7 = ob; - if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } - for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { - var x = __iter7[ __idx7 ]; + var __iter9 = ob; + if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } + for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { + var x = __iter9[ __idx9 ]; if (( x ) == a) { return true; } @@ -971,10 +989,10 @@ __mul_op = function(a, b) { __jsdict = function(items) { var d,key; d = {}; - var __iter8 = items; - if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } - for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { - var item = __iter8[ __idx8 ]; + var __iter10 = items; + if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } + for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { + var item = __iter10[ __idx10 ]; key = item[0]; if (__test_if_true__(key.__uid__)) { key = key.__uid__; @@ -1022,10 +1040,10 @@ __jsdict_values = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object)) { arr = []; - var __iter9 = ob; - if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } - for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { - var key = __iter9[ __idx9 ]; + var __iter11 = ob; + if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } + for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { + var key = __iter11[ __idx11 ]; if (__test_if_true__(ob.hasOwnProperty(key))) { value = ob[key]; arr.push(value); @@ -1041,10 +1059,10 @@ __jsdict_items = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; - var __iter10 = ob; - if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } - for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { - var key = __iter10[ __idx10 ]; + var __iter12 = ob; + if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } + for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { + var key = __iter12[ __idx12 ]; if (__test_if_true__(Object.hasOwnProperty.call(ob, key))) { value = ob[key]; arr.push([key, value]); @@ -1101,10 +1119,10 @@ __object_keys__ = function(ob) { __bind_property_descriptors__ = function(o, klass) { var prop,desc; - var __iter11 = klass.__properties__; - if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } - for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { - var name = __iter11[ __idx11 ]; + var __iter13 = klass.__properties__; + if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } + for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { + var name = __iter13[ __idx13 ]; desc = __jsdict([["enumerable", true]]); prop = klass.__properties__[name]; if (__test_if_true__(prop["get"])) { @@ -1115,10 +1133,10 @@ __bind_property_descriptors__ = function(o, klass) { } Object.defineProperty(o, name, desc); } - var __iter12 = klass.__bases__; - if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } - for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { - var base = __iter12[ __idx12 ]; + var __iter14 = klass.__bases__; + if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } + for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { + var base = __iter14[ __idx14 ]; __bind_property_descriptors__(o, base); } } @@ -1150,10 +1168,10 @@ __sprintf = function(fmt, args) { arr = []; var i; i = 0; - var __iter13 = chunks; - if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } - for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { - var txt = __iter13[ __idx13 ]; + var __iter15 = chunks; + if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } + for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { + var txt = __iter15[ __idx15 ]; arr.append(txt); if (( i ) >= args.length) { break; @@ -1186,10 +1204,10 @@ __create_class__ = function(class_name, parents, attrs, props) { klass.__all_method_names__ = []; klass.__properties__ = props; klass.__attributes__ = attrs; - var __iter14 = attrs; - if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } - for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { - var key = __iter14[ __idx14 ]; + var __iter16 = attrs; + if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } + for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { + var key = __iter16[ __idx16 ]; if (( typeof(attrs[key]) ) == "function") { klass.__all_method_names__.push(key); f = attrs[key]; @@ -1210,20 +1228,20 @@ __create_class__ = function(class_name, parents, attrs, props) { } klass.__setters__ = []; klass.__getters__ = []; - var __iter15 = klass.__properties__; - if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } - for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { - var name = __iter15[ __idx15 ]; + var __iter17 = klass.__properties__; + if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } + for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { + var name = __iter17[ __idx17 ]; prop = klass.__properties__[name]; klass.__getters__.push(name); if (__test_if_true__(prop["set"])) { klass.__setters__.push(name); } } - var __iter16 = klass.__bases__; - if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } - for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { - var base = __iter16[ __idx16 ]; + var __iter18 = klass.__bases__; + if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } + for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { + var base = __iter18[ __idx18 ]; Array.prototype.push.apply(klass.__getters__, base.__getters__); Array.prototype.push.apply(klass.__setters__, base.__setters__); Array.prototype.push.apply(klass.__all_method_names__, base.__all_method_names__); @@ -1236,10 +1254,10 @@ __create_class__ = function(class_name, parents, attrs, props) { object.__dict__ = object; has_getattribute = false; has_getattr = false; - var __iter17 = klass.__all_method_names__; - if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } - for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { - var name = __iter17[ __idx17 ]; + var __iter19 = klass.__all_method_names__; + if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } + for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { + var name = __iter19[ __idx19 ]; if (( name ) == "__getattribute__") { has_getattribute = true; } else { @@ -1384,8 +1402,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 581: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 582: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 593: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 594: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1607,10 +1625,10 @@ _setup_str_prototype = function(args, kwargs) { arr = a["$wrapped"]; } i = 0; - var __iter18 = arr; - if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } - for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { - var value = __iter18[ __idx18 ]; + var __iter20 = arr; + if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } + for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { + var value = __iter20[ __idx20 ]; out += value; i += 1; if (( i ) < arr.length) { @@ -1652,10 +1670,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; - var __iter19 = this; - if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } - for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { - var char = __iter19[ __idx19 ]; + var __iter21 = this; + if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } + for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { + var char = __iter21[ __idx21 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1669,10 +1687,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."]; - var __iter20 = this; - if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } - for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { - var char = __iter20[ __idx20 ]; + var __iter22 = this; + if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } + for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { + var char = __iter22[ __idx22 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1699,10 +1717,10 @@ _setup_str_prototype = function(args, kwargs) { var keys,r; r = this; keys = Object.keys(fmt); - var __iter21 = keys; - if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } - for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { - var key = __iter21[ __idx21 ]; + var __iter23 = keys; + if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } + for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { + var key = __iter23[ __idx23 ]; r = r.split(key).join(fmt[key]); } r = r.split("{").join("").split("}").join(""); @@ -1849,10 +1867,10 @@ _setup_array_prototype = function(args, kwargs) { stop = this.length; } arr = [start, (stop - start)]; - var __iter22 = items; - if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } - for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { - var item = __iter22[ __idx22 ]; + var __iter24 = items; + if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } + for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { + var item = __iter24[ __idx24 ]; arr.push(item); } this.splice.apply(this, arr); @@ -1868,10 +1886,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); var extend = function(other) { - var __iter23 = other; - if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } - for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { - var obj = __iter23[ __idx23 ]; + var __iter25 = other; + if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } + for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { + var obj = __iter25[ __idx25 ]; this.push(obj); } return this; @@ -1903,10 +1921,10 @@ _setup_array_prototype = function(args, kwargs) { var count = function(obj) { var a; a = 0; - var __iter24 = this; - if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } - for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { - var item = __iter24[ __idx24 ]; + var __iter26 = this; + if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } + for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { + var item = __iter26[ __idx26 ]; if (( item ) === obj) { a += 1; } @@ -1962,10 +1980,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { - var __iter25 = this; - if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } - for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { - var item = __iter25[ __idx25 ]; + var __iter27 = this; + if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } + for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { + var item = __iter27[ __idx27 ]; if (( other.indexOf(item) ) == -1) { return false; } @@ -2133,12 +2151,12 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b,__iterator__30; - __iterator__30 = __get__(__get__(arr, "__iter__", "no iterator - line 1065: for b in arr:"), "__call__")([], __NULL_OBJECT__); - var __next__30; - __next__30 = __get__(__iterator__30, "next"); - while (( __iterator__30.index ) < __iterator__30.length) { - b = __next__30(); + var b,__iterator__32; + __iterator__32 = __get__(__get__(arr, "__iter__", "no iterator - line 1077: for b in arr:"), "__call__")([], __NULL_OBJECT__); + var __next__32; + __next__32 = __get__(__iterator__32, "next"); + while (( __iterator__32.index ) < __iterator__32.length) { + b = __next__32(); a += b; } return a; @@ -2174,7 +2192,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1085: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1097: return ob.__len__()"), "__call__")(); } } } @@ -2194,7 +2212,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1089: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1101: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2212,12 +2230,12 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__31; - __iterator__31 = __get__(__get__(objs, "__iter__", "no iterator - line 1094: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__31; - __next__31 = __get__(__iterator__31, "next"); - while (( __iterator__31.index ) < __iterator__31.length) { - ob = __next__31(); + var ob,__iterator__33; + __iterator__33 = __get__(__get__(objs, "__iter__", "no iterator - line 1106: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__33; + __next__33 = __get__(__iterator__33, "next"); + while (( __iterator__33.index ) < __iterator__33.length) { + ob = __next__33(); v = __get__(func, "__call__")([ob], __NULL_OBJECT__); arr.push(v); } @@ -2239,12 +2257,12 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__32; - __iterator__32 = __get__(__get__(objs, "__iter__", "no iterator - line 1102: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__32; - __next__32 = __get__(__iterator__32, "next"); - while (( __iterator__32.index ) < __iterator__32.length) { - ob = __next__32(); + var ob,__iterator__34; + __iterator__34 = __get__(__get__(objs, "__iter__", "no iterator - line 1114: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__34; + __next__34 = __get__(__iterator__34, "next"); + while (( __iterator__34.index ) < __iterator__34.length) { + ob = __next__34(); if (__test_if_true__(__get__(func, "__call__")([ob], __NULL_OBJECT__))) { arr.push(ob); } @@ -2266,12 +2284,12 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__33; - __iterator__33 = __get__(__get__(lst, "__iter__", "no iterator - line 1111: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__33; - __next__33 = __get__(__iterator__33, "next"); - while (( __iterator__33.index ) < __iterator__33.length) { - value = __next__33(); + var value,__iterator__35; + __iterator__35 = __get__(__get__(lst, "__iter__", "no iterator - line 1123: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__35; + __next__35 = __get__(__iterator__35, "next"); + while (( __iterator__35.index ) < __iterator__35.length) { + value = __next__35(); if (( a ) === null) { a = value; } else { @@ -2297,12 +2315,12 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__34; - __iterator__34 = __get__(__get__(lst, "__iter__", "no iterator - line 1118: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__34; - __next__34 = __get__(__iterator__34, "next"); - while (( __iterator__34.index ) < __iterator__34.length) { - value = __next__34(); + var value,__iterator__36; + __iterator__36 = __get__(__get__(lst, "__iter__", "no iterator - line 1130: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__36; + __next__36 = __get__(__iterator__36, "next"); + while (( __iterator__36.index ) < __iterator__36.length) { + value = __next__36(); if (( a ) === null) { a = value; } else { @@ -2412,7 +2430,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1153: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1165: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2522,28 +2540,28 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o,__iterator__35; - __iterator__35 = __get__(__get__(ob, "__iter__", "no iterator - line 1208: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__35; - __next__35 = __get__(__iterator__35, "next"); - while (( __iterator__35.index ) < __iterator__35.length) { - o = __next__35(); + var o,__iterator__37; + __iterator__37 = __get__(__get__(ob, "__iter__", "no iterator - line 1220: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__37; + __next__37 = __get__(__iterator__37, "next"); + while (( __iterator__37.index ) < __iterator__37.length) { + o = __next__37(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1210: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1210: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1210: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1222: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1222: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1222: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1212: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1212: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1212: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1224: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1224: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1224: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key,__iterator__36; - __iterator__36 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1214: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__36; - __next__36 = __get__(__iterator__36, "next"); - while (( __iterator__36.index ) < __iterator__36.length) { - key = __next__36(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1215: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1216: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + var key,__iterator__38; + __iterator__38 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1226: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__38; + __next__38 = __get__(__iterator__38, "next"); + while (( __iterator__38.index ) < __iterator__38.length) { + key = __next__38(); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1227: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1228: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2569,16 +2587,16 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key,__iterator__37; - __iterator__37 = __get__(__get__(keys, "__iter__", "no iterator - line 1224: for key in keys:"), "__call__")([], __NULL_OBJECT__); - var __next__37; - __next__37 = __get__(__iterator__37, "next"); - while (( __iterator__37.index ) < __iterator__37.length) { - key = __next__37(); - value = __get__(self["$wrapped"], "__getitem__", "line 1225: value = self[...][key]")([key], __NULL_OBJECT__); + var key,__iterator__39; + __iterator__39 = __get__(__get__(keys, "__iter__", "no iterator - line 1236: for key in keys:"), "__call__")([], __NULL_OBJECT__); + var __next__39; + __next__39 = __get__(__iterator__39, "next"); + while (( __iterator__39.index ) < __iterator__39.length) { + key = __next__39(); + value = __get__(self["$wrapped"], "__getitem__", "line 1237: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1228: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1240: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2640,7 +2658,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1244: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1256: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2664,13 +2682,13 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key,__iterator__38; - __iterator__38 = __get__(__get__(other, "__iter__", "no iterator - line 1252: for key in other:"), "__call__")([], __NULL_OBJECT__); - var __next__38; - __next__38 = __get__(__iterator__38, "next"); - while (( __iterator__38.index ) < __iterator__38.length) { - key = __next__38(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1253: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1253: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + var key,__iterator__40; + __iterator__40 = __get__(__get__(other, "__iter__", "no iterator - line 1264: for key in other:"), "__call__")([], __NULL_OBJECT__); + var __next__40; + __next__40 = __get__(__iterator__40, "next"); + while (( __iterator__40.index ) < __iterator__40.length) { + key = __next__40(); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1265: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1265: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2689,13 +2707,13 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key,__iterator__39; - __iterator__39 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1257: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__39; - __next__39 = __get__(__iterator__39, "next"); - while (( __iterator__39.index ) < __iterator__39.length) { - key = __next__39(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1258: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + var key,__iterator__41; + __iterator__41 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1269: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__41; + __next__41 = __get__(__iterator__41, "next"); + while (( __iterator__41.index ) < __iterator__41.length) { + key = __next__41(); + __get__(__get__(arr, "append", "missing attribute `append` - line 1270: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2740,7 +2758,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1268: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1280: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2876,10 +2894,10 @@ __dict_values = function(args, kwargs) { var self = __args__['self']; keys = Object.keys(self["$wrapped"]); out = []; - var __iter26 = keys; - if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } - for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { - var key = __iter26[ __idx26 ]; + var __iter28 = keys; + if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } + for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { + var key = __iter28[ __idx28 ]; out.push(self["$wrapped"][key]); } return out; @@ -2966,10 +2984,10 @@ set = function(args, kwargs) { } fallback = false; if (__test_if_true__(hashtable)) { - var __iter27 = a; - if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } - for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { - var b = __iter27[ __idx27 ]; + var __iter29 = a; + if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } + for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { + var b = __iter29[ __idx29 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[key] = b; @@ -2984,20 +3002,20 @@ set = function(args, kwargs) { } s = []; if (__test_if_true__(fallback)) { - var __iter28 = a; - if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } - for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { - var item = __iter28[ __idx28 ]; + var __iter30 = a; + if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } + for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { + var item = __iter30[ __idx30 ]; if (( s.indexOf(item) ) == -1) { s.push(item); } } } else { __sort_method(keys); - var __iter29 = keys; - if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } - for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { - var key = __iter29[ __idx29 ]; + var __iter31 = keys; + if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } + for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { + var key = __iter31[ __idx31 ]; s.push(hashtable[key]); } } @@ -3045,7 +3063,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1469: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1469: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1481: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1481: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3069,7 +3087,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1493: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1505: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3104,7 +3122,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1501: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1513: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3130,7 +3148,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1511: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1511: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1523: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1523: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3169,7 +3187,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1530: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1530: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1542: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1542: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3240,13 +3258,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1555: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1555: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1567: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1567: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1560: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1572: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3306,7 +3324,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1588: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1600: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3325,13 +3343,13 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value,__iterator__44; - __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1592: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__44; - __next__44 = __get__(__iterator__44, "next"); - while (( __iterator__44.index ) < __iterator__44.length) { - value = __next__44(); - __get__(__get__(self, "append", "missing attribute `append` - line 1593: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + var value,__iterator__46; + __iterator__46 = __get__(__get__(lst, "__iter__", "no iterator - line 1604: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__46; + __next__46 = __get__(__iterator__46, "next"); + while (( __iterator__46.index ) < __iterator__46.length) { + value = __next__46(); + __get__(__get__(self, "append", "missing attribute `append` - line 1605: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3373,7 +3391,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1605: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1617: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3391,9 +3409,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1609: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1621: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1610: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1622: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3530,17 +3548,17 @@ json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (f __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; - var __iter30 = threading.workers; - if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } - for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { - var b = __iter30[ __idx30 ]; + var __iter32 = threading.workers; + if (! (__iter32 instanceof Array || typeof __iter32 == "string" || __is_typed_array(__iter32)) ) { __iter32 = __object_keys__(__iter32) } + for (var __idx32=0; __idx32 < __iter32.length; __idx32++) { + var b = __iter32[ __idx32 ]; other = b["worker"]; args = b["args"]; if (( other ) !== worker) { - var __iter31 = args; - if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } - for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { - var arg = __iter31[ __idx31 ]; + var __iter33 = args; + if (! (__iter33 instanceof Array || typeof __iter33 == "string" || __is_typed_array(__iter33)) ) { __iter33 = __object_keys__(__iter33) } + for (var __idx33=0; __idx33 < __iter33.length; __idx33++) { + var arg = __iter33[ __idx33 ]; if (( arg ) === ob) { if (! (__contains__(a, other))) { a.append(other); @@ -3572,10 +3590,10 @@ __start_new_thread = function(f, args) { if (( event.data.type ) == "append") { a = args[event.data.argindex]; a.push(event.data.value); - var __iter32 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter32 instanceof Array || typeof __iter32 == "string" || __is_typed_array(__iter32)) ) { __iter32 = __object_keys__(__iter32) } - for (var __idx32=0; __idx32 < __iter32.length; __idx32++) { - var other = __iter32[ __idx32 ]; + var __iter34 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34)) ) { __iter34 = __object_keys__(__iter34) } + for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { + var other = __iter34[ __idx34 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); } } else { @@ -3587,10 +3605,10 @@ __start_new_thread = function(f, args) { } else { a[event.data.index] = value; } - var __iter33 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter33 instanceof Array || typeof __iter33 == "string" || __is_typed_array(__iter33)) ) { __iter33 = __object_keys__(__iter33) } - for (var __idx33=0; __idx33 < __iter33.length; __idx33++) { - var other = __iter33[ __idx33 ]; + var __iter35 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35)) ) { __iter35 = __object_keys__(__iter35) } + for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { + var other = __iter35[ __idx35 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); } } else { @@ -3605,10 +3623,10 @@ __start_new_thread = function(f, args) { jsargs = []; var i; i = 0; - var __iter34 = args; - if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34)) ) { __iter34 = __object_keys__(__iter34) } - for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { - var arg = __iter34[ __idx34 ]; + var __iter36 = args; + if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36)) ) { __iter36 = __object_keys__(__iter36) } + for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { + var arg = __iter36[ __idx36 ]; if (__test_if_true__(arg.jsify)) { jsargs.append(arg.jsify()); } else { diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 09b9fdc..908e938 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -533,8 +533,10 @@ def _visit_call_helper_new(self, node): def visit_Call(self, node): name = self.visit(node.func) + if self._glsl and isinstance(node.func, ast.Attribute): return '`%s`' %self._visit_call_helper(node) + elif self._glsl and name == 'len': if isinstance(node.args[0], ast.Name): return '`%s.length`' %node.args[0].id @@ -543,6 +545,11 @@ def visit_Call(self, node): v = self.visit(s).replace('`', '') return '`%s.length`' %v + elif isinstance(node.args[0], ast.Attribute): ## assume struct array attribute + s = node.args[0] + v = self.visit(s).replace('`', '') + return '`%s.length`' %v + elif name == 'glsl_inline_push_js_assign': # '@' triggers a new line of generated code n = node.args[0].s @@ -913,9 +920,10 @@ def visit_For(self, node): '`@var __length__ = %s.length;`' %iter, #'`@console.log("DEBUG iter: "+%s);`' %iter, #'`@console.log("DEBUG first item: "+%s[0]);`' %iter, - '`@var __struct_name__ = %s[0].__struct_name__;`' %iter + '`@var __struct_name__ = %s[0].__struct_name__;`' %iter, ##same as above - slower ##'`@var __struct_name__ = glsljit.define_structure(%s[0]);`' %iter, #'`@console.log("DEBUG sname: "+__struct_name__);`', + '`@var %s = %s[0];`' %(target, iter) ## capture first item with target name so that for loops can get the length of member arrays ] lines.append('for (int _iter=0; _iter < `__length__`; _iter++) {' ) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 5bb18a1..340282e 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -42,12 +42,14 @@ def push(self, s): def define_structure(self, ob): + if Object.hasOwnProperty(ob,'__struct_name__'): + return ob.__struct_name__ arrays = [] numbers = [] struct_type = [] for key in ob.keys(): t = typeof( ob[key] ) - if t=='object' and instanceof(ob[key], Array): + if t=='object' and instanceof(ob[key], Array) and ob[key].length and typeof(ob[key][0])=='number': struct_type.push( 'ARY_'+key ) arrays.push(key) elif t=='number': @@ -60,6 +62,9 @@ def define_structure(self, ob): member_list = [] for key in numbers: member_list.append('float '+key+';') + for key in arrays: + arr = ob[key] + member_list.append('float '+key+'['+arr.length+'];') members = ''.join(member_list) code = 'struct ' +struct_name+ ' {' +members+ '};' @@ -90,6 +95,15 @@ def structure(self, ob, name): if '.' not in value: value += '.0' args.push( value ) + + for key in stype['arrays']: + #args.push( '{'+ob[key].toString()+ '}') ## this will not work + ## arrays need to be assigned to a local variable before passing + ## it to the struct constructor. + aname = '_'+key+name + self.array(ob[key], aname) + args.push( aname ) + args = ','.join(args) self.shader.push( sname + ' ' +name+ '=' +sname+ '(' +args+ ');' ) @@ -132,10 +146,10 @@ def array(self, ob, name): i += 1 else: - a = ['float ' + name + '[' + ob.length + ']'] + a = ['float ' + name + '[' + ob.length + '];'] i = 0 while i < ob.length: - a.push(';'+name+'['+i+']='+ob[i]) + a.push(name+'['+i+']='+ob[i] + ';') i += 1 self.shader.push( ''.join(a) ) diff --git a/regtests/webclgl/array_of_structs_with_array.py b/regtests/webclgl/array_of_structs_with_array.py new file mode 100644 index 0000000..e137d8a --- /dev/null +++ b/regtests/webclgl/array_of_structs_with_array.py @@ -0,0 +1,38 @@ +'''struct with array''' +from random import random + +class myclass: + + def new_struct(self, g): + return { + 'num' : g, + 'arr' : [0.1 for s in range(6)] + } + + + def run(self, w): + self.array = [ self.new_struct( x ) for x in range(w) ] + + @returns( array=64 ) + @gpu.main + def gpufunc(): + struct* A = self.array + float b = 0.0 + + for s in iter(A): + b += s.num + for i in range(len(s.arr)): + b += s.arr[i] + + ## note: assignment of a struct's array member to a variable is not allowed + #float* a = s.arr ## not allowed + + + return b + + return gpufunc() + +def main(): + m = myclass() + r = m.run(8) + print(r) From 026fe9db49470300b2eb2005fa961e6c89350358 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 24 Jun 2014 04:38:32 -0700 Subject: [PATCH 072/222] GPU class: @gpu.object class decorator allows its methods decorated with @gpu.method to be translated with the GLSL backend. In the @gpu.main function an list of MyObject can be iterated over and methods called. --- pythonjs/ast_utils.py | 8 ++- pythonjs/python_to_pythonjs.py | 109 ++++++++++++++++++++++++--------- pythonjs/pythonjs.js | 103 +++++++++++++++++-------------- pythonjs/pythonjs.py | 18 +++++- pythonjs/runtime/builtins.py | 29 ++++++--- regtests/run.py | 2 + regtests/webclgl/gpu_class.py | 50 +++++++++++++++ 7 files changed, 228 insertions(+), 91 deletions(-) create mode 100644 regtests/webclgl/gpu_class.py diff --git a/pythonjs/ast_utils.py b/pythonjs/ast_utils.py index 2b804d8..85b2308 100644 --- a/pythonjs/ast_utils.py +++ b/pythonjs/ast_utils.py @@ -64,9 +64,13 @@ def retrieve_vars(body): pass ## skips assignment to an attribute `a.x = y` if user_typedef: ## `int x` - if not isinstance(n.value, ast.Name): + if isinstance(n.value, ast.Name): + local_vars.add( '%s=%s' %(user_typedef, n.value.id)) + elif isinstance(n.value, ast.Num): + local_vars.add( '%s=%s' %(user_typedef, n.value.n)) + else: raise SyntaxError(n.value) - local_vars.add( '%s=%s' %(user_typedef, n.value.id)) + elif isinstance(n, ast.Global): global_vars.update( n.names ) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index c984c8a..f94d1be 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -807,22 +807,43 @@ def _visit_dart_classdef(self, node): writer.pull() + def is_gpu_method(self, n): + for dec in n.decorator_list: + if isinstance(dec, Attribute) and isinstance(dec.value, Name) and dec.value.id == 'gpu': + if dec.attr == 'method': + return True + + def _visit_js_classdef(self, node): name = node.name - log('JavaScript-ClassDef: %s'%name) self._js_classes[ name ] = node self._in_js_class = True + class_decorators = [] + gpu_object = False + + for decorator in node.decorator_list: ## class decorators + if isinstance(decorator, Attribute) and isinstance(decorator.value, Name) and decorator.value.id == 'gpu': + if decorator.attr == 'object': + gpu_object = True + else: + raise SyntaxError( self.format_error('invalid gpu class decorator') ) + else: + class_decorators.append( decorator ) methods = {} class_vars = [] + for item in node.body: if isinstance(item, FunctionDef): methods[ item.name ] = item - item.args.args = item.args.args[1:] ## remove self - finfo = inspect_function( item ) - for n in finfo['name_nodes']: - if n.id == 'self': - n.id = 'this' + if self.is_gpu_method( item ): + item.args.args[0].id = name ## change self to the class name + else: + item.args.args = item.args.args[1:] ## remove self + finfo = inspect_function( item ) + for n in finfo['name_nodes']: + if n.id == 'self': + n.id = 'this' elif isinstance(item, ast.Expr) and isinstance(item.value, Str): ## skip doc strings pass else: @@ -845,6 +866,11 @@ def _visit_js_classdef(self, node): writer.write('def %s(%s):' %(name,','.join(args))) writer.push() if init: + tail = '' + if gpu_object: + tail = 'this.__struct_name__="%s"' %name + + #for b in init.body: # line = self.visit(b) # if line: writer.write( line ) @@ -852,10 +878,10 @@ def _visit_js_classdef(self, node): if hasattr(init, '_code'): ## cached ## code = init._code elif args: - code = '%s.__init__(this, %s)'%(name, ','.join(args)) + code = '%s.__init__(this, %s); %s'%(name, ','.join(args), tail) init._code = code else: - code = '%s.__init__(this)'%name + code = '%s.__init__(this); %s'%(name, tail) init._code = code writer.write(code) @@ -879,12 +905,25 @@ def _visit_js_classdef(self, node): keys.sort() for mname in keys: method = methods[mname] - writer.write('@%s.prototype'%name) - line = self.visit(method) - if line: writer.write( line ) - #writer.write('%s.prototype.%s = %s'%(name,mname,mname)) - f = 'function () { return %s.prototype.%s.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }' %(name, mname) - writer.write('%s.%s = JS("%s")'%(name,mname,f)) + gpu_method = False + for dec in method.decorator_list: + if isinstance(dec, Attribute) and isinstance(dec.value, Name) and dec.value.id == 'gpu': + if dec.attr == 'method': + gpu_method = True + + if gpu_method: + method.name = '%s_%s' %(name, method.name) + line = self.visit(method) + if line: writer.write( line ) + + else: + + writer.write('@%s.prototype'%name) + line = self.visit(method) + if line: writer.write( line ) + #writer.write('%s.prototype.%s = %s'%(name,mname,mname)) + f = 'function () { return %s.prototype.%s.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }' %(name, mname) + writer.write('%s.%s = JS("%s")'%(name,mname,f)) for base in node.bases: base = self.visit(base) @@ -906,6 +945,9 @@ def _visit_js_classdef(self, node): self.visit(item) # this will output the code for the assign writer.write('%s.prototype.%s = %s' % (name, item_name, item.targets[0].id)) + if gpu_object: + ## TODO check class variables ## + writer.write('%s.prototype.__struct_name__ = "%s"' %(name,name)) ## TODO support property decorators in javascript-mode ## writer.write('%s.prototype.__properties__ = {}' %name) @@ -923,7 +965,6 @@ def visit_ClassDef(self, node): return name = node.name - log('ClassDef: %s'%name) self._in_class = name self._classes[ name ] = list() ## method names self._class_parents[ name ] = set() @@ -933,19 +974,17 @@ def visit_ClassDef(self, node): self._decorator_class_props[ name ] = self._decorator_properties self._instances[ 'self' ] = name + self._injector = [] ## DEPRECATED class_decorators = [] - self._injector = [] + gpu_object = False + for decorator in node.decorator_list: ## class decorators - if isinstance(decorator, Attribute) and isinstance(decorator.value, Name) and decorator.value.id == 'pythonjs': - if decorator.attr == 'property_callbacks': - self._injector.append('set') - elif decorator.attr == 'init_callbacks': - self._injector.append('init') + if isinstance(decorator, Attribute) and isinstance(decorator.value, Name) and decorator.value.id == 'gpu': + if decorator.attr == 'object': + gpu_object = True else: - raise SyntaxError( 'unsupported pythonjs class decorator' ) - + raise SyntaxError( self.format_error('invalid gpu class decorator') ) else: - #raise SyntaxError( 'unsupported class decorator' ) class_decorators.append( decorator ) ## always catch attributes ## @@ -1025,9 +1064,11 @@ def visit_ClassDef(self, node): self._in_class = False writer.write('%s = __create_class__("%s", __%s_parents, __%s_attrs, __%s_properties)' % (name, name, name, name, name)) - if 'init' in self._injector: - writer.write('%s.init_callbacks = JSArray()' %name) - self._injector = [] + + ## DEPRECATED + #if 'init' in self._injector: + # writer.write('%s.init_callbacks = JSArray()' %name) + #self._injector = [] for dec in class_decorators: writer.write('%s = __get__(%s,"__call__")( [%s], JSObject() )' % (name, self.visit(dec), name)) @@ -2433,6 +2474,7 @@ def visit_FunctionDef(self, node): gpu = False gpu_main = False gpu_vectorize = False + gpu_method = False local_typedefs = [] ## deprecated? @@ -2487,8 +2529,8 @@ def visit_FunctionDef(self, node): gpu_vectorize = True elif decorator.attr == 'main': gpu_main = True - elif decorator.attr == 'typedef': - pass + elif decorator.attr == 'method': + gpu_method = True else: raise NotImplementedError(decorator) @@ -2592,12 +2634,19 @@ def visit_FunctionDef(self, node): if gpu_vectorize: writer.write('@gpu.vectorize') + if gpu_method: + writer.write('@gpu.method') + ## force python variable scope, and pass user type information to second stage of translation. ## the dart backend can use this extra type information. vars = [] local_typedef_names = set() if not self._with_coffee: - local_vars, global_vars = retrieve_vars(node.body) + try: + local_vars, global_vars = retrieve_vars(node.body) + except SyntaxError as err: + raise SyntaxError( self.format_error(err) ) + local_vars = local_vars-global_vars if local_vars: args_typedefs = [] diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 50fc444..89ccd04 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -566,15 +566,15 @@ GLSLJITRuntime.prototype.array = function(ob, name) { GLSLJITRuntime.array = function () { return GLSLJITRuntime.prototype.array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.compile_header = function() { var a,b; - a = "\n".join(this.header); - b = []; + a = []; var __iter1 = __jsdict_values(this.struct_types); if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) ) { __iter1 = __object_keys__(__iter1) } for (var __idx1=0; __idx1 < __iter1.length; __idx1++) { var stype = __iter1[ __idx1 ]; - b.push(stype["code"]); + a.push(stype["code"]); } - b = "\n".join(b); + a = "\n".join(a); + b = "\n".join(this.header); return "\n".join([a, b]); } @@ -587,8 +587,12 @@ GLSLJITRuntime.prototype.compile_main = function() { GLSLJITRuntime.compile_main = function () { return GLSLJITRuntime.prototype.compile_main.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.define_structure = function(ob) { var arr,code,arrays,struct_type,member_list,struct_name,t,members,numbers; - if (__test_if_true__(Object.hasOwnProperty(ob, "__struct_name__"))) { - return ob.__struct_name__; + struct_name = null; + if (__test_if_true__(ob.__struct_name__)) { + struct_name = ob.__struct_name__; + if (__contains__(this.struct_types, struct_name)) { + return struct_name; + } } arrays = []; numbers = []; @@ -608,8 +612,13 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { } } } - struct_name = "".join(struct_type); - ob.__struct_name__ = struct_name; + if (( struct_name ) === null) { + console.log(["DEGUG: new struct name", ob.__struct_name__]); + console.log(ob); + struct_name = "".join(struct_type); + ob.__struct_name__ = struct_name; + console.log(["XX", struct_name]); + } if (! (__contains__(this.struct_types, struct_name))) { member_list = []; var __iter3 = numbers; @@ -627,7 +636,7 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { } members = "".join(member_list); code = (((("struct " + struct_name) + " {") + members) + "};"); - console.log("new struct type"); + console.log("-------new struct type-------"); console.log(code); this.struct_types[struct_name] = __jsdict([["arrays", arrays], ["numbers", numbers], ["code", code]]); } @@ -1402,8 +1411,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 593: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 594: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 606: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 607: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2152,7 +2161,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__32; - __iterator__32 = __get__(__get__(arr, "__iter__", "no iterator - line 1077: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__32 = __get__(__get__(arr, "__iter__", "no iterator - line 1090: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__32; __next__32 = __get__(__iterator__32, "next"); while (( __iterator__32.index ) < __iterator__32.length) { @@ -2192,7 +2201,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1097: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1110: return ob.__len__()"), "__call__")(); } } } @@ -2212,7 +2221,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1101: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1114: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2231,7 +2240,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__33; - __iterator__33 = __get__(__get__(objs, "__iter__", "no iterator - line 1106: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__33 = __get__(__get__(objs, "__iter__", "no iterator - line 1119: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__33; __next__33 = __get__(__iterator__33, "next"); while (( __iterator__33.index ) < __iterator__33.length) { @@ -2258,7 +2267,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__34; - __iterator__34 = __get__(__get__(objs, "__iter__", "no iterator - line 1114: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__34 = __get__(__get__(objs, "__iter__", "no iterator - line 1127: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__34; __next__34 = __get__(__iterator__34, "next"); while (( __iterator__34.index ) < __iterator__34.length) { @@ -2285,7 +2294,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__35; - __iterator__35 = __get__(__get__(lst, "__iter__", "no iterator - line 1123: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__35 = __get__(__get__(lst, "__iter__", "no iterator - line 1136: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__35; __next__35 = __get__(__iterator__35, "next"); while (( __iterator__35.index ) < __iterator__35.length) { @@ -2316,7 +2325,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__36; - __iterator__36 = __get__(__get__(lst, "__iter__", "no iterator - line 1130: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__36 = __get__(__get__(lst, "__iter__", "no iterator - line 1143: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__36; __next__36 = __get__(__iterator__36, "next"); while (( __iterator__36.index ) < __iterator__36.length) { @@ -2430,7 +2439,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1165: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1178: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2541,27 +2550,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__37; - __iterator__37 = __get__(__get__(ob, "__iter__", "no iterator - line 1220: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__37 = __get__(__get__(ob, "__iter__", "no iterator - line 1233: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__37; __next__37 = __get__(__iterator__37, "next"); while (( __iterator__37.index ) < __iterator__37.length) { o = __next__37(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1222: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1222: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1222: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1235: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1235: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1235: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1224: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1224: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1224: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1237: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1237: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1237: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__38; - __iterator__38 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1226: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__38 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1239: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__38; __next__38 = __get__(__iterator__38, "next"); while (( __iterator__38.index ) < __iterator__38.length) { key = __next__38(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1227: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1228: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1240: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1241: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2588,15 +2597,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__39; - __iterator__39 = __get__(__get__(keys, "__iter__", "no iterator - line 1236: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__39 = __get__(__get__(keys, "__iter__", "no iterator - line 1249: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__39; __next__39 = __get__(__iterator__39, "next"); while (( __iterator__39.index ) < __iterator__39.length) { key = __next__39(); - value = __get__(self["$wrapped"], "__getitem__", "line 1237: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1250: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1240: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1253: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2658,7 +2667,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1256: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1269: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2683,12 +2692,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__40; - __iterator__40 = __get__(__get__(other, "__iter__", "no iterator - line 1264: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(other, "__iter__", "no iterator - line 1277: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { key = __next__40(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1265: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1265: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1278: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1278: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2708,12 +2717,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__41; - __iterator__41 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1269: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1282: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { key = __next__41(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1270: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1283: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2758,7 +2767,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1280: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1293: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -3063,7 +3072,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1481: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1481: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1494: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1494: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3087,7 +3096,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1505: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1518: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3122,7 +3131,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1513: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1526: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3148,7 +3157,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1523: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1523: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1536: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1536: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3187,7 +3196,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1542: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1542: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1555: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1555: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3258,13 +3267,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1567: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1567: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1580: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1580: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1572: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1585: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3324,7 +3333,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1600: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1613: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3344,12 +3353,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__46; - __iterator__46 = __get__(__get__(lst, "__iter__", "no iterator - line 1604: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(lst, "__iter__", "no iterator - line 1617: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { value = __next__46(); - __get__(__get__(self, "append", "missing attribute `append` - line 1605: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1618: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3391,7 +3400,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1617: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1630: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3409,9 +3418,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1621: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1634: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1622: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1635: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 908e938..6e3b2d6 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -215,6 +215,7 @@ def _visit_function(self, node): glsl_wrapper_name = False gpu_return_types = {} gpu_vectorize = False + gpu_method = False args_typedefs = {} for decor in node.decorator_list: if isinstance(decor, ast.Name) and decor.id == '__glsl__': @@ -239,7 +240,8 @@ def _visit_function(self, node): gpu_vectorize = True elif decor.attr == 'main': is_main = True - + elif decor.attr == 'method': + gpu_method = True args = self.visit(node.args) @@ -253,8 +255,11 @@ def _visit_function(self, node): else: if arg in args_typedefs: x.append( '%s %s' %(args_typedefs[arg].replace('POINTER', '*'), arg) ) + elif gpu_method and i==0: + x.append( '%s self' %arg ) else: - x.append( 'float* %s' %arg ) + #x.append( 'float* %s' %arg ) ## this could be a way to default to the struct. + raise SyntaxError('GLSL functions require a typedef: %s' %arg) if is_main: lines.append( 'var glsljit = glsljit_runtime(__shader_header__);') ## each call to the wrapper function recompiles the shader @@ -264,6 +269,9 @@ def _visit_function(self, node): lines.append( 'glsljit.push("void main( ) {");') ## WebCLGL parser requires the space in `main( )` elif return_type: + #if gpu_method: + # lines.append( '__shader_header__.push("%s %s(struct this, %s ) {");' %(return_type, node.name, ', '.join(x)) ) + #else: lines.append( '__shader_header__.push("%s %s( %s ) {");' %(return_type, node.name, ', '.join(x)) ) else: lines.append( '__shader_header__.push("void %s( %s ) {");' %(node.name, ', '.join(x)) ) @@ -535,7 +543,11 @@ def visit_Call(self, node): name = self.visit(node.func) if self._glsl and isinstance(node.func, ast.Attribute): - return '`%s`' %self._visit_call_helper(node) + if isinstance(node.func.value, ast.Name) and node.func.value.id in self._typed_vars: + args = ','.join( [self.visit(a) for a in node.args] ) + return '`__struct_name__`_%s(%s, %s)' %(node.func.attr, node.func.value.id, args) + else: + return '`%s`' %self._visit_call_helper(node) elif self._glsl and name == 'len': if isinstance(node.args[0], ast.Name): diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 340282e..be4d144 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -27,11 +27,12 @@ def __init__(self, header): self.struct_types = {} def compile_header(self): - a = "\n".join(self.header) - b = [] + a = [] ## insert structs at top of header for stype in self.struct_types.values(): - b.push( stype['code'] ) - b = '\n'.join(b) + a.push( stype['code'] ) + a = '\n'.join(a) + ## code in header could be methods that reference the struct types above. + b = "\n".join(self.header) return '\n'.join([a,b]) def compile_main(self): @@ -42,8 +43,13 @@ def push(self, s): def define_structure(self, ob): - if Object.hasOwnProperty(ob,'__struct_name__'): - return ob.__struct_name__ + struct_name = None + ##if Object.hasOwnProperty(ob,'__struct_name__'): ## this is not right? + if ob.__struct_name__: + struct_name = ob.__struct_name__ + if struct_name in self.struct_types: + return struct_name + arrays = [] numbers = [] struct_type = [] @@ -56,8 +62,13 @@ def define_structure(self, ob): struct_type.push( 'NUM_'+key) numbers.push(key) - struct_name = ''.join( struct_type ) - ob.__struct_name__ = struct_name + if struct_name is None: + print('DEGUG: new struct name', ob.__struct_name__) + print(ob) + struct_name = ''.join( struct_type ) + ob.__struct_name__ = struct_name + print('XX', struct_name) + if struct_name not in self.struct_types: member_list = [] for key in numbers: @@ -68,7 +79,7 @@ def define_structure(self, ob): members = ''.join(member_list) code = 'struct ' +struct_name+ ' {' +members+ '};' - print('new struct type') + print('-------new struct type-------') print(code) self.struct_types[ struct_name ] = { 'arrays' : arrays, diff --git a/regtests/run.py b/regtests/run.py index 036179b..faa84fc 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -245,6 +245,8 @@ def run_command(command, returns_stdout_stderr=False, nodewebkit_workaround=Fals a = [] for line in stdout.splitlines(): if 'INFO:CONSOLE' in line: + line = line.replace('\\n', '\n') + line = line.replace('\\u003C', '<') start = line.index('"') end = line.rindex('"') a.append( line[start+1:end] ) diff --git a/regtests/webclgl/gpu_class.py b/regtests/webclgl/gpu_class.py new file mode 100644 index 0000000..a30faf2 --- /dev/null +++ b/regtests/webclgl/gpu_class.py @@ -0,0 +1,50 @@ +'''@gpu class''' + +@gpu.object +class MyObject: + ## below `self` is not `this` in javascript + ## `self` is a GLSL struct of MyObject + @gpu.method + float def mymethod(self, x,y): + float x + float y + return self.subroutine(x,y) * self.attr1 + + @gpu.method + float def subroutine(self, x,y): + float x + float y + return x + y + + ## here `self` is javascript's `this` + def __init__(self, a, b): + self.attr1 = a + self.attr2 = b + + + + +class myclass: + def new_struct(self, a, b): + return MyObject( a, b ) + + def run(self, w): + self.array = [ self.new_struct( x, 1.1 ) for x in range(w) ] + + @returns( array=64 ) + @gpu.main + def gpufunc(): + struct* A = self.array + float b = 0.0 + + for s in iter(A): + b += s.mymethod(1.1, 2.2) + + return b + + return gpufunc() + +def main(): + m = myclass() + r = m.run(8) + print(r) From 90d29378f1b2e8f10ea7965326ee8f8b08cf45e4 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 24 Jun 2014 05:24:22 -0700 Subject: [PATCH 073/222] gpu class: fixed method subroutines. --- pythonjs/python_to_pythonjs.py | 21 +++++++++++++++------ regtests/webclgl/gpu_class.py | 15 +++++++-------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index f94d1be..b67e9d6 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -830,14 +830,16 @@ def _visit_js_classdef(self, node): else: class_decorators.append( decorator ) + method_names = [] ## write back in order (required by GLSL) methods = {} class_vars = [] for item in node.body: if isinstance(item, FunctionDef): + method_names.append(item.name) methods[ item.name ] = item if self.is_gpu_method( item ): - item.args.args[0].id = name ## change self to the class name + item.args.args[0].id = name ## change self to the class name, pythonjs.py changes it to 'ClassName self' else: item.args.args = item.args.args[1:] ## remove self finfo = inspect_function( item ) @@ -901,9 +903,9 @@ def _visit_js_classdef(self, node): writer.write('%s.__uid__ = "" + _PythonJS_UID' %name) writer.write('_PythonJS_UID += 1') - keys = methods.keys() - keys.sort() - for mname in keys: + #keys = methods.keys() + #keys.sort() + for mname in method_names: method = methods[mname] gpu_method = False for dec in method.decorator_list: @@ -913,8 +915,10 @@ def _visit_js_classdef(self, node): if gpu_method: method.name = '%s_%s' %(name, method.name) + self._in_gpu_method = name ## name of class line = self.visit(method) if line: writer.write( line ) + self._in_gpu_method = None else: @@ -2072,13 +2076,18 @@ def visit_Call(self, node): raise SyntaxError( self.format_error(node) ) elif self._with_ll or name == 'inline' or self._with_glsl: + F = self.visit(node.func) args = [self.visit(arg) for arg in node.args] + if hasattr(self, '_in_gpu_method') and self._in_gpu_method and isinstance(node.func, ast.Attribute): + F = '%s_%s' %(self._in_gpu_method, node.func.attr) + args.insert(0, 'self') + if node.keywords: args.extend( [self.visit(x.value) for x in node.keywords] ) - return '%s(%s)' %( self.visit(node.func), ','.join(args) ) + return '%s(%s)' %( F, ','.join(args) ) else: - return '%s(%s)' %( self.visit(node.func), ','.join(args) ) + return '%s(%s)' %( F, ','.join(args) ) elif self._with_js or self._with_dart: args = list( map(self.visit, node.args) ) diff --git a/regtests/webclgl/gpu_class.py b/regtests/webclgl/gpu_class.py index a30faf2..0072f23 100644 --- a/regtests/webclgl/gpu_class.py +++ b/regtests/webclgl/gpu_class.py @@ -5,16 +5,18 @@ class MyObject: ## below `self` is not `this` in javascript ## `self` is a GLSL struct of MyObject @gpu.method - float def mymethod(self, x,y): + float def subroutine(self, x,y): float x float y - return self.subroutine(x,y) * self.attr1 + return x + y * self.attr2 + ## subroutines must be defined ahead of where they are used @gpu.method - float def subroutine(self, x,y): + float def mymethod(self, x,y): float x float y - return x + y + return self.subroutine(x,y) * self.attr1 + ## here `self` is javascript's `this` def __init__(self, a, b): @@ -25,11 +27,8 @@ def __init__(self, a, b): class myclass: - def new_struct(self, a, b): - return MyObject( a, b ) - def run(self, w): - self.array = [ self.new_struct( x, 1.1 ) for x in range(w) ] + self.array = [ MyObject( x, 1.1 ) for x in range(w) ] @returns( array=64 ) @gpu.main From 37e1161e10d7fc3b4ab6afd2d4284d7d69f8631a Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 24 Jun 2014 05:57:10 -0700 Subject: [PATCH 074/222] allow integer types, wrap number with `int16(n)` --- pythonjs/pythonjs.js | 637 ++++++++++++++++++---------------- pythonjs/runtime/builtins.py | 41 ++- regtests/webclgl/gpu_class.py | 12 +- 3 files changed, 372 insertions(+), 318 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 89ccd04..c03f0e6 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -519,51 +519,6 @@ GLSLJITRuntime.prototype.__init__ = function(header) { } GLSLJITRuntime.__init__ = function () { return GLSLJITRuntime.prototype.__init__.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; -GLSLJITRuntime.prototype.array = function(ob, name) { - var a,i,j,subname,subarr,v; - if (__test_if_true__(ob[0] instanceof Array)) { - a = []; - i = 0; - while (( i ) < ob.length) { - subarr = ob[i]; - subname = __sprintf("%s_%s", [name, i]); - if (( a.length ) == 0) { - a.append((((("float " + subname) + "[") + subarr.length) + "]")); - } else { - a.append(((((";float " + subname) + "[") + subarr.length) + "]")); - } - j = 0; - while (( j ) < subarr.length) { - v = (subarr[j] + ""); - if (! (__contains__(v, "."))) { - v += ".0"; - } - a.push((((((";" + subname) + "[") + j) + "]=") + v)); - j += 1; - } - i += 1; - } - this.shader.push("".join(a)); - } else { - if (__test_if_true__(ob[0] instanceof Object || ( ob[0].__class__ ) === dict)) { - i = 0; - while (( i ) < ob.length) { - this.structure(ob[i], ((name + "_") + i)); - i += 1; - } - } else { - a = [(((("float " + name) + "[") + ob.length) + "];")]; - i = 0; - while (( i ) < ob.length) { - a.push((((((name + "[") + i) + "]=") + ob[i]) + ";")); - i += 1; - } - this.shader.push("".join(a)); - } - } -} - -GLSLJITRuntime.array = function () { return GLSLJITRuntime.prototype.array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.compile_header = function() { var a,b; a = []; @@ -585,8 +540,14 @@ GLSLJITRuntime.prototype.compile_main = function() { } GLSLJITRuntime.compile_main = function () { return GLSLJITRuntime.prototype.compile_main.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.push = function(s) { + + this.shader.push(s); +} + +GLSLJITRuntime.push = function () { return GLSLJITRuntime.prototype.push.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.define_structure = function(ob) { - var arr,code,arrays,struct_type,member_list,struct_name,t,members,numbers; + var integers,arr,code,arrays,struct_type,member_list,struct_name,t,members,floats; struct_name = null; if (__test_if_true__(ob.__struct_name__)) { struct_name = ob.__struct_name__; @@ -595,7 +556,8 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { } } arrays = []; - numbers = []; + floats = []; + integers = []; struct_type = []; var __iter2 = __jsdict_keys(ob); if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } @@ -608,77 +570,55 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { } else { if (( t ) == "number") { struct_type.push(("NUM_" + key)); - numbers.push(key); + floats.push(key); + } else { + if (__test_if_true__(ob[key] instanceof Int16Array)) { + struct_type.push(("INT_" + key)); + if (( ob[key].length ) == 1) { + integers.push(key); + } else { + /*pass*/ + } + } } } } if (( struct_name ) === null) { - console.log(["DEGUG: new struct name", ob.__struct_name__]); - console.log(ob); struct_name = "".join(struct_type); ob.__struct_name__ = struct_name; - console.log(["XX", struct_name]); } if (! (__contains__(this.struct_types, struct_name))) { member_list = []; - var __iter3 = numbers; + var __iter3 = integers; if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) ) { __iter3 = __object_keys__(__iter3) } for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { var key = __iter3[ __idx3 ]; - member_list.append((("float " + key) + ";")); + member_list.append((("int " + key) + ";")); } - var __iter4 = arrays; + var __iter4 = floats; if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { var key = __iter4[ __idx4 ]; + member_list.append((("float " + key) + ";")); + } + var __iter5 = arrays; + if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } + for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { + var key = __iter5[ __idx5 ]; arr = ob[key]; member_list.append((((("float " + key) + "[") + arr.length) + "];")); } members = "".join(member_list); code = (((("struct " + struct_name) + " {") + members) + "};"); - console.log("-------new struct type-------"); + console.log("-------struct glsl code-------"); console.log(code); - this.struct_types[struct_name] = __jsdict([["arrays", arrays], ["numbers", numbers], ["code", code]]); + console.log("------------------------------"); + this.struct_types[struct_name] = __jsdict([["arrays", arrays], ["floats", floats], ["integers", integers], ["code", code]]); } return struct_name; } GLSLJITRuntime.define_structure = function () { return GLSLJITRuntime.prototype.define_structure.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; -GLSLJITRuntime.prototype.int16array = function(ob, name) { - var a,i; - a = [(((("int " + name) + "[") + ob.length) + "]")]; - i = 0; - while (( i ) < ob.length) { - a.push((((((";" + name) + "[") + i) + "]=") + ob[i])); - i += 1; - } - this.shader.push("".join(a)); -} - -GLSLJITRuntime.int16array = function () { return GLSLJITRuntime.prototype.int16array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; -GLSLJITRuntime.prototype.object = function(ob, name) { - var func,cls; - var __iter5 = this.object_packagers; - if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } - for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { - var p = __iter5[ __idx5 ]; - var __r_0; - __r_0 = p; - cls = __r_0[0]; - func = __r_0[1]; - if (__test_if_true__(ob instanceof cls)) { - return func(ob); - } - } -} - -GLSLJITRuntime.object = function () { return GLSLJITRuntime.prototype.object.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; -GLSLJITRuntime.prototype.push = function(s) { - - this.shader.push(s); -} - -GLSLJITRuntime.push = function () { return GLSLJITRuntime.prototype.push.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.structure = function(ob, name) { var sname,args,wrapper,value,aname,stype; wrapper = null; @@ -696,20 +636,26 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { } stype = this.struct_types[sname]; args = []; - var __iter6 = stype["numbers"]; + var __iter6 = stype["integers"]; if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { var key = __iter6[ __idx6 ]; + args.push((ob[key][0] + "")); + } + var __iter7 = stype["floats"]; + if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } + for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { + var key = __iter7[ __idx7 ]; value = (ob[key] + ""); if (! (__contains__(value, "."))) { value += ".0"; } args.push(value); } - var __iter7 = stype["arrays"]; - if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } - for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { - var key = __iter7[ __idx7 ]; + var __iter8 = stype["arrays"]; + if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } + for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { + var key = __iter8[ __idx8 ]; aname = (("_" + key) + name); this.array(ob[key], aname); args.push(aname); @@ -719,6 +665,80 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { } GLSLJITRuntime.structure = function () { return GLSLJITRuntime.prototype.structure.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.int16array = function(ob, name) { + var a,i; + a = [(((("int " + name) + "[") + ob.length) + "]")]; + i = 0; + while (( i ) < ob.length) { + a.push((((((";" + name) + "[") + i) + "]=") + ob[i])); + i += 1; + } + this.shader.push("".join(a)); +} + +GLSLJITRuntime.int16array = function () { return GLSLJITRuntime.prototype.int16array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.array = function(ob, name) { + var a,i,j,subname,subarr,v; + if (__test_if_true__(ob[0] instanceof Array)) { + a = []; + i = 0; + while (( i ) < ob.length) { + subarr = ob[i]; + subname = __sprintf("%s_%s", [name, i]); + if (( a.length ) == 0) { + a.append((((("float " + subname) + "[") + subarr.length) + "]")); + } else { + a.append(((((";float " + subname) + "[") + subarr.length) + "]")); + } + j = 0; + while (( j ) < subarr.length) { + v = (subarr[j] + ""); + if (! (__contains__(v, "."))) { + v += ".0"; + } + a.push((((((";" + subname) + "[") + j) + "]=") + v)); + j += 1; + } + i += 1; + } + this.shader.push("".join(a)); + } else { + if (__test_if_true__(ob[0] instanceof Object || ( ob[0].__class__ ) === dict)) { + i = 0; + while (( i ) < ob.length) { + this.structure(ob[i], ((name + "_") + i)); + i += 1; + } + } else { + a = [(((("float " + name) + "[") + ob.length) + "];")]; + i = 0; + while (( i ) < ob.length) { + a.push((((((name + "[") + i) + "]=") + ob[i]) + ";")); + i += 1; + } + this.shader.push("".join(a)); + } + } +} + +GLSLJITRuntime.array = function () { return GLSLJITRuntime.prototype.array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.object = function(ob, name) { + var func,cls; + var __iter9 = this.object_packagers; + if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } + for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { + var p = __iter9[ __idx9 ]; + var __r_0; + __r_0 = p; + cls = __r_0[0]; + func = __r_0[1]; + if (__test_if_true__(ob instanceof cls)) { + return func(ob); + } + } +} + +GLSLJITRuntime.object = function () { return GLSLJITRuntime.prototype.object.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.unpack_array2d = function(arr, dims) { var h,rows,w,row; if (( typeof(dims) ) == "number") { @@ -730,10 +750,10 @@ GLSLJITRuntime.prototype.unpack_array2d = function(arr, dims) { h = __r_1[1]; row = []; rows = [row]; - var __iter8 = arr; - if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } - for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { - var value = __iter8[ __idx8 ]; + var __iter10 = arr; + if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } + for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { + var value = __iter10[ __idx10 ]; row.append(value); if (( row.length ) >= w) { row = []; @@ -912,10 +932,10 @@ __contains__ = function(ob, a) { throw new TypeError; } else { if (__test_if_true__(__is_typed_array(ob))) { - var __iter9 = ob; - if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } - for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { - var x = __iter9[ __idx9 ]; + var __iter11 = ob; + if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } + for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { + var x = __iter11[ __idx11 ]; if (( x ) == a) { return true; } @@ -998,10 +1018,10 @@ __mul_op = function(a, b) { __jsdict = function(items) { var d,key; d = {}; - var __iter10 = items; - if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } - for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { - var item = __iter10[ __idx10 ]; + var __iter12 = items; + if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } + for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { + var item = __iter12[ __idx12 ]; key = item[0]; if (__test_if_true__(key.__uid__)) { key = key.__uid__; @@ -1049,10 +1069,10 @@ __jsdict_values = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object)) { arr = []; - var __iter11 = ob; - if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } - for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { - var key = __iter11[ __idx11 ]; + var __iter13 = ob; + if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } + for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { + var key = __iter13[ __idx13 ]; if (__test_if_true__(ob.hasOwnProperty(key))) { value = ob[key]; arr.push(value); @@ -1068,10 +1088,10 @@ __jsdict_items = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; - var __iter12 = ob; - if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } - for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { - var key = __iter12[ __idx12 ]; + var __iter14 = ob; + if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } + for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { + var key = __iter14[ __idx14 ]; if (__test_if_true__(Object.hasOwnProperty.call(ob, key))) { value = ob[key]; arr.push([key, value]); @@ -1128,10 +1148,10 @@ __object_keys__ = function(ob) { __bind_property_descriptors__ = function(o, klass) { var prop,desc; - var __iter13 = klass.__properties__; - if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } - for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { - var name = __iter13[ __idx13 ]; + var __iter15 = klass.__properties__; + if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } + for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { + var name = __iter15[ __idx15 ]; desc = __jsdict([["enumerable", true]]); prop = klass.__properties__[name]; if (__test_if_true__(prop["get"])) { @@ -1142,10 +1162,10 @@ __bind_property_descriptors__ = function(o, klass) { } Object.defineProperty(o, name, desc); } - var __iter14 = klass.__bases__; - if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } - for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { - var base = __iter14[ __idx14 ]; + var __iter16 = klass.__bases__; + if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } + for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { + var base = __iter16[ __idx16 ]; __bind_property_descriptors__(o, base); } } @@ -1177,10 +1197,10 @@ __sprintf = function(fmt, args) { arr = []; var i; i = 0; - var __iter15 = chunks; - if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } - for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { - var txt = __iter15[ __idx15 ]; + var __iter17 = chunks; + if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } + for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { + var txt = __iter17[ __idx17 ]; arr.append(txt); if (( i ) >= args.length) { break; @@ -1213,10 +1233,10 @@ __create_class__ = function(class_name, parents, attrs, props) { klass.__all_method_names__ = []; klass.__properties__ = props; klass.__attributes__ = attrs; - var __iter16 = attrs; - if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } - for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { - var key = __iter16[ __idx16 ]; + var __iter18 = attrs; + if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } + for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { + var key = __iter18[ __idx18 ]; if (( typeof(attrs[key]) ) == "function") { klass.__all_method_names__.push(key); f = attrs[key]; @@ -1237,20 +1257,20 @@ __create_class__ = function(class_name, parents, attrs, props) { } klass.__setters__ = []; klass.__getters__ = []; - var __iter17 = klass.__properties__; - if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } - for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { - var name = __iter17[ __idx17 ]; + var __iter19 = klass.__properties__; + if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } + for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { + var name = __iter19[ __idx19 ]; prop = klass.__properties__[name]; klass.__getters__.push(name); if (__test_if_true__(prop["set"])) { klass.__setters__.push(name); } } - var __iter18 = klass.__bases__; - if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } - for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { - var base = __iter18[ __idx18 ]; + var __iter20 = klass.__bases__; + if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } + for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { + var base = __iter20[ __idx20 ]; Array.prototype.push.apply(klass.__getters__, base.__getters__); Array.prototype.push.apply(klass.__setters__, base.__setters__); Array.prototype.push.apply(klass.__all_method_names__, base.__all_method_names__); @@ -1263,10 +1283,10 @@ __create_class__ = function(class_name, parents, attrs, props) { object.__dict__ = object; has_getattribute = false; has_getattr = false; - var __iter19 = klass.__all_method_names__; - if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } - for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { - var name = __iter19[ __idx19 ]; + var __iter21 = klass.__all_method_names__; + if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } + for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { + var name = __iter21[ __idx21 ]; if (( name ) == "__getattribute__") { has_getattribute = true; } else { @@ -1411,8 +1431,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 606: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 607: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 621: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 622: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1474,6 +1494,13 @@ int = function(args, kwargs) { } int.pythonscript_function = true; +int16 = function(a) { + var arr; + arr = new Int16Array(1); + arr[0] = a; + return arr; +} + float = function(args, kwargs) { var __sig__,__args__; @@ -1634,10 +1661,10 @@ _setup_str_prototype = function(args, kwargs) { arr = a["$wrapped"]; } i = 0; - var __iter20 = arr; - if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } - for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { - var value = __iter20[ __idx20 ]; + var __iter22 = arr; + if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } + for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { + var value = __iter22[ __idx22 ]; out += value; i += 1; if (( i ) < arr.length) { @@ -1679,10 +1706,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; - var __iter21 = this; - if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } - for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { - var char = __iter21[ __idx21 ]; + var __iter23 = this; + if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } + for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { + var char = __iter23[ __idx23 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1696,10 +1723,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."]; - var __iter22 = this; - if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } - for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { - var char = __iter22[ __idx22 ]; + var __iter24 = this; + if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } + for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { + var char = __iter24[ __idx24 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1726,10 +1753,10 @@ _setup_str_prototype = function(args, kwargs) { var keys,r; r = this; keys = Object.keys(fmt); - var __iter23 = keys; - if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } - for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { - var key = __iter23[ __idx23 ]; + var __iter25 = keys; + if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } + for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { + var key = __iter25[ __idx25 ]; r = r.split(key).join(fmt[key]); } r = r.split("{").join("").split("}").join(""); @@ -1876,10 +1903,10 @@ _setup_array_prototype = function(args, kwargs) { stop = this.length; } arr = [start, (stop - start)]; - var __iter24 = items; - if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } - for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { - var item = __iter24[ __idx24 ]; + var __iter26 = items; + if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } + for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { + var item = __iter26[ __idx26 ]; arr.push(item); } this.splice.apply(this, arr); @@ -1895,10 +1922,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); var extend = function(other) { - var __iter25 = other; - if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } - for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { - var obj = __iter25[ __idx25 ]; + var __iter27 = other; + if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } + for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { + var obj = __iter27[ __idx27 ]; this.push(obj); } return this; @@ -1930,10 +1957,10 @@ _setup_array_prototype = function(args, kwargs) { var count = function(obj) { var a; a = 0; - var __iter26 = this; - if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } - for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { - var item = __iter26[ __idx26 ]; + var __iter28 = this; + if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } + for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { + var item = __iter28[ __idx28 ]; if (( item ) === obj) { a += 1; } @@ -1989,10 +2016,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { - var __iter27 = this; - if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } - for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { - var item = __iter27[ __idx27 ]; + var __iter29 = this; + if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } + for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { + var item = __iter29[ __idx29 ]; if (( other.indexOf(item) ) == -1) { return false; } @@ -2160,12 +2187,12 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b,__iterator__32; - __iterator__32 = __get__(__get__(arr, "__iter__", "no iterator - line 1090: for b in arr:"), "__call__")([], __NULL_OBJECT__); - var __next__32; - __next__32 = __get__(__iterator__32, "next"); - while (( __iterator__32.index ) < __iterator__32.length) { - b = __next__32(); + var b,__iterator__34; + __iterator__34 = __get__(__get__(arr, "__iter__", "no iterator - line 1111: for b in arr:"), "__call__")([], __NULL_OBJECT__); + var __next__34; + __next__34 = __get__(__iterator__34, "next"); + while (( __iterator__34.index ) < __iterator__34.length) { + b = __next__34(); a += b; } return a; @@ -2201,7 +2228,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1110: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1131: return ob.__len__()"), "__call__")(); } } } @@ -2221,7 +2248,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1114: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1135: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2239,12 +2266,12 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__33; - __iterator__33 = __get__(__get__(objs, "__iter__", "no iterator - line 1119: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__33; - __next__33 = __get__(__iterator__33, "next"); - while (( __iterator__33.index ) < __iterator__33.length) { - ob = __next__33(); + var ob,__iterator__35; + __iterator__35 = __get__(__get__(objs, "__iter__", "no iterator - line 1140: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__35; + __next__35 = __get__(__iterator__35, "next"); + while (( __iterator__35.index ) < __iterator__35.length) { + ob = __next__35(); v = __get__(func, "__call__")([ob], __NULL_OBJECT__); arr.push(v); } @@ -2266,12 +2293,12 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__34; - __iterator__34 = __get__(__get__(objs, "__iter__", "no iterator - line 1127: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__34; - __next__34 = __get__(__iterator__34, "next"); - while (( __iterator__34.index ) < __iterator__34.length) { - ob = __next__34(); + var ob,__iterator__36; + __iterator__36 = __get__(__get__(objs, "__iter__", "no iterator - line 1148: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__36; + __next__36 = __get__(__iterator__36, "next"); + while (( __iterator__36.index ) < __iterator__36.length) { + ob = __next__36(); if (__test_if_true__(__get__(func, "__call__")([ob], __NULL_OBJECT__))) { arr.push(ob); } @@ -2293,12 +2320,12 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__35; - __iterator__35 = __get__(__get__(lst, "__iter__", "no iterator - line 1136: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__35; - __next__35 = __get__(__iterator__35, "next"); - while (( __iterator__35.index ) < __iterator__35.length) { - value = __next__35(); + var value,__iterator__37; + __iterator__37 = __get__(__get__(lst, "__iter__", "no iterator - line 1157: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__37; + __next__37 = __get__(__iterator__37, "next"); + while (( __iterator__37.index ) < __iterator__37.length) { + value = __next__37(); if (( a ) === null) { a = value; } else { @@ -2324,12 +2351,12 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__36; - __iterator__36 = __get__(__get__(lst, "__iter__", "no iterator - line 1143: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__36; - __next__36 = __get__(__iterator__36, "next"); - while (( __iterator__36.index ) < __iterator__36.length) { - value = __next__36(); + var value,__iterator__38; + __iterator__38 = __get__(__get__(lst, "__iter__", "no iterator - line 1164: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__38; + __next__38 = __get__(__iterator__38, "next"); + while (( __iterator__38.index ) < __iterator__38.length) { + value = __next__38(); if (( a ) === null) { a = value; } else { @@ -2439,7 +2466,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1178: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1199: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2549,28 +2576,28 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o,__iterator__37; - __iterator__37 = __get__(__get__(ob, "__iter__", "no iterator - line 1233: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__37; - __next__37 = __get__(__iterator__37, "next"); - while (( __iterator__37.index ) < __iterator__37.length) { - o = __next__37(); + var o,__iterator__39; + __iterator__39 = __get__(__get__(ob, "__iter__", "no iterator - line 1254: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__39; + __next__39 = __get__(__iterator__39, "next"); + while (( __iterator__39.index ) < __iterator__39.length) { + o = __next__39(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1235: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1235: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1235: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1256: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1256: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1256: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1237: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1237: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1237: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1258: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1258: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1258: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key,__iterator__38; - __iterator__38 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1239: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__38; - __next__38 = __get__(__iterator__38, "next"); - while (( __iterator__38.index ) < __iterator__38.length) { - key = __next__38(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1240: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1241: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + var key,__iterator__40; + __iterator__40 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1260: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__40; + __next__40 = __get__(__iterator__40, "next"); + while (( __iterator__40.index ) < __iterator__40.length) { + key = __next__40(); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1261: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1262: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2596,16 +2623,16 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key,__iterator__39; - __iterator__39 = __get__(__get__(keys, "__iter__", "no iterator - line 1249: for key in keys:"), "__call__")([], __NULL_OBJECT__); - var __next__39; - __next__39 = __get__(__iterator__39, "next"); - while (( __iterator__39.index ) < __iterator__39.length) { - key = __next__39(); - value = __get__(self["$wrapped"], "__getitem__", "line 1250: value = self[...][key]")([key], __NULL_OBJECT__); + var key,__iterator__41; + __iterator__41 = __get__(__get__(keys, "__iter__", "no iterator - line 1270: for key in keys:"), "__call__")([], __NULL_OBJECT__); + var __next__41; + __next__41 = __get__(__iterator__41, "next"); + while (( __iterator__41.index ) < __iterator__41.length) { + key = __next__41(); + value = __get__(self["$wrapped"], "__getitem__", "line 1271: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1253: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1274: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2667,7 +2694,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1269: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1290: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2691,13 +2718,13 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key,__iterator__40; - __iterator__40 = __get__(__get__(other, "__iter__", "no iterator - line 1277: for key in other:"), "__call__")([], __NULL_OBJECT__); - var __next__40; - __next__40 = __get__(__iterator__40, "next"); - while (( __iterator__40.index ) < __iterator__40.length) { - key = __next__40(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1278: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1278: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + var key,__iterator__42; + __iterator__42 = __get__(__get__(other, "__iter__", "no iterator - line 1298: for key in other:"), "__call__")([], __NULL_OBJECT__); + var __next__42; + __next__42 = __get__(__iterator__42, "next"); + while (( __iterator__42.index ) < __iterator__42.length) { + key = __next__42(); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1299: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1299: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2716,13 +2743,13 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key,__iterator__41; - __iterator__41 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1282: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__41; - __next__41 = __get__(__iterator__41, "next"); - while (( __iterator__41.index ) < __iterator__41.length) { - key = __next__41(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1283: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + var key,__iterator__43; + __iterator__43 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1303: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__43; + __next__43 = __get__(__iterator__43, "next"); + while (( __iterator__43.index ) < __iterator__43.length) { + key = __next__43(); + __get__(__get__(arr, "append", "missing attribute `append` - line 1304: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2767,7 +2794,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1293: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1314: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2903,10 +2930,10 @@ __dict_values = function(args, kwargs) { var self = __args__['self']; keys = Object.keys(self["$wrapped"]); out = []; - var __iter28 = keys; - if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } - for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { - var key = __iter28[ __idx28 ]; + var __iter30 = keys; + if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } + for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { + var key = __iter30[ __idx30 ]; out.push(self["$wrapped"][key]); } return out; @@ -2993,10 +3020,10 @@ set = function(args, kwargs) { } fallback = false; if (__test_if_true__(hashtable)) { - var __iter29 = a; - if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } - for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { - var b = __iter29[ __idx29 ]; + var __iter31 = a; + if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } + for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { + var b = __iter31[ __idx31 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[key] = b; @@ -3011,20 +3038,20 @@ set = function(args, kwargs) { } s = []; if (__test_if_true__(fallback)) { - var __iter30 = a; - if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } - for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { - var item = __iter30[ __idx30 ]; + var __iter32 = a; + if (! (__iter32 instanceof Array || typeof __iter32 == "string" || __is_typed_array(__iter32)) ) { __iter32 = __object_keys__(__iter32) } + for (var __idx32=0; __idx32 < __iter32.length; __idx32++) { + var item = __iter32[ __idx32 ]; if (( s.indexOf(item) ) == -1) { s.push(item); } } } else { __sort_method(keys); - var __iter31 = keys; - if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } - for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { - var key = __iter31[ __idx31 ]; + var __iter33 = keys; + if (! (__iter33 instanceof Array || typeof __iter33 == "string" || __is_typed_array(__iter33)) ) { __iter33 = __object_keys__(__iter33) } + for (var __idx33=0; __idx33 < __iter33.length; __idx33++) { + var key = __iter33[ __idx33 ]; s.push(hashtable[key]); } } @@ -3072,7 +3099,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1494: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1494: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1515: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1515: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3096,7 +3123,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1518: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1539: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3131,7 +3158,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1526: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1547: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3157,7 +3184,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1536: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1536: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1557: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1557: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3196,7 +3223,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1555: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1555: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1576: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1576: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3267,13 +3294,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1580: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1580: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1601: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1601: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1585: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1606: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3333,7 +3360,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1613: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1634: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3352,13 +3379,13 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value,__iterator__46; - __iterator__46 = __get__(__get__(lst, "__iter__", "no iterator - line 1617: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__46; - __next__46 = __get__(__iterator__46, "next"); - while (( __iterator__46.index ) < __iterator__46.length) { - value = __next__46(); - __get__(__get__(self, "append", "missing attribute `append` - line 1618: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + var value,__iterator__48; + __iterator__48 = __get__(__get__(lst, "__iter__", "no iterator - line 1638: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__48; + __next__48 = __get__(__iterator__48, "next"); + while (( __iterator__48.index ) < __iterator__48.length) { + value = __next__48(); + __get__(__get__(self, "append", "missing attribute `append` - line 1639: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3400,7 +3427,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1630: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1651: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3418,9 +3445,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1634: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1655: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1635: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1656: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3557,17 +3584,17 @@ json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (f __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; - var __iter32 = threading.workers; - if (! (__iter32 instanceof Array || typeof __iter32 == "string" || __is_typed_array(__iter32)) ) { __iter32 = __object_keys__(__iter32) } - for (var __idx32=0; __idx32 < __iter32.length; __idx32++) { - var b = __iter32[ __idx32 ]; + var __iter34 = threading.workers; + if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34)) ) { __iter34 = __object_keys__(__iter34) } + for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { + var b = __iter34[ __idx34 ]; other = b["worker"]; args = b["args"]; if (( other ) !== worker) { - var __iter33 = args; - if (! (__iter33 instanceof Array || typeof __iter33 == "string" || __is_typed_array(__iter33)) ) { __iter33 = __object_keys__(__iter33) } - for (var __idx33=0; __idx33 < __iter33.length; __idx33++) { - var arg = __iter33[ __idx33 ]; + var __iter35 = args; + if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35)) ) { __iter35 = __object_keys__(__iter35) } + for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { + var arg = __iter35[ __idx35 ]; if (( arg ) === ob) { if (! (__contains__(a, other))) { a.append(other); @@ -3599,10 +3626,10 @@ __start_new_thread = function(f, args) { if (( event.data.type ) == "append") { a = args[event.data.argindex]; a.push(event.data.value); - var __iter34 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34)) ) { __iter34 = __object_keys__(__iter34) } - for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { - var other = __iter34[ __idx34 ]; + var __iter36 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36)) ) { __iter36 = __object_keys__(__iter36) } + for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { + var other = __iter36[ __idx36 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); } } else { @@ -3614,10 +3641,10 @@ __start_new_thread = function(f, args) { } else { a[event.data.index] = value; } - var __iter35 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35)) ) { __iter35 = __object_keys__(__iter35) } - for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { - var other = __iter35[ __idx35 ]; + var __iter37 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter37 instanceof Array || typeof __iter37 == "string" || __is_typed_array(__iter37)) ) { __iter37 = __object_keys__(__iter37) } + for (var __idx37=0; __idx37 < __iter37.length; __idx37++) { + var other = __iter37[ __idx37 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); } } else { @@ -3632,10 +3659,10 @@ __start_new_thread = function(f, args) { jsargs = []; var i; i = 0; - var __iter36 = args; - if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36)) ) { __iter36 = __object_keys__(__iter36) } - for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { - var arg = __iter36[ __idx36 ]; + var __iter38 = args; + if (! (__iter38 instanceof Array || typeof __iter38 == "string" || __is_typed_array(__iter38)) ) { __iter38 = __object_keys__(__iter38) } + for (var __idx38=0; __idx38 < __iter38.length; __idx38++) { + var arg = __iter38[ __idx38 ]; if (__test_if_true__(arg.jsify)) { jsargs.append(arg.jsify()); } else { diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index be4d144..d30bbc0 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -51,8 +51,10 @@ def define_structure(self, ob): return struct_name arrays = [] - numbers = [] - struct_type = [] + floats = [] + integers = [] + struct_type = [] ## fallback for javascript objects + for key in ob.keys(): t = typeof( ob[key] ) if t=='object' and instanceof(ob[key], Array) and ob[key].length and typeof(ob[key][0])=='number': @@ -60,18 +62,25 @@ def define_structure(self, ob): arrays.push(key) elif t=='number': struct_type.push( 'NUM_'+key) - numbers.push(key) + floats.push(key) + elif instanceof(ob[key], Int16Array): + struct_type.push( 'INT_'+key) + if ob[key].length == 1: + integers.push(key) + else: + pass ## TODO int16array if struct_name is None: - print('DEGUG: new struct name', ob.__struct_name__) - print(ob) + #print('DEGUG: new struct name', ob.__struct_name__) + #print(ob) struct_name = ''.join( struct_type ) ob.__struct_name__ = struct_name - print('XX', struct_name) if struct_name not in self.struct_types: member_list = [] - for key in numbers: + for key in integers: + member_list.append('int '+key+';') + for key in floats: member_list.append('float '+key+';') for key in arrays: arr = ob[key] @@ -79,11 +88,13 @@ def define_structure(self, ob): members = ''.join(member_list) code = 'struct ' +struct_name+ ' {' +members+ '};' - print('-------new struct type-------') + print('-------struct glsl code-------') print(code) + print('------------------------------') self.struct_types[ struct_name ] = { 'arrays' : arrays, - 'numbers': numbers, + 'floats' : floats, + 'integers': integers, 'code' : code } return struct_name @@ -101,7 +112,11 @@ def structure(self, ob, name): wrapper.__struct_name__ = sname stype = self.struct_types[ sname ] args = [] - for key in stype['numbers']: + + for key in stype['integers']: + args.push( ob[key][0]+'' ) + + for key in stype['floats']: value = ob[key] + '' if '.' not in value: value += '.0' @@ -640,6 +655,12 @@ def int(a): raise ValueError('not a number') return a +with javascript: + def int16(a): ## used by glsljit when packing structs. + arr = new(Int16Array(1)) + arr[0]=a + return arr + def float(a): with javascript: a = Number(a) diff --git a/regtests/webclgl/gpu_class.py b/regtests/webclgl/gpu_class.py index 0072f23..85339a0 100644 --- a/regtests/webclgl/gpu_class.py +++ b/regtests/webclgl/gpu_class.py @@ -15,20 +15,26 @@ class MyObject: float def mymethod(self, x,y): float x float y - return self.subroutine(x,y) * self.attr1 + if self.index == 0: + return -20.5 + elif self.index == 0: + return 0.6 + else: + return self.subroutine(x,y) * self.attr1 ## here `self` is javascript's `this` - def __init__(self, a, b): + def __init__(self, a, b, i): self.attr1 = a self.attr2 = b + self.index = int16(i) class myclass: def run(self, w): - self.array = [ MyObject( x, 1.1 ) for x in range(w) ] + self.array = [ MyObject( 1.1, 1.2, x ) for x in range(w) ] @returns( array=64 ) @gpu.main From 22b26a3de29b5ccc4e502c2e40760ae62b7c90ed Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 24 Jun 2014 06:36:33 -0700 Subject: [PATCH 075/222] updated GPU doc --- doc/gpu.md | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/doc/gpu.md b/doc/gpu.md index caaa9f7..d2e4b41 100644 --- a/doc/gpu.md +++ b/doc/gpu.md @@ -10,6 +10,7 @@ micro language: . basic math ops and logic: if, elif, else, for i in range(n) . list of lists iteration with dynamic size . iterate over list of structs (dicts) + . simple classes . define GPU `main` function with input arguments and subroutines . `gpu.main` can take arguments typed as: int, float, and float* @@ -235,7 +236,9 @@ list of dicts Use the for-iter loop to iterate over a list of dicts `for s in iter(A):` Regular JavaScript objects and Python dicts are uploaded to the shader as GLSL structs. The struct type name and GLSL code are generated at runtime based on the contents of -each dict. A struct may contain: floats and array of floats attributes. +each dict. A struct may contain: ints, floats and array of floats attributes. +To use an integer value wrap it in a Int16Array with a single item, +or call `int16(n)` which takes care of that for you. ``` class myclass: @@ -243,7 +246,7 @@ class myclass: def new_struct(self, g): return { 'attr1' : 0.6 + g, - 'attr2' : 0.4 + g + 'attr2' : int16(g) } @@ -256,7 +259,7 @@ class myclass: struct* A = self.array float b = 0.0 for s in iter(A): - b += s.attr1 + s.attr2 + b += s.attr1 + float(s.attr2) return b return gpufunc() @@ -266,6 +269,7 @@ class myclass: external method calls --------------------- Methods on external objects can be called within the shader function. +This is useful for getting runtime data that is loop invariant. ``` class myclass: @@ -291,4 +295,54 @@ def main(): m = myclass(10) r = m.run(64) -``` \ No newline at end of file +``` + +user defined classes +------- +A class decorated with `@gpu.object` will have its methods marked with `@gpu.method` translated into shader code. GPU methods must be defined in use order, a method is defined before it is used by another method. Recursive calls are not allowed. + + +``` +@gpu.object +class MyObject: + @gpu.method + float def subroutine(self, x,y): + float x + float y + return x + y * self.attr2 + + @gpu.method + float def mymethod(self, x,y): + float x + float y + if self.index == 0: + return -20.5 + elif self.index == 0: + return 0.6 + else: + return self.subroutine(x,y) * self.attr1 + + def __init__(self, a, b, i): + self.attr1 = a + self.attr2 = b + self.index = int16(i) + + +class myclass: + def run(self, w): + self.array = [ MyObject( 1.1, 1.2, x ) for x in range(w) ] + + @returns( array=64 ) + @gpu.main + def gpufunc(): + struct* A = self.array + float b = 0.0 + + for s in iter(A): + b += s.mymethod(1.1, 2.2) + + return b + + return gpufunc() + +``` From a23c774397c2cba2a7858d64a4a27a33730eb909 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 24 Jun 2014 15:17:27 -0700 Subject: [PATCH 076/222] pack external javascript objects for upload to GPU --- pythonjs/pythonjs.js | 487 +++++++++++++++------------- pythonjs/pythonjs.py | 6 +- pythonjs/runtime/builtins.py | 25 +- regtests/webclgl/gpu_class_three.py | 38 +++ 4 files changed, 327 insertions(+), 229 deletions(-) create mode 100644 regtests/webclgl/gpu_class_three.py diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index c03f0e6..429f0b1 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -547,7 +547,7 @@ GLSLJITRuntime.prototype.push = function(s) { GLSLJITRuntime.push = function () { return GLSLJITRuntime.prototype.push.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.define_structure = function(ob) { - var integers,arr,code,arrays,struct_type,member_list,struct_name,t,members,floats; + var integers,arr,code,struct_name,struct_type,member_list,subtype,t,members,arrays,structs,floats; struct_name = null; if (__test_if_true__(ob.__struct_name__)) { struct_name = ob.__struct_name__; @@ -558,8 +558,9 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { arrays = []; floats = []; integers = []; + structs = []; struct_type = []; - var __iter2 = __jsdict_keys(ob); + var __iter2 = dir(ob); if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { var key = __iter2[ __idx2 ]; @@ -579,6 +580,14 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { } else { /*pass*/ } + } else { + if (__test_if_true__(( t ) == "object" && ob[key].__struct_name__)) { + struct_type.push(("S_" + key)); + structs.push(key); + if (! (__contains__(this.struct_types, ob[key].__struct_name__))) { + this.define_structure(ob[key]); + } + } } } } @@ -607,13 +616,20 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { var key = __iter5[ __idx5 ]; arr = ob[key]; member_list.append((((("float " + key) + "[") + arr.length) + "];")); + } + var __iter6 = structs; + if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } + for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { + var key = __iter6[ __idx6 ]; + subtype = ob[key].__struct_name__; + member_list.append((((subtype + " ") + key) + ";")); } members = "".join(member_list); code = (((("struct " + struct_name) + " {") + members) + "};"); console.log("-------struct glsl code-------"); console.log(code); console.log("------------------------------"); - this.struct_types[struct_name] = __jsdict([["arrays", arrays], ["floats", floats], ["integers", integers], ["code", code]]); + this.struct_types[struct_name] = __jsdict([["arrays", arrays], ["floats", floats], ["integers", integers], ["structs", structs], ["code", code]]); } return struct_name; } @@ -636,29 +652,37 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { } stype = this.struct_types[sname]; args = []; - var __iter6 = stype["integers"]; - if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } - for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { - var key = __iter6[ __idx6 ]; - args.push((ob[key][0] + "")); - } - var __iter7 = stype["floats"]; + var __iter7 = stype["integers"]; if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { var key = __iter7[ __idx7 ]; + args.push((ob[key][0] + "")); + } + var __iter8 = stype["floats"]; + if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } + for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { + var key = __iter8[ __idx8 ]; value = (ob[key] + ""); if (! (__contains__(value, "."))) { value += ".0"; } args.push(value); } - var __iter8 = stype["arrays"]; - if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } - for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { - var key = __iter8[ __idx8 ]; + var __iter9 = stype["arrays"]; + if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } + for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { + var key = __iter9[ __idx9 ]; aname = (("_" + key) + name); this.array(ob[key], aname); args.push(aname); + } + var __iter10 = stype["structs"]; + if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } + for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { + var key = __iter10[ __idx10 ]; + aname = (("_" + key) + name); + this.structure(ob[key], aname); + args.push(aname); } args = ",".join(args); this.shader.push((((((((sname + " ") + name) + "=") + sname) + "(") + args) + ");")); @@ -724,10 +748,10 @@ GLSLJITRuntime.prototype.array = function(ob, name) { GLSLJITRuntime.array = function () { return GLSLJITRuntime.prototype.array.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.object = function(ob, name) { var func,cls; - var __iter9 = this.object_packagers; - if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } - for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { - var p = __iter9[ __idx9 ]; + var __iter11 = this.object_packagers; + if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } + for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { + var p = __iter11[ __idx11 ]; var __r_0; __r_0 = p; cls = __r_0[0]; @@ -750,10 +774,10 @@ GLSLJITRuntime.prototype.unpack_array2d = function(arr, dims) { h = __r_1[1]; row = []; rows = [row]; - var __iter10 = arr; - if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } - for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { - var value = __iter10[ __idx10 ]; + var __iter12 = arr; + if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } + for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { + var value = __iter12[ __idx12 ]; row.append(value); if (( row.length ) >= w) { row = []; @@ -932,10 +956,10 @@ __contains__ = function(ob, a) { throw new TypeError; } else { if (__test_if_true__(__is_typed_array(ob))) { - var __iter11 = ob; - if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } - for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { - var x = __iter11[ __idx11 ]; + var __iter13 = ob; + if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } + for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { + var x = __iter13[ __idx13 ]; if (( x ) == a) { return true; } @@ -1018,10 +1042,10 @@ __mul_op = function(a, b) { __jsdict = function(items) { var d,key; d = {}; - var __iter12 = items; - if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } - for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { - var item = __iter12[ __idx12 ]; + var __iter14 = items; + if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } + for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { + var item = __iter14[ __idx14 ]; key = item[0]; if (__test_if_true__(key.__uid__)) { key = key.__uid__; @@ -1069,10 +1093,10 @@ __jsdict_values = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object)) { arr = []; - var __iter13 = ob; - if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } - for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { - var key = __iter13[ __idx13 ]; + var __iter15 = ob; + if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } + for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { + var key = __iter15[ __idx15 ]; if (__test_if_true__(ob.hasOwnProperty(key))) { value = ob[key]; arr.push(value); @@ -1088,10 +1112,10 @@ __jsdict_items = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; - var __iter14 = ob; - if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } - for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { - var key = __iter14[ __idx14 ]; + var __iter16 = ob; + if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } + for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { + var key = __iter16[ __idx16 ]; if (__test_if_true__(Object.hasOwnProperty.call(ob, key))) { value = ob[key]; arr.push([key, value]); @@ -1138,6 +1162,15 @@ __jsdict_pop = function(ob, key, _kwargs_) { } } +dir = function(ob) { + + if (__test_if_true__(ob instanceof Object)) { + return Object.keys( ob ); + } else { + return __object_keys__(ob); + } +} + __object_keys__ = function(ob) { var arr; "\n notes:\n . Object.keys(ob) will not work because we create PythonJS objects using `Object.create(null)`\n . this is different from Object.keys because it traverses the prototype chain.\n "; @@ -1148,10 +1181,10 @@ __object_keys__ = function(ob) { __bind_property_descriptors__ = function(o, klass) { var prop,desc; - var __iter15 = klass.__properties__; - if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } - for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { - var name = __iter15[ __idx15 ]; + var __iter17 = klass.__properties__; + if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } + for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { + var name = __iter17[ __idx17 ]; desc = __jsdict([["enumerable", true]]); prop = klass.__properties__[name]; if (__test_if_true__(prop["get"])) { @@ -1162,10 +1195,10 @@ __bind_property_descriptors__ = function(o, klass) { } Object.defineProperty(o, name, desc); } - var __iter16 = klass.__bases__; - if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } - for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { - var base = __iter16[ __idx16 ]; + var __iter18 = klass.__bases__; + if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } + for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { + var base = __iter18[ __idx18 ]; __bind_property_descriptors__(o, base); } } @@ -1197,10 +1230,10 @@ __sprintf = function(fmt, args) { arr = []; var i; i = 0; - var __iter17 = chunks; - if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } - for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { - var txt = __iter17[ __idx17 ]; + var __iter19 = chunks; + if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } + for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { + var txt = __iter19[ __idx19 ]; arr.append(txt); if (( i ) >= args.length) { break; @@ -1233,10 +1266,10 @@ __create_class__ = function(class_name, parents, attrs, props) { klass.__all_method_names__ = []; klass.__properties__ = props; klass.__attributes__ = attrs; - var __iter18 = attrs; - if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } - for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { - var key = __iter18[ __idx18 ]; + var __iter20 = attrs; + if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } + for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { + var key = __iter20[ __idx20 ]; if (( typeof(attrs[key]) ) == "function") { klass.__all_method_names__.push(key); f = attrs[key]; @@ -1257,20 +1290,20 @@ __create_class__ = function(class_name, parents, attrs, props) { } klass.__setters__ = []; klass.__getters__ = []; - var __iter19 = klass.__properties__; - if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } - for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { - var name = __iter19[ __idx19 ]; + var __iter21 = klass.__properties__; + if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } + for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { + var name = __iter21[ __idx21 ]; prop = klass.__properties__[name]; klass.__getters__.push(name); if (__test_if_true__(prop["set"])) { klass.__setters__.push(name); } } - var __iter20 = klass.__bases__; - if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } - for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { - var base = __iter20[ __idx20 ]; + var __iter22 = klass.__bases__; + if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } + for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { + var base = __iter22[ __idx22 ]; Array.prototype.push.apply(klass.__getters__, base.__getters__); Array.prototype.push.apply(klass.__setters__, base.__setters__); Array.prototype.push.apply(klass.__all_method_names__, base.__all_method_names__); @@ -1283,10 +1316,10 @@ __create_class__ = function(class_name, parents, attrs, props) { object.__dict__ = object; has_getattribute = false; has_getattr = false; - var __iter21 = klass.__all_method_names__; - if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } - for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { - var name = __iter21[ __idx21 ]; + var __iter23 = klass.__all_method_names__; + if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } + for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { + var name = __iter23[ __idx23 ]; if (( name ) == "__getattribute__") { has_getattribute = true; } else { @@ -1431,8 +1464,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 621: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 622: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 644: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 645: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1661,10 +1694,10 @@ _setup_str_prototype = function(args, kwargs) { arr = a["$wrapped"]; } i = 0; - var __iter22 = arr; - if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } - for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { - var value = __iter22[ __idx22 ]; + var __iter24 = arr; + if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } + for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { + var value = __iter24[ __idx24 ]; out += value; i += 1; if (( i ) < arr.length) { @@ -1706,10 +1739,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; - var __iter23 = this; - if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } - for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { - var char = __iter23[ __idx23 ]; + var __iter25 = this; + if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } + for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { + var char = __iter25[ __idx25 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1723,10 +1756,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."]; - var __iter24 = this; - if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } - for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { - var char = __iter24[ __idx24 ]; + var __iter26 = this; + if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } + for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { + var char = __iter26[ __idx26 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1753,10 +1786,10 @@ _setup_str_prototype = function(args, kwargs) { var keys,r; r = this; keys = Object.keys(fmt); - var __iter25 = keys; - if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } - for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { - var key = __iter25[ __idx25 ]; + var __iter27 = keys; + if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } + for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { + var key = __iter27[ __idx27 ]; r = r.split(key).join(fmt[key]); } r = r.split("{").join("").split("}").join(""); @@ -1903,10 +1936,10 @@ _setup_array_prototype = function(args, kwargs) { stop = this.length; } arr = [start, (stop - start)]; - var __iter26 = items; - if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } - for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { - var item = __iter26[ __idx26 ]; + var __iter28 = items; + if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } + for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { + var item = __iter28[ __idx28 ]; arr.push(item); } this.splice.apply(this, arr); @@ -1922,10 +1955,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); var extend = function(other) { - var __iter27 = other; - if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } - for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { - var obj = __iter27[ __idx27 ]; + var __iter29 = other; + if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } + for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { + var obj = __iter29[ __idx29 ]; this.push(obj); } return this; @@ -1957,10 +1990,10 @@ _setup_array_prototype = function(args, kwargs) { var count = function(obj) { var a; a = 0; - var __iter28 = this; - if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } - for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { - var item = __iter28[ __idx28 ]; + var __iter30 = this; + if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } + for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { + var item = __iter30[ __idx30 ]; if (( item ) === obj) { a += 1; } @@ -2016,10 +2049,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { - var __iter29 = this; - if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } - for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { - var item = __iter29[ __idx29 ]; + var __iter31 = this; + if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } + for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { + var item = __iter31[ __idx31 ]; if (( other.indexOf(item) ) == -1) { return false; } @@ -2187,12 +2220,12 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b,__iterator__34; - __iterator__34 = __get__(__get__(arr, "__iter__", "no iterator - line 1111: for b in arr:"), "__call__")([], __NULL_OBJECT__); - var __next__34; - __next__34 = __get__(__iterator__34, "next"); - while (( __iterator__34.index ) < __iterator__34.length) { - b = __next__34(); + var b,__iterator__36; + __iterator__36 = __get__(__get__(arr, "__iter__", "no iterator - line 1134: for b in arr:"), "__call__")([], __NULL_OBJECT__); + var __next__36; + __next__36 = __get__(__iterator__36, "next"); + while (( __iterator__36.index ) < __iterator__36.length) { + b = __next__36(); a += b; } return a; @@ -2228,7 +2261,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1131: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1154: return ob.__len__()"), "__call__")(); } } } @@ -2248,7 +2281,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1135: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1158: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2266,12 +2299,12 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__35; - __iterator__35 = __get__(__get__(objs, "__iter__", "no iterator - line 1140: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__35; - __next__35 = __get__(__iterator__35, "next"); - while (( __iterator__35.index ) < __iterator__35.length) { - ob = __next__35(); + var ob,__iterator__37; + __iterator__37 = __get__(__get__(objs, "__iter__", "no iterator - line 1163: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__37; + __next__37 = __get__(__iterator__37, "next"); + while (( __iterator__37.index ) < __iterator__37.length) { + ob = __next__37(); v = __get__(func, "__call__")([ob], __NULL_OBJECT__); arr.push(v); } @@ -2293,12 +2326,12 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__36; - __iterator__36 = __get__(__get__(objs, "__iter__", "no iterator - line 1148: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__36; - __next__36 = __get__(__iterator__36, "next"); - while (( __iterator__36.index ) < __iterator__36.length) { - ob = __next__36(); + var ob,__iterator__38; + __iterator__38 = __get__(__get__(objs, "__iter__", "no iterator - line 1171: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__38; + __next__38 = __get__(__iterator__38, "next"); + while (( __iterator__38.index ) < __iterator__38.length) { + ob = __next__38(); if (__test_if_true__(__get__(func, "__call__")([ob], __NULL_OBJECT__))) { arr.push(ob); } @@ -2320,12 +2353,12 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__37; - __iterator__37 = __get__(__get__(lst, "__iter__", "no iterator - line 1157: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__37; - __next__37 = __get__(__iterator__37, "next"); - while (( __iterator__37.index ) < __iterator__37.length) { - value = __next__37(); + var value,__iterator__39; + __iterator__39 = __get__(__get__(lst, "__iter__", "no iterator - line 1180: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__39; + __next__39 = __get__(__iterator__39, "next"); + while (( __iterator__39.index ) < __iterator__39.length) { + value = __next__39(); if (( a ) === null) { a = value; } else { @@ -2351,12 +2384,12 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__38; - __iterator__38 = __get__(__get__(lst, "__iter__", "no iterator - line 1164: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__38; - __next__38 = __get__(__iterator__38, "next"); - while (( __iterator__38.index ) < __iterator__38.length) { - value = __next__38(); + var value,__iterator__40; + __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1187: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__40; + __next__40 = __get__(__iterator__40, "next"); + while (( __iterator__40.index ) < __iterator__40.length) { + value = __next__40(); if (( a ) === null) { a = value; } else { @@ -2466,7 +2499,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1199: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1222: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2576,28 +2609,28 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o,__iterator__39; - __iterator__39 = __get__(__get__(ob, "__iter__", "no iterator - line 1254: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__39; - __next__39 = __get__(__iterator__39, "next"); - while (( __iterator__39.index ) < __iterator__39.length) { - o = __next__39(); + var o,__iterator__41; + __iterator__41 = __get__(__get__(ob, "__iter__", "no iterator - line 1277: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__41; + __next__41 = __get__(__iterator__41, "next"); + while (( __iterator__41.index ) < __iterator__41.length) { + o = __next__41(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1256: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1256: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1256: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1279: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1279: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1279: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1258: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1258: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1258: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1281: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1281: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1281: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key,__iterator__40; - __iterator__40 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1260: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__40; - __next__40 = __get__(__iterator__40, "next"); - while (( __iterator__40.index ) < __iterator__40.length) { - key = __next__40(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1261: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1262: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + var key,__iterator__42; + __iterator__42 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1283: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__42; + __next__42 = __get__(__iterator__42, "next"); + while (( __iterator__42.index ) < __iterator__42.length) { + key = __next__42(); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1284: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1285: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2623,16 +2656,16 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key,__iterator__41; - __iterator__41 = __get__(__get__(keys, "__iter__", "no iterator - line 1270: for key in keys:"), "__call__")([], __NULL_OBJECT__); - var __next__41; - __next__41 = __get__(__iterator__41, "next"); - while (( __iterator__41.index ) < __iterator__41.length) { - key = __next__41(); - value = __get__(self["$wrapped"], "__getitem__", "line 1271: value = self[...][key]")([key], __NULL_OBJECT__); + var key,__iterator__43; + __iterator__43 = __get__(__get__(keys, "__iter__", "no iterator - line 1293: for key in keys:"), "__call__")([], __NULL_OBJECT__); + var __next__43; + __next__43 = __get__(__iterator__43, "next"); + while (( __iterator__43.index ) < __iterator__43.length) { + key = __next__43(); + value = __get__(self["$wrapped"], "__getitem__", "line 1294: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1274: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1297: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2694,7 +2727,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1290: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1313: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2718,13 +2751,13 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key,__iterator__42; - __iterator__42 = __get__(__get__(other, "__iter__", "no iterator - line 1298: for key in other:"), "__call__")([], __NULL_OBJECT__); - var __next__42; - __next__42 = __get__(__iterator__42, "next"); - while (( __iterator__42.index ) < __iterator__42.length) { - key = __next__42(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1299: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1299: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + var key,__iterator__44; + __iterator__44 = __get__(__get__(other, "__iter__", "no iterator - line 1321: for key in other:"), "__call__")([], __NULL_OBJECT__); + var __next__44; + __next__44 = __get__(__iterator__44, "next"); + while (( __iterator__44.index ) < __iterator__44.length) { + key = __next__44(); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1322: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1322: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2743,13 +2776,13 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key,__iterator__43; - __iterator__43 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1303: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__43; - __next__43 = __get__(__iterator__43, "next"); - while (( __iterator__43.index ) < __iterator__43.length) { - key = __next__43(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1304: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + var key,__iterator__45; + __iterator__45 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1326: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__45; + __next__45 = __get__(__iterator__45, "next"); + while (( __iterator__45.index ) < __iterator__45.length) { + key = __next__45(); + __get__(__get__(arr, "append", "missing attribute `append` - line 1327: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2794,7 +2827,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1314: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1337: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -2930,10 +2963,10 @@ __dict_values = function(args, kwargs) { var self = __args__['self']; keys = Object.keys(self["$wrapped"]); out = []; - var __iter30 = keys; - if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } - for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { - var key = __iter30[ __idx30 ]; + var __iter32 = keys; + if (! (__iter32 instanceof Array || typeof __iter32 == "string" || __is_typed_array(__iter32)) ) { __iter32 = __object_keys__(__iter32) } + for (var __idx32=0; __idx32 < __iter32.length; __idx32++) { + var key = __iter32[ __idx32 ]; out.push(self["$wrapped"][key]); } return out; @@ -3020,10 +3053,10 @@ set = function(args, kwargs) { } fallback = false; if (__test_if_true__(hashtable)) { - var __iter31 = a; - if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } - for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { - var b = __iter31[ __idx31 ]; + var __iter33 = a; + if (! (__iter33 instanceof Array || typeof __iter33 == "string" || __is_typed_array(__iter33)) ) { __iter33 = __object_keys__(__iter33) } + for (var __idx33=0; __idx33 < __iter33.length; __idx33++) { + var b = __iter33[ __idx33 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[key] = b; @@ -3038,20 +3071,20 @@ set = function(args, kwargs) { } s = []; if (__test_if_true__(fallback)) { - var __iter32 = a; - if (! (__iter32 instanceof Array || typeof __iter32 == "string" || __is_typed_array(__iter32)) ) { __iter32 = __object_keys__(__iter32) } - for (var __idx32=0; __idx32 < __iter32.length; __idx32++) { - var item = __iter32[ __idx32 ]; + var __iter34 = a; + if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34)) ) { __iter34 = __object_keys__(__iter34) } + for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { + var item = __iter34[ __idx34 ]; if (( s.indexOf(item) ) == -1) { s.push(item); } } } else { __sort_method(keys); - var __iter33 = keys; - if (! (__iter33 instanceof Array || typeof __iter33 == "string" || __is_typed_array(__iter33)) ) { __iter33 = __object_keys__(__iter33) } - for (var __idx33=0; __idx33 < __iter33.length; __idx33++) { - var key = __iter33[ __idx33 ]; + var __iter35 = keys; + if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35)) ) { __iter35 = __object_keys__(__iter35) } + for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { + var key = __iter35[ __idx35 ]; s.push(hashtable[key]); } } @@ -3099,7 +3132,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1515: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1515: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1538: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1538: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3123,7 +3156,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1539: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1562: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3158,7 +3191,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1547: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1570: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3184,7 +3217,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1557: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1557: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1580: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1580: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3223,7 +3256,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1576: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1576: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1599: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1599: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3294,13 +3327,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1601: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1601: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1624: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1624: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1606: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1629: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3360,7 +3393,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1634: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1657: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3379,13 +3412,13 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value,__iterator__48; - __iterator__48 = __get__(__get__(lst, "__iter__", "no iterator - line 1638: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__48; - __next__48 = __get__(__iterator__48, "next"); - while (( __iterator__48.index ) < __iterator__48.length) { - value = __next__48(); - __get__(__get__(self, "append", "missing attribute `append` - line 1639: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + var value,__iterator__50; + __iterator__50 = __get__(__get__(lst, "__iter__", "no iterator - line 1661: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__50; + __next__50 = __get__(__iterator__50, "next"); + while (( __iterator__50.index ) < __iterator__50.length) { + value = __next__50(); + __get__(__get__(self, "append", "missing attribute `append` - line 1662: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3427,7 +3460,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1651: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1674: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3445,9 +3478,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1655: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1678: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1656: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1679: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3584,17 +3617,17 @@ json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (f __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; - var __iter34 = threading.workers; - if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34)) ) { __iter34 = __object_keys__(__iter34) } - for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { - var b = __iter34[ __idx34 ]; + var __iter36 = threading.workers; + if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36)) ) { __iter36 = __object_keys__(__iter36) } + for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { + var b = __iter36[ __idx36 ]; other = b["worker"]; args = b["args"]; if (( other ) !== worker) { - var __iter35 = args; - if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35)) ) { __iter35 = __object_keys__(__iter35) } - for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { - var arg = __iter35[ __idx35 ]; + var __iter37 = args; + if (! (__iter37 instanceof Array || typeof __iter37 == "string" || __is_typed_array(__iter37)) ) { __iter37 = __object_keys__(__iter37) } + for (var __idx37=0; __idx37 < __iter37.length; __idx37++) { + var arg = __iter37[ __idx37 ]; if (( arg ) === ob) { if (! (__contains__(a, other))) { a.append(other); @@ -3626,10 +3659,10 @@ __start_new_thread = function(f, args) { if (( event.data.type ) == "append") { a = args[event.data.argindex]; a.push(event.data.value); - var __iter36 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36)) ) { __iter36 = __object_keys__(__iter36) } - for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { - var other = __iter36[ __idx36 ]; + var __iter38 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter38 instanceof Array || typeof __iter38 == "string" || __is_typed_array(__iter38)) ) { __iter38 = __object_keys__(__iter38) } + for (var __idx38=0; __idx38 < __iter38.length; __idx38++) { + var other = __iter38[ __idx38 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); } } else { @@ -3641,10 +3674,10 @@ __start_new_thread = function(f, args) { } else { a[event.data.index] = value; } - var __iter37 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter37 instanceof Array || typeof __iter37 == "string" || __is_typed_array(__iter37)) ) { __iter37 = __object_keys__(__iter37) } - for (var __idx37=0; __idx37 < __iter37.length; __idx37++) { - var other = __iter37[ __idx37 ]; + var __iter39 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter39 instanceof Array || typeof __iter39 == "string" || __is_typed_array(__iter39)) ) { __iter39 = __object_keys__(__iter39) } + for (var __idx39=0; __idx39 < __iter39.length; __idx39++) { + var other = __iter39[ __idx39 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); } } else { @@ -3659,10 +3692,10 @@ __start_new_thread = function(f, args) { jsargs = []; var i; i = 0; - var __iter38 = args; - if (! (__iter38 instanceof Array || typeof __iter38 == "string" || __is_typed_array(__iter38)) ) { __iter38 = __object_keys__(__iter38) } - for (var __idx38=0; __idx38 < __iter38.length; __idx38++) { - var arg = __iter38[ __idx38 ]; + var __iter40 = args; + if (! (__iter40 instanceof Array || typeof __iter40 == "string" || __is_typed_array(__iter40)) ) { __iter40 = __object_keys__(__iter40) } + for (var __idx40=0; __idx40 < __iter40.length; __idx40++) { + var arg = __iter40[ __idx40 ]; if (__test_if_true__(arg.jsify)) { jsargs.append(arg.jsify()); } else { diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 6e3b2d6..7f7c298 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -328,8 +328,12 @@ def _visit_function(self, node): else: lines.append( 'glsljit.push("%s");' %(self.indent()+sub) ) - else: + + else: ## subroutine or method + if '`' in sub: sub = sub.replace('`', '') lines.append( '__shader_header__.push("%s");' %(self.indent()+sub) ) + + self._glsl = False #buffer += '\n'.join(body) self.pull() diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index d30bbc0..4cf627c 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -53,9 +53,11 @@ def define_structure(self, ob): arrays = [] floats = [] integers = [] + structs = [] struct_type = [] ## fallback for javascript objects - for key in ob.keys(): + #for key in ob.keys(): + for key in dir( ob ): t = typeof( ob[key] ) if t=='object' and instanceof(ob[key], Array) and ob[key].length and typeof(ob[key][0])=='number': struct_type.push( 'ARY_'+key ) @@ -69,6 +71,11 @@ def define_structure(self, ob): integers.push(key) else: pass ## TODO int16array + elif t=='object' and ob[key].__struct_name__: + struct_type.push( 'S_'+key) + structs.push( key ) + if ob[key].__struct_name__ not in self.struct_types: + self.define_structure( ob[key] ) if struct_name is None: #print('DEGUG: new struct name', ob.__struct_name__) @@ -85,6 +92,9 @@ def define_structure(self, ob): for key in arrays: arr = ob[key] member_list.append('float '+key+'['+arr.length+'];') + for key in structs: + subtype = ob[key].__struct_name__ + member_list.append( subtype+' '+key+';') members = ''.join(member_list) code = 'struct ' +struct_name+ ' {' +members+ '};' @@ -95,6 +105,7 @@ def define_structure(self, ob): 'arrays' : arrays, 'floats' : floats, 'integers': integers, + 'structs' : structs, 'code' : code } return struct_name @@ -130,6 +141,11 @@ def structure(self, ob, name): self.array(ob[key], aname) args.push( aname ) + for key in stype['structs']: + aname = '_'+key+name + self.structure(ob[key], aname) + args.push( aname ) + args = ','.join(args) self.shader.push( sname + ' ' +name+ '=' +sname+ '(' +args+ ');' ) @@ -435,6 +451,13 @@ def __jsdict_pop(ob, key, _default=None): ## this works because instances from PythonJS are created using Object.create(null) ## return JS("ob.pop(key, _default)") + + def dir(ob): + if instanceof(ob, Object): + return JS("Object.keys( ob )") + else: + return __object_keys__(ob) + def __object_keys__(ob): ''' notes: diff --git a/regtests/webclgl/gpu_class_three.py b/regtests/webclgl/gpu_class_three.py new file mode 100644 index 0000000..fdec344 --- /dev/null +++ b/regtests/webclgl/gpu_class_three.py @@ -0,0 +1,38 @@ +'''@gpu class three.js''' +import three + +three.Vector3.prototype.__struct_name__='ThreeVec3' + +@gpu.object +class MyObject: + @gpu.method + float def mymethod(self, s): + float s + return (self.vec.x + self.vec.y + self.vec.z) * s + + def __init__(self, x,y,z): + self.vec = new( three.Vector3(x,y,z) ) + + + +class myclass: + def run(self, w): + self.array = [ MyObject( 1.1, 1.2, 1.3 ) for x in range(w) ] + + @returns( array=64 ) + @gpu.main + def gpufunc(): + struct* A = self.array + float b = 0.0 + + for s in iter(A): + b += s.mymethod(1.1) + + return b + + return gpufunc() + +def main(): + m = myclass() + r = m.run(8) + print(r) From 8854d1805bbe665058555bc16505830635b79af8 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 24 Jun 2014 16:46:21 -0700 Subject: [PATCH 077/222] directly translate THREE.Vector3 to GLSL vec3. --- pythonjs/pythonjs.js | 90 +++++++++++++++-------------- pythonjs/runtime/builtins.py | 11 +++- regtests/webclgl/gpu_class_three.py | 3 +- 3 files changed, 58 insertions(+), 46 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 429f0b1..fafe434 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -522,11 +522,15 @@ GLSLJITRuntime.__init__ = function () { return GLSLJITRuntime.prototype.__init__ GLSLJITRuntime.prototype.compile_header = function() { var a,b; a = []; - var __iter1 = __jsdict_values(this.struct_types); + var __iter1 = this.struct_types; if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) ) { __iter1 = __object_keys__(__iter1) } for (var __idx1=0; __idx1 < __iter1.length; __idx1++) { - var stype = __iter1[ __idx1 ]; - a.push(stype["code"]); + var sname = __iter1[ __idx1 ]; + if (( sname ) == "vec3") { + /*pass*/ + } else { + a.push(this.struct_types[sname]["code"]); + } } a = "\n".join(a); b = "\n".join(this.header); @@ -585,7 +589,9 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { struct_type.push(("S_" + key)); structs.push(key); if (! (__contains__(this.struct_types, ob[key].__struct_name__))) { - this.define_structure(ob[key]); + if (( ob[key].__struct_name__ ) != "vec3") { + this.define_structure(ob[key]); + } } } } @@ -1464,8 +1470,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 644: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 645: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 649: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 650: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2221,7 +2227,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__36; - __iterator__36 = __get__(__get__(arr, "__iter__", "no iterator - line 1134: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__36 = __get__(__get__(arr, "__iter__", "no iterator - line 1139: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__36; __next__36 = __get__(__iterator__36, "next"); while (( __iterator__36.index ) < __iterator__36.length) { @@ -2261,7 +2267,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1154: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1159: return ob.__len__()"), "__call__")(); } } } @@ -2281,7 +2287,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1158: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1163: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2300,7 +2306,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__37; - __iterator__37 = __get__(__get__(objs, "__iter__", "no iterator - line 1163: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__37 = __get__(__get__(objs, "__iter__", "no iterator - line 1168: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__37; __next__37 = __get__(__iterator__37, "next"); while (( __iterator__37.index ) < __iterator__37.length) { @@ -2327,7 +2333,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__38; - __iterator__38 = __get__(__get__(objs, "__iter__", "no iterator - line 1171: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__38 = __get__(__get__(objs, "__iter__", "no iterator - line 1176: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__38; __next__38 = __get__(__iterator__38, "next"); while (( __iterator__38.index ) < __iterator__38.length) { @@ -2354,7 +2360,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__39; - __iterator__39 = __get__(__get__(lst, "__iter__", "no iterator - line 1180: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__39 = __get__(__get__(lst, "__iter__", "no iterator - line 1185: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__39; __next__39 = __get__(__iterator__39, "next"); while (( __iterator__39.index ) < __iterator__39.length) { @@ -2385,7 +2391,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__40; - __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1187: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1192: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2499,7 +2505,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1222: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1227: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2610,27 +2616,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__41; - __iterator__41 = __get__(__get__(ob, "__iter__", "no iterator - line 1277: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(ob, "__iter__", "no iterator - line 1282: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { o = __next__41(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1279: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1279: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1279: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1284: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1284: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1284: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1281: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1281: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1281: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1286: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1286: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1286: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__42; - __iterator__42 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1283: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1288: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { key = __next__42(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1284: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1285: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1289: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1290: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2657,15 +2663,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__43; - __iterator__43 = __get__(__get__(keys, "__iter__", "no iterator - line 1293: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(keys, "__iter__", "no iterator - line 1298: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { key = __next__43(); - value = __get__(self["$wrapped"], "__getitem__", "line 1294: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1299: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1297: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1302: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2727,7 +2733,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1313: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1318: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2752,12 +2758,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__44; - __iterator__44 = __get__(__get__(other, "__iter__", "no iterator - line 1321: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(other, "__iter__", "no iterator - line 1326: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { key = __next__44(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1322: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1322: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1327: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1327: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2777,12 +2783,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__45; - __iterator__45 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1326: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1331: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { key = __next__45(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1327: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1332: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2827,7 +2833,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1337: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1342: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -3132,7 +3138,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1538: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1538: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1543: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1543: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3156,7 +3162,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1562: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1567: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3191,7 +3197,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1570: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1575: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3217,7 +3223,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1580: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1580: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1585: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1585: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3256,7 +3262,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1599: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1599: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1604: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1604: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3327,13 +3333,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1624: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1624: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1629: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1629: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1629: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1634: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3393,7 +3399,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1657: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1662: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3413,12 +3419,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__50; - __iterator__50 = __get__(__get__(lst, "__iter__", "no iterator - line 1661: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__50 = __get__(__get__(lst, "__iter__", "no iterator - line 1666: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__50; __next__50 = __get__(__iterator__50, "next"); while (( __iterator__50.index ) < __iterator__50.length) { value = __next__50(); - __get__(__get__(self, "append", "missing attribute `append` - line 1662: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1667: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3460,7 +3466,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1674: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1679: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3478,9 +3484,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1678: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1683: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1679: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1684: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 4cf627c..7dce41b 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -28,8 +28,12 @@ def __init__(self, header): def compile_header(self): a = [] ## insert structs at top of header - for stype in self.struct_types.values(): - a.push( stype['code'] ) + for sname in self.struct_types: + if sname == 'vec3': + pass + else: + a.push( self.struct_types[sname]['code'] ) + a = '\n'.join(a) ## code in header could be methods that reference the struct types above. b = "\n".join(self.header) @@ -75,7 +79,8 @@ def define_structure(self, ob): struct_type.push( 'S_'+key) structs.push( key ) if ob[key].__struct_name__ not in self.struct_types: - self.define_structure( ob[key] ) + if ob[key].__struct_name__ != 'vec3': + self.define_structure( ob[key] ) if struct_name is None: #print('DEGUG: new struct name', ob.__struct_name__) diff --git a/regtests/webclgl/gpu_class_three.py b/regtests/webclgl/gpu_class_three.py index fdec344..28c0f6b 100644 --- a/regtests/webclgl/gpu_class_three.py +++ b/regtests/webclgl/gpu_class_three.py @@ -1,7 +1,8 @@ '''@gpu class three.js''' import three -three.Vector3.prototype.__struct_name__='ThreeVec3' +#three.Vector3.prototype.__struct_name__='ThreeVec3' ## this also works +three.Vector3.prototype.__struct_name__='vec3' @gpu.object class MyObject: From c184ba2ae4687189b8e6f50bf6ed598d0a5bb109 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 24 Jun 2014 17:23:11 -0700 Subject: [PATCH 078/222] gpu.object(class, name) function, updated GPU readme. --- doc/gpu.md | 28 ++++++++++ pythonjs/python_to_pythonjs.py | 19 ++++--- pythonjs/pythonjs.js | 82 ++++++++++++++++------------- pythonjs/runtime/builtins.py | 7 +++ regtests/webclgl/gpu_class_three.py | 3 +- 5 files changed, 92 insertions(+), 47 deletions(-) diff --git a/doc/gpu.md b/doc/gpu.md index d2e4b41..7f6cceb 100644 --- a/doc/gpu.md +++ b/doc/gpu.md @@ -346,3 +346,31 @@ class myclass: return gpufunc() ``` + +external type conversion +------------------------ +@gpu.object classes can also contain sub-structures and GLSL types: `vec3`. +To define a sub structure call the `gpu.object(class, name)` function. +The example below types THREE.js Vector3 as a GLSL `vec` type. + +``` +import three +gpu.object( three.Vector3, 'vec3' ) + +``` + +Then when a `three.Vector3` is assigned to an attribute in the __init__ function of the @gpu.object +class it will be inlined into the shader as a `vec3`. + +``` +@gpu.object +class MyObject: + def __init__(self, x,y,z, a,b,c): + self.vec1 = new( three.Vector3(x,y,z) ) + self.vec2 = new( three.Vector3(a,b,c) ) + + @gpu.method + float def mymethod(self): + return self.vec1.x + self.vec2.y + +``` \ No newline at end of file diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index b67e9d6..6a866ce 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -425,23 +425,23 @@ def visit_Dict(self, node): if isinstance(v, ast.Lambda): v.keep_as_lambda = True v = self.visit( v ) - if self._with_js: - a.append( '[%s,%s]'%(k,v) ) - elif self._with_dart or self._with_ll: + if self._with_dart or self._with_ll: a.append( '%s:%s'%(k,v) ) #if isinstance(node.keys[i], ast.Str): # a.append( '%s:%s'%(k,v) ) #else: # a.append( '"%s":%s'%(k,v) ) + elif self._with_js: + a.append( '[%s,%s]'%(k,v) ) else: a.append( 'JSObject(key=%s, value=%s)'%(k,v) ) ## this allows non-string keys - if self._with_js: - b = ','.join( a ) - return '__jsdict( [%s] )' %b - elif self._with_dart or self._with_ll: + if self._with_dart or self._with_ll: b = ','.join( a ) return '{%s}' %b + elif self._with_js: + b = ','.join( a ) + return '__jsdict( [%s] )' %b else: b = '[%s]' %', '.join(a) return '__get__(dict, "__call__")([], {"js_object":%s})' %b @@ -3460,7 +3460,10 @@ def visit_With(self, node): writer.pull() elif isinstance( node.context_expr, Name ) and node.context_expr.id == 'lowlevel': self._with_ll = True - map(self.visit, node.body) + #map(self.visit, node.body) + for b in node.body: + a = self.visit(b) + if a: writer.write(a) self._with_ll = False elif isinstance( node.context_expr, Name ) and node.context_expr.id == 'javascript': self._with_js = True diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index fafe434..2591e37 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -496,6 +496,12 @@ KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Obj ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError"; AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError"; RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError"; +__gpu_object = function(cls, struct_name) { + + cls.prototype.__struct_name__ = struct_name; +} + +gpu = { "object":__gpu_object }; glsljit_runtime = function(header) { return new GLSLJITRuntime(header); @@ -1470,8 +1476,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 649: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 650: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 656: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 657: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2227,7 +2233,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__36; - __iterator__36 = __get__(__get__(arr, "__iter__", "no iterator - line 1139: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__36 = __get__(__get__(arr, "__iter__", "no iterator - line 1146: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__36; __next__36 = __get__(__iterator__36, "next"); while (( __iterator__36.index ) < __iterator__36.length) { @@ -2267,7 +2273,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1159: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1166: return ob.__len__()"), "__call__")(); } } } @@ -2287,7 +2293,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1163: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1170: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2306,7 +2312,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__37; - __iterator__37 = __get__(__get__(objs, "__iter__", "no iterator - line 1168: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__37 = __get__(__get__(objs, "__iter__", "no iterator - line 1175: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__37; __next__37 = __get__(__iterator__37, "next"); while (( __iterator__37.index ) < __iterator__37.length) { @@ -2333,7 +2339,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__38; - __iterator__38 = __get__(__get__(objs, "__iter__", "no iterator - line 1176: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__38 = __get__(__get__(objs, "__iter__", "no iterator - line 1183: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__38; __next__38 = __get__(__iterator__38, "next"); while (( __iterator__38.index ) < __iterator__38.length) { @@ -2360,7 +2366,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__39; - __iterator__39 = __get__(__get__(lst, "__iter__", "no iterator - line 1185: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__39 = __get__(__get__(lst, "__iter__", "no iterator - line 1192: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__39; __next__39 = __get__(__iterator__39, "next"); while (( __iterator__39.index ) < __iterator__39.length) { @@ -2391,7 +2397,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__40; - __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1192: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1199: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2505,7 +2511,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1227: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1234: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2616,27 +2622,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__41; - __iterator__41 = __get__(__get__(ob, "__iter__", "no iterator - line 1282: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(ob, "__iter__", "no iterator - line 1289: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { o = __next__41(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1284: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1284: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1284: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1291: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1291: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1291: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1286: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1286: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1286: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1293: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1293: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1293: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__42; - __iterator__42 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1288: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1295: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { key = __next__42(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1289: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1290: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1296: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1297: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2663,15 +2669,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__43; - __iterator__43 = __get__(__get__(keys, "__iter__", "no iterator - line 1298: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(keys, "__iter__", "no iterator - line 1305: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { key = __next__43(); - value = __get__(self["$wrapped"], "__getitem__", "line 1299: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1306: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1302: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1309: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2733,7 +2739,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1318: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1325: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2758,12 +2764,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__44; - __iterator__44 = __get__(__get__(other, "__iter__", "no iterator - line 1326: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(other, "__iter__", "no iterator - line 1333: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { key = __next__44(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1327: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1327: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1334: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1334: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2783,12 +2789,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__45; - __iterator__45 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1331: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1338: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { key = __next__45(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1332: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1339: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2833,7 +2839,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1342: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1349: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -3138,7 +3144,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1543: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1543: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1550: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1550: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3162,7 +3168,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1567: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1574: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3197,7 +3203,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1575: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1582: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3223,7 +3229,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1585: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1585: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1592: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1592: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3262,7 +3268,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1604: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1604: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1611: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1611: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3333,13 +3339,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1629: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1629: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1636: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1636: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1634: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1641: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3399,7 +3405,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1662: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1669: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3419,12 +3425,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__50; - __iterator__50 = __get__(__get__(lst, "__iter__", "no iterator - line 1666: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__50 = __get__(__get__(lst, "__iter__", "no iterator - line 1673: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__50; __next__50 = __get__(__iterator__50, "next"); while (( __iterator__50.index ) < __iterator__50.length) { value = __next__50(); - __get__(__get__(self, "append", "missing attribute `append` - line 1667: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1674: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3466,7 +3472,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1679: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1686: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3484,9 +3490,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1683: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1690: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1684: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1691: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 7dce41b..bb61b59 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -16,6 +16,13 @@ JS('RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError";') with javascript: + def __gpu_object(cls, struct_name): + cls.prototype.__struct_name__ = struct_name + with lowlevel: + gpu = { + 'object' : __gpu_object + } + def glsljit_runtime(header): return new( GLSLJITRuntime(header) ) diff --git a/regtests/webclgl/gpu_class_three.py b/regtests/webclgl/gpu_class_three.py index 28c0f6b..4ab6564 100644 --- a/regtests/webclgl/gpu_class_three.py +++ b/regtests/webclgl/gpu_class_three.py @@ -2,7 +2,8 @@ import three #three.Vector3.prototype.__struct_name__='ThreeVec3' ## this also works -three.Vector3.prototype.__struct_name__='vec3' +#three.Vector3.prototype.__struct_name__='vec3' +gpu.object( three.Vector3, 'vec3' ) @gpu.object class MyObject: From 07f1fbb9a7fc06c625e6074612a1ba87a02f5881 Mon Sep 17 00:00:00 2001 From: anatoly techtonik Date: Wed, 25 Jun 2014 06:28:12 +0300 Subject: [PATCH 079/222] README.md: move translate.py entrypoint above it all --- README.md | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index fb15cad..1d96829 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,34 @@ Introduction ------------ -PythonJS is a transpiler written in Python that converts Python into fast JavaScript. It can be run with regular Python, or fully self-hosted within NodeJS using Empythoned. PythonJS has been designed with speed and easy integration with existing JavaScript code in mind. +PythonJS is a transpiler written in Python that converts Python into fast +JavaScript. It can be run with regular Python, or fully self-hosted within +NodeJS using Empythoned. PythonJS has been designed with speed and easy +integration with existing JavaScript code in mind. + + +Using translator.py Without Installing +-------------------------------------- +To simply convert your python script into javascript, git clone this repo, and +use translator.py located in the "pythonjs" directory. You can give it a list +of python files to translate at once. It will output the translation to +stdout. The default output type is JavaScript. + +Usage:: + + translator.py [--dart|--coffee|--lua] file.py + +Example:: + + cd PythonJS/pythonjs + ./translator.py myscript.py > myscript.js + + Installing ------------- - npm install python-js +``` +npm install python-js +``` NodeJS Quick Example -------------- @@ -71,20 +95,6 @@ A Python typed subset can be translated to a GLSL fragment shader to speed up ma -translator.py ------------- -To simply convert your python script into javascript, git clone this repo, and use translator.py located in the "pythonjs" directory. You can give it a list of python files to translate at once. It will output the translation to stdout. The default output type is JavaScript. - -Usage:: - - translator.py [--dart|--coffee|--lua] file.py - -Example:: - - cd PythonJS/pythonjs - ./translator.py myscript.py > myscript.js - - Supported Features ================ From 2053ec4449f90a0fc2c40b215b349612c789c298 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 24 Jun 2014 22:20:12 -0700 Subject: [PATCH 080/222] prototype of sibling gpu class --- pythonjs/python_to_pythonjs.py | 15 +++++--- regtests/webclgl/gpu_sibling_class.py | 55 +++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 regtests/webclgl/gpu_sibling_class.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 6a866ce..b5a5676 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -303,9 +303,10 @@ def get_typedef(self, instance=None, class_name=None): if class_name: #assert class_name in self._classes if class_name not in self._classes: - log('ERROR: class name not in self._classes: %s'%class_name) - log('self._classes: %s'%self._classes) - raise RuntimeError('class name: %s - not found in self._classes - node:%s '%(class_name, instance)) + #log('ERROR: class name not in self._classes: %s'%class_name) + #log('self._classes: %s'%self._classes) + #raise RuntimeError('class name: %s - not found in self._classes - node:%s '%(class_name, instance)) + return None ## TODO hook into self._typedef_vars if class_name not in self._typedefs: self._typedefs[ class_name ] = Typedef( @@ -1464,7 +1465,8 @@ def visit_USub(self, node): def visit_Attribute(self, node): - ## in some cases the translator knows what type a node is and what attribute's it has, in those cases the call to `__get__` can be optimized away, + + ## TODO check if this is always safe. if isinstance(node.value, Name): typedef = self.get_typedef( instance=node.value ) elif hasattr(node.value, 'returns_type'): @@ -1492,7 +1494,7 @@ def visit_Attribute(self, node): elif self._with_lua and self._in_assign_target: ## this is required because lua has no support for inplace assignment ops like "+=" return '%s.%s' %(node_value, node.attr) - elif typedef and node.attr in typedef.attributes: + elif typedef and node.attr in typedef.attributes: ## optimize away `__get__` return '%s.%s' %(node_value, node.attr) elif hasattr(node, 'lineno'): @@ -1767,7 +1769,8 @@ def _visit_assign_helper(self, node, target): writer.write(code) elif isinstance(target, Name) and self._with_glsl: ## assignment to variable - assert target.id in self._typedef_vars + if target.id not in self._typedef_vars: + raise SyntaxError(self.format_error('untyped variable')) node_value = self.visit( node.value ) ## node.value may have extra attributes after being visited if node_value in self._typedef_vars: diff --git a/regtests/webclgl/gpu_sibling_class.py b/regtests/webclgl/gpu_sibling_class.py new file mode 100644 index 0000000..398b11e --- /dev/null +++ b/regtests/webclgl/gpu_sibling_class.py @@ -0,0 +1,55 @@ +'''@gpu sibling class''' +import three + +gpu.object( three.Vector3, 'vec3' ) + +@gpu.object +class Other: + @gpu.method + def __init__(self, a, b): + vec3 a + vec3 b + self.vecA = a + self.vecB = b + + @gpu.method + float def omethod(self, s): + float s + return (self.vecA.x + self.vecA.y + self.vecB.z) * s + + +@gpu.object +class MyObject: + @typedef( o=Other ) + @gpu.method + float def mymethod(self, s): + float s + o = Other( self.v1, self.v2 ) + return o.omethod(s) + + def __init__(self, x,y,z): + self.v1 = new( three.Vector3(x,y,z) ) + self.v2 = new( three.Vector3(x,y,z) ) + + +class myclass: + def run(self, w): + self.array = [ MyObject( 1.1, 1.2, 1.3 ) for x in range(w) ] + + @returns( array=64 ) + @gpu.main + def gpufunc(): + struct* A = self.array + float b = 0.0 + + for s in iter(A): + b += s.mymethod(1.1) + + return b + + return gpufunc() + +def main(): + m = myclass() + r = m.run(8) + print(r) From ba9a5728cdf5b2dd392d57710178e2c576ada929 Mon Sep 17 00:00:00 2001 From: anatoly techtonik Date: Wed, 25 Jun 2014 08:52:56 +0300 Subject: [PATCH 081/222] README.md: No need to cd pythonjs twice --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1d96829..5fc0297 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Usage:: Example:: - cd PythonJS/pythonjs + cd pythonjs ./translator.py myscript.py > myscript.js From fbd5a5d71fd5c2c2e57ae277c669f3cff4257f25 Mon Sep 17 00:00:00 2001 From: anatoly techtonik Date: Wed, 25 Jun 2014 10:39:39 +0300 Subject: [PATCH 082/222] translator.py: add --help --- pythonjs/translator.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pythonjs/translator.py b/pythonjs/translator.py index 12cdd83..c8223b5 100755 --- a/pythonjs/translator.py +++ b/pythonjs/translator.py @@ -8,6 +8,10 @@ from pythonjs_to_lua import main as pythonjs_to_lua from pythonjs_to_luajs import main as pythonjs_to_luajs +cmdhelp = """\ +usage: translator.py [--dart|--coffee|--lua] file.py + translator.py --visjs file.py\ +""" def main(script): if '--visjs' in sys.argv: @@ -50,6 +54,10 @@ def main(script): return code def command(): + if '-h' in sys.argv or '--help' in sys.argv: + print(cmdhelp) + return + scripts = [] if len(sys.argv) > 1: for arg in sys.argv[1:]: From a89e79717bd0c1395c1f6c47635195472260f65c Mon Sep 17 00:00:00 2001 From: anatoly techtonik Date: Wed, 25 Jun 2014 14:38:37 +0300 Subject: [PATCH 083/222] improve SyntaxError message with full stack info SyntaxError: line 193 _adam7 = ((0, 0, 8, 8), (4, 0, 8, 8), (0, 4, 4, 8), <_ast.BinOp object at 0x029281B0> Depth Stack: FunctionDef line:201 col:0 Return line:203 col:4 Call line:203 col:11 BinOp line:203 col:16 --- pythonjs/python_to_pythonjs.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 6a866ce..5360e20 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -125,7 +125,12 @@ def format_error(self, node): if self._line_number+1 < len(self._source): lines.append( self._source[self._line_number+1] ) - return 'line %s\n%s\n%s' %(self._line_number, '\n'.join(lines), node) + msg = 'line %s\n%s\n%s\n' %(self._line_number, '\n'.join(lines), node) + msg += 'Depth Stack:\n' + for l, n in enumerate(self._stack): + #msg += str(dir(n)) + msg += '%s%s line:%s col:%s\n' % (' '*(l+1)*2, n.__class__.__name__, n.lineno, n.col_offset) + return msg def __init__(self, source=None, module=None, module_path=None, dart=False, coffee=False, lua=False): @@ -136,6 +141,7 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._line = None self._line_number = 0 + self._stack = [] ## current path to the root self._direct_operators = set() ## optimize "+" and "*" operator self._with_ll = False ## lowlevel @@ -247,6 +253,16 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe else: self.visit(node) + def visit(self, node): + """Visit a node.""" + ## modified code of visit() method from Python 2.7 stdlib + self._stack.append(node) + method = 'visit_' + node.__class__.__name__ + visitor = getattr(self, method, self.generic_visit) + res = visitor(node) + self._stack.pop() + return res + def has_webworkers(self): return len(self._webworker_functions.keys()) From e875860a03a832b09ad29728cc17b6f5f1e1f5f7 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 25 Jun 2014 20:48:42 -0700 Subject: [PATCH 084/222] @gpu.object fixed nested gpu object. --- pythonjs/python_to_pythonjs.py | 13 +++++++++++-- regtests/webclgl/gpu_sibling_class.py | 14 ++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index b5a5676..44a6e88 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2082,8 +2082,17 @@ def visit_Call(self, node): F = self.visit(node.func) args = [self.visit(arg) for arg in node.args] if hasattr(self, '_in_gpu_method') and self._in_gpu_method and isinstance(node.func, ast.Attribute): - F = '%s_%s' %(self._in_gpu_method, node.func.attr) - args.insert(0, 'self') + fv = self.visit(node.func.value) + if fv == 'self': + clsname = self._in_gpu_method + args.insert(0, 'self') + else: + fvt = fv.split('.')[-1] + clsname = self._typedef_vars[ fvt ] + args.insert(0, fv) + + F = '%s_%s' %(clsname, node.func.attr) + if node.keywords: args.extend( [self.visit(x.value) for x in node.keywords] ) diff --git a/regtests/webclgl/gpu_sibling_class.py b/regtests/webclgl/gpu_sibling_class.py index 398b11e..5696e41 100644 --- a/regtests/webclgl/gpu_sibling_class.py +++ b/regtests/webclgl/gpu_sibling_class.py @@ -5,10 +5,10 @@ @gpu.object class Other: - @gpu.method + #@gpu.method def __init__(self, a, b): - vec3 a - vec3 b + #vec3 a + #vec3 b self.vecA = a self.vecB = b @@ -20,16 +20,18 @@ def __init__(self, a, b): @gpu.object class MyObject: - @typedef( o=Other ) + @typedef( ob=Other ) @gpu.method float def mymethod(self, s): float s - o = Other( self.v1, self.v2 ) - return o.omethod(s) + #o = Other( self.v1, self.v2 ) + #return o.omethod(s) + return self.ob.omethod(s) def __init__(self, x,y,z): self.v1 = new( three.Vector3(x,y,z) ) self.v2 = new( three.Vector3(x,y,z) ) + self.ob = Other(self.v1, self.v2) class myclass: From fd41f7ef1921a21ad3bc249193a42f8b058c1568 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 26 Jun 2014 23:26:17 -0700 Subject: [PATCH 085/222] glsl mat4 and reg testing THREE.Matrix4 --- pythonjs/pythonjs.js | 289 ++++++++++++++++------------ pythonjs/runtime/builtins.py | 76 +++++--- pythonjs/typedpython.py | 5 +- regtests/webclgl/gpu_class_three.py | 5 + 4 files changed, 223 insertions(+), 152 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 2591e37..d42b60e 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -522,6 +522,7 @@ GLSLJITRuntime.prototype.__init__ = function(header) { this.shader = []; this.object_packagers = []; this.struct_types = __jsdict([]); + this.glsltypes = ["vec2", "vec3", "vec4", "mat4", "mat4x4"]; } GLSLJITRuntime.__init__ = function () { return GLSLJITRuntime.prototype.__init__.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; @@ -532,7 +533,7 @@ GLSLJITRuntime.prototype.compile_header = function() { if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) ) { __iter1 = __object_keys__(__iter1) } for (var __idx1=0; __idx1 < __iter1.length; __idx1++) { var sname = __iter1[ __idx1 ]; - if (( sname ) == "vec3") { + if (__contains__(this.glsltypes, sname)) { /*pass*/ } else { a.push(this.struct_types[sname]["code"]); @@ -570,10 +571,16 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { integers = []; structs = []; struct_type = []; + if (__test_if_true__(struct_name && __contains__(this.glsltypes, struct_name) && Object.hasOwnProperty.call(ob, "elements"))) { + return struct_name; + } var __iter2 = dir(ob); if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { var key = __iter2[ __idx2 ]; + if (__test_if_true__(( key.length ) == 1 && __contains__("0123456789", key))) { + throw new RuntimeError(key); + } t = typeof(ob[key]); if (__test_if_true__(( t ) == "object" && ob[key] instanceof Array && ob[key].length && ( typeof(ob[key][0]) ) == "number")) { struct_type.push(("ARY_" + key)); @@ -595,7 +602,9 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { struct_type.push(("S_" + key)); structs.push(key); if (! (__contains__(this.struct_types, ob[key].__struct_name__))) { - if (( ob[key].__struct_name__ ) != "vec3") { + if (__contains__(this.glsltypes, ob[key].__struct_name__)) { + /*pass*/ + } else { this.define_structure(ob[key]); } } @@ -636,6 +645,9 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { subtype = ob[key].__struct_name__; member_list.append((((subtype + " ") + key) + ";")); } + if (( len(member_list) ) == 0) { + throw new RuntimeError(struct_name); + } members = "".join(member_list); code = (((("struct " + struct_name) + " {") + members) + "};"); console.log("-------struct glsl code-------"); @@ -662,39 +674,62 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { if (__test_if_true__(wrapper)) { wrapper.__struct_name__ = sname; } - stype = this.struct_types[sname]; args = []; - var __iter7 = stype["integers"]; - if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } - for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { - var key = __iter7[ __idx7 ]; - args.push((ob[key][0] + "")); - } - var __iter8 = stype["floats"]; - if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } - for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { - var key = __iter8[ __idx8 ]; - value = (ob[key] + ""); - if (! (__contains__(value, "."))) { - value += ".0"; - } - args.push(value); - } - var __iter9 = stype["arrays"]; - if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } - for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { - var key = __iter9[ __idx9 ]; - aname = (("_" + key) + name); - this.array(ob[key], aname); - args.push(aname); - } - var __iter10 = stype["structs"]; - if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } - for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { - var key = __iter10[ __idx10 ]; - aname = (("_" + key) + name); - this.structure(ob[key], aname); - args.push(aname); + stype = this.struct_types[sname]; + if (! (__contains__(this.struct_types, sname))) { + if (__contains__(this.glsltypes, sname)) { + if (__test_if_true__(( sname ) == "mat4" || ( sname ) == "mat4x4")) { + if (__test_if_true__(Object.hasOwnProperty.call(ob, "elements"))) { + var i,i__end__; + i = 0; + i__end__ = ob.elements.length; + while (( i ) < i__end__) { + value = (ob.elements[i] + ""); + if (! (__contains__(value, "."))) { + value += ".0"; + } + args.push(value); + i += 1; + } + } + } + } else { + throw new RuntimeError(("no method to pack structure: " + sname)); + } + } + if (__test_if_true__(stype)) { + var __iter7 = stype["integers"]; + if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } + for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { + var key = __iter7[ __idx7 ]; + args.push((ob[key][0] + "")); + } + var __iter8 = stype["floats"]; + if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } + for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { + var key = __iter8[ __idx8 ]; + value = (ob[key] + ""); + if (! (__contains__(value, "."))) { + value += ".0"; + } + args.push(value); + } + var __iter9 = stype["arrays"]; + if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } + for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { + var key = __iter9[ __idx9 ]; + aname = (("_" + key) + name); + this.array(ob[key], aname); + args.push(aname); + } + var __iter10 = stype["structs"]; + if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } + for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { + var key = __iter10[ __idx10 ]; + aname = (("_" + key) + name); + this.structure(ob[key], aname); + args.push(aname); + } } args = ",".join(args); this.shader.push((((((((sname + " ") + name) + "=") + sname) + "(") + args) + ");")); @@ -1476,8 +1511,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 656: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 657: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 684: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 685: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2232,12 +2267,12 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b,__iterator__36; - __iterator__36 = __get__(__get__(arr, "__iter__", "no iterator - line 1146: for b in arr:"), "__call__")([], __NULL_OBJECT__); - var __next__36; - __next__36 = __get__(__iterator__36, "next"); - while (( __iterator__36.index ) < __iterator__36.length) { - b = __next__36(); + var b,__iterator__37; + __iterator__37 = __get__(__get__(arr, "__iter__", "no iterator - line 1174: for b in arr:"), "__call__")([], __NULL_OBJECT__); + var __next__37; + __next__37 = __get__(__iterator__37, "next"); + while (( __iterator__37.index ) < __iterator__37.length) { + b = __next__37(); a += b; } return a; @@ -2273,7 +2308,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1166: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1194: return ob.__len__()"), "__call__")(); } } } @@ -2293,7 +2328,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1170: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1198: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2311,12 +2346,12 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__37; - __iterator__37 = __get__(__get__(objs, "__iter__", "no iterator - line 1175: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__37; - __next__37 = __get__(__iterator__37, "next"); - while (( __iterator__37.index ) < __iterator__37.length) { - ob = __next__37(); + var ob,__iterator__38; + __iterator__38 = __get__(__get__(objs, "__iter__", "no iterator - line 1203: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__38; + __next__38 = __get__(__iterator__38, "next"); + while (( __iterator__38.index ) < __iterator__38.length) { + ob = __next__38(); v = __get__(func, "__call__")([ob], __NULL_OBJECT__); arr.push(v); } @@ -2338,12 +2373,12 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__38; - __iterator__38 = __get__(__get__(objs, "__iter__", "no iterator - line 1183: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__38; - __next__38 = __get__(__iterator__38, "next"); - while (( __iterator__38.index ) < __iterator__38.length) { - ob = __next__38(); + var ob,__iterator__39; + __iterator__39 = __get__(__get__(objs, "__iter__", "no iterator - line 1211: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__39; + __next__39 = __get__(__iterator__39, "next"); + while (( __iterator__39.index ) < __iterator__39.length) { + ob = __next__39(); if (__test_if_true__(__get__(func, "__call__")([ob], __NULL_OBJECT__))) { arr.push(ob); } @@ -2365,12 +2400,12 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__39; - __iterator__39 = __get__(__get__(lst, "__iter__", "no iterator - line 1192: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__39; - __next__39 = __get__(__iterator__39, "next"); - while (( __iterator__39.index ) < __iterator__39.length) { - value = __next__39(); + var value,__iterator__40; + __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1220: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__40; + __next__40 = __get__(__iterator__40, "next"); + while (( __iterator__40.index ) < __iterator__40.length) { + value = __next__40(); if (( a ) === null) { a = value; } else { @@ -2396,12 +2431,12 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__40; - __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1199: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__40; - __next__40 = __get__(__iterator__40, "next"); - while (( __iterator__40.index ) < __iterator__40.length) { - value = __next__40(); + var value,__iterator__41; + __iterator__41 = __get__(__get__(lst, "__iter__", "no iterator - line 1227: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__41; + __next__41 = __get__(__iterator__41, "next"); + while (( __iterator__41.index ) < __iterator__41.length) { + value = __next__41(); if (( a ) === null) { a = value; } else { @@ -2511,7 +2546,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1234: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1262: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2621,28 +2656,28 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o,__iterator__41; - __iterator__41 = __get__(__get__(ob, "__iter__", "no iterator - line 1289: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__41; - __next__41 = __get__(__iterator__41, "next"); - while (( __iterator__41.index ) < __iterator__41.length) { - o = __next__41(); + var o,__iterator__42; + __iterator__42 = __get__(__get__(ob, "__iter__", "no iterator - line 1317: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__42; + __next__42 = __get__(__iterator__42, "next"); + while (( __iterator__42.index ) < __iterator__42.length) { + o = __next__42(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1291: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1291: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1291: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1319: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1319: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1319: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1293: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1293: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1293: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1321: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1321: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1321: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key,__iterator__42; - __iterator__42 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1295: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__42; - __next__42 = __get__(__iterator__42, "next"); - while (( __iterator__42.index ) < __iterator__42.length) { - key = __next__42(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1296: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1297: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + var key,__iterator__43; + __iterator__43 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1323: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__43; + __next__43 = __get__(__iterator__43, "next"); + while (( __iterator__43.index ) < __iterator__43.length) { + key = __next__43(); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1324: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1325: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2668,16 +2703,16 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key,__iterator__43; - __iterator__43 = __get__(__get__(keys, "__iter__", "no iterator - line 1305: for key in keys:"), "__call__")([], __NULL_OBJECT__); - var __next__43; - __next__43 = __get__(__iterator__43, "next"); - while (( __iterator__43.index ) < __iterator__43.length) { - key = __next__43(); - value = __get__(self["$wrapped"], "__getitem__", "line 1306: value = self[...][key]")([key], __NULL_OBJECT__); + var key,__iterator__44; + __iterator__44 = __get__(__get__(keys, "__iter__", "no iterator - line 1333: for key in keys:"), "__call__")([], __NULL_OBJECT__); + var __next__44; + __next__44 = __get__(__iterator__44, "next"); + while (( __iterator__44.index ) < __iterator__44.length) { + key = __next__44(); + value = __get__(self["$wrapped"], "__getitem__", "line 1334: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1309: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1337: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2739,7 +2774,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1325: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1353: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2763,13 +2798,13 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key,__iterator__44; - __iterator__44 = __get__(__get__(other, "__iter__", "no iterator - line 1333: for key in other:"), "__call__")([], __NULL_OBJECT__); - var __next__44; - __next__44 = __get__(__iterator__44, "next"); - while (( __iterator__44.index ) < __iterator__44.length) { - key = __next__44(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1334: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1334: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + var key,__iterator__45; + __iterator__45 = __get__(__get__(other, "__iter__", "no iterator - line 1361: for key in other:"), "__call__")([], __NULL_OBJECT__); + var __next__45; + __next__45 = __get__(__iterator__45, "next"); + while (( __iterator__45.index ) < __iterator__45.length) { + key = __next__45(); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1362: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1362: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2788,13 +2823,13 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key,__iterator__45; - __iterator__45 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1338: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__45; - __next__45 = __get__(__iterator__45, "next"); - while (( __iterator__45.index ) < __iterator__45.length) { - key = __next__45(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1339: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + var key,__iterator__46; + __iterator__46 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1366: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__46; + __next__46 = __get__(__iterator__46, "next"); + while (( __iterator__46.index ) < __iterator__46.length) { + key = __next__46(); + __get__(__get__(arr, "append", "missing attribute `append` - line 1367: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2839,7 +2874,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1349: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1377: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -3144,7 +3179,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1550: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1550: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1578: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1578: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3168,7 +3203,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1574: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1602: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3203,7 +3238,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1582: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1610: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3229,7 +3264,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1592: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1592: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1620: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1620: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3268,7 +3303,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1611: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1611: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1639: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1639: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3339,13 +3374,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1636: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1636: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1664: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1664: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1641: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1669: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3405,7 +3440,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1669: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1697: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3424,13 +3459,13 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value,__iterator__50; - __iterator__50 = __get__(__get__(lst, "__iter__", "no iterator - line 1673: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__50; - __next__50 = __get__(__iterator__50, "next"); - while (( __iterator__50.index ) < __iterator__50.length) { - value = __next__50(); - __get__(__get__(self, "append", "missing attribute `append` - line 1674: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + var value,__iterator__51; + __iterator__51 = __get__(__get__(lst, "__iter__", "no iterator - line 1701: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__51; + __next__51 = __get__(__iterator__51, "next"); + while (( __iterator__51.index ) < __iterator__51.length) { + value = __next__51(); + __get__(__get__(self, "append", "missing attribute `append` - line 1702: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3472,7 +3507,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1686: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1714: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3490,9 +3525,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1690: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1718: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1691: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1719: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index bb61b59..873b60a 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -32,11 +32,12 @@ def __init__(self, header): self.shader = [] self.object_packagers = [] self.struct_types = {} + self.glsltypes = ['vec2', 'vec3', 'vec4', 'mat4', 'mat4x4'] def compile_header(self): a = [] ## insert structs at top of header for sname in self.struct_types: - if sname == 'vec3': + if sname in self.glsltypes: pass else: a.push( self.struct_types[sname]['code'] ) @@ -67,8 +68,14 @@ def define_structure(self, ob): structs = [] struct_type = [] ## fallback for javascript objects + if struct_name and struct_name in self.glsltypes and Object.hasOwnProperty.call(ob, 'elements'): + #ob = ob.elements + return struct_name + #for key in ob.keys(): for key in dir( ob ): + if key.length==1 and key in '0123456789': + raise RuntimeError(key) t = typeof( ob[key] ) if t=='object' and instanceof(ob[key], Array) and ob[key].length and typeof(ob[key][0])=='number': struct_type.push( 'ARY_'+key ) @@ -86,7 +93,9 @@ def define_structure(self, ob): struct_type.push( 'S_'+key) structs.push( key ) if ob[key].__struct_name__ not in self.struct_types: - if ob[key].__struct_name__ != 'vec3': + if ob[key].__struct_name__ in self.glsltypes: + pass + else: self.define_structure( ob[key] ) if struct_name is None: @@ -108,6 +117,9 @@ def define_structure(self, ob): subtype = ob[key].__struct_name__ member_list.append( subtype+' '+key+';') + if len(member_list)==0: + raise RuntimeError(struct_name) + members = ''.join(member_list) code = 'struct ' +struct_name+ ' {' +members+ '};' print('-------struct glsl code-------') @@ -133,30 +145,46 @@ def structure(self, ob, name): sname = self.define_structure(ob) if wrapper: wrapper.__struct_name__ = sname - stype = self.struct_types[ sname ] + args = [] + stype = self.struct_types[ sname ] + + # if stype is None: ## TODO fix me + if sname not in self.struct_types: + if sname in self.glsltypes: + if sname == 'mat4' or sname == 'mat4x4': - for key in stype['integers']: - args.push( ob[key][0]+'' ) - - for key in stype['floats']: - value = ob[key] + '' - if '.' not in value: - value += '.0' - args.push( value ) - - for key in stype['arrays']: - #args.push( '{'+ob[key].toString()+ '}') ## this will not work - ## arrays need to be assigned to a local variable before passing - ## it to the struct constructor. - aname = '_'+key+name - self.array(ob[key], aname) - args.push( aname ) - - for key in stype['structs']: - aname = '_'+key+name - self.structure(ob[key], aname) - args.push( aname ) + if Object.hasOwnProperty.call(ob, 'elements'): ## THREE.js + for i in range(ob.elements.length): + value = ob.elements[i] +'' + if '.' not in value: value += '.0' + args.push( value ) + + else: + raise RuntimeError('no method to pack structure: ' +sname) + + if stype: + for key in stype['integers']: + args.push( ob[key][0]+'' ) + + for key in stype['floats']: + value = ob[key] + '' + if '.' not in value: + value += '.0' + args.push( value ) + + for key in stype['arrays']: + #args.push( '{'+ob[key].toString()+ '}') ## this will not work + ## arrays need to be assigned to a local variable before passing + ## it to the struct constructor. + aname = '_'+key+name + self.array(ob[key], aname) + args.push( aname ) + + for key in stype['structs']: + aname = '_'+key+name + self.structure(ob[key], aname) + args.push( aname ) args = ','.join(args) self.shader.push( sname + ' ' +name+ '=' +sname+ '(' +args+ ');' ) diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 4902ca9..67b9a1d 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -1,7 +1,10 @@ types = ['str', 'list', 'dict'] -glsl_types = ['struct*', 'int*', 'float*', 'vec2', 'vec3', 'vec4'] +glsl_types = ['struct*', 'int*', 'float*', 'vec2', 'vec3', 'vec4', 'mat2', 'mat3', 'mat4'] +glsl_xtypes = ['mat2x2', 'mat3x3', 'mat4x4'] ## others not supported in WebGLSL +glsl_types.extend( glsl_xtypes ) glsl_aliases = ['floatPOINTER', 'intPOINTER', 'structPOINTER'] + types.extend( glsl_types ) types.extend( glsl_aliases ) diff --git a/regtests/webclgl/gpu_class_three.py b/regtests/webclgl/gpu_class_three.py index 4ab6564..045c1b4 100644 --- a/regtests/webclgl/gpu_class_three.py +++ b/regtests/webclgl/gpu_class_three.py @@ -4,6 +4,8 @@ #three.Vector3.prototype.__struct_name__='ThreeVec3' ## this also works #three.Vector3.prototype.__struct_name__='vec3' gpu.object( three.Vector3, 'vec3' ) +#gpu.object( three.Matrix4, 'mat4x4', 'elements') ## note: mat4x4 is not part of WebGLSL +gpu.object( three.Matrix4, 'mat4', 'elements') @gpu.object class MyObject: @@ -14,6 +16,9 @@ class MyObject: def __init__(self, x,y,z): self.vec = new( three.Vector3(x,y,z) ) + self.mat = new( three.Matrix4() ) + print('THREE mat4') + print(self.mat) From c09181302f6365b1f05807e8a351e531b6be6751 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 26 Jun 2014 23:40:16 -0700 Subject: [PATCH 086/222] allow python3 function return annotation syntax. --- pythonjs/typedpython.py | 13 +++++++++++++ regtests/webclgl/gpu_class_three.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 67b9a1d..a82d2c7 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -64,6 +64,19 @@ def transform_source( source, strip=False ): pre = ''.join(pre) output.append( indent + '@returns(%s)' %pre) c = indent+'def '+c + elif c.strip().startswith('def ') and '->' in c: + c, rtype = c.split('->') + c += ':' + rtype = rtype.strip()[:-1] + indent = [] + for char in c: + if char in __whitespace: + indent.append(char) + else: + break + indent = ''.join(indent) + output.append( indent + '@returns(%s)' %rtype) + output.append( c ) return '\n'.join(output) diff --git a/regtests/webclgl/gpu_class_three.py b/regtests/webclgl/gpu_class_three.py index 045c1b4..e5e748d 100644 --- a/regtests/webclgl/gpu_class_three.py +++ b/regtests/webclgl/gpu_class_three.py @@ -10,7 +10,7 @@ @gpu.object class MyObject: @gpu.method - float def mymethod(self, s): + def mymethod(self, s) -> float: float s return (self.vec.x + self.vec.y + self.vec.z) * s From fd72582b81db82cadb6bce9969299bd8edc0727f Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 28 Jun 2014 09:50:07 -0700 Subject: [PATCH 087/222] refactoring to allow return of mat4 from gpu.main --- pythonjs/python_to_pythonjs.py | 28 +- pythonjs/pythonjs.js | 432 +++++++++++++------------ pythonjs/pythonjs.py | 98 ++++-- pythonjs/runtime/builtins.py | 10 + regtests/webclgl/three_returns_mat4.py | 45 +++ 5 files changed, 382 insertions(+), 231 deletions(-) create mode 100644 regtests/webclgl/three_returns_mat4.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 253d638..6007a9a 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1201,10 +1201,25 @@ def visit_Return(self, node): ## _id_ is inserted into all function headers by pythonjs.py for glsl functions. if not self._gpu_return_types: raise SyntaxError( self.format_error('function return type unknown - required decorator `@returns(array/vec4=[w,h])`') ) + + ## only one return type is allowed ## if 'array' in self._gpu_return_types: writer.write('out_float = %s' %self.visit(node.value)) - if 'vec4' in self._gpu_return_types: + elif 'vec4' in self._gpu_return_types: writer.write('out_float4 = %s' %self.visit(node.value)) + elif 'mat4' in self._gpu_return_types: + nv = self.visit(node.value) + writer.write('inline("mat4 _res_ = %s;")' %nv) + a = 'vec4(_res_[3][0],_res_[3][1],_res_[3][2],_res_[3][3])' + writer.write('if int(mod(float(_FRAGMENT_ID_), 4.0))==0: out_float4 = %s' % a) + a = 'vec4(_res_[2][0],_res_[2][1],_res_[2][2],_res_[2][3])' + writer.write('elif int(mod(float(_FRAGMENT_ID_), 3.0))==0: out_float4 = %s' % a) + a = 'vec4(_res_[1][0],_res_[1][1],_res_[1][2],_res_[1][3])' + writer.write('elif int(mod(float(_FRAGMENT_ID_), 2.0))==0: out_float4 = %s' % a) + a = 'vec4(_res_[0][0],_res_[0][1],_res_[0][2],_res_[0][3])' + writer.write('else: out_float4 = %s'%a) + else: + raise SyntaxError( self.format_error('invalid GPU return type: %s' %self._gpu_return_types) ) elif self._inline: writer.write('__returns__%s = %s' %(self._inline[-1], self.visit(node.value)) ) @@ -1792,6 +1807,9 @@ def _visit_assign_helper(self, node, target): if node_value in self._typedef_vars: writer.write('%s = %s' % (self.visit(target), self.visit(node.value))) + elif isinstance(node.value, ast.Subscript) and isinstance(node.value.slice, ast.Ellipsis): + writer.write('glsl_inline_assign_from_iterable("%s", "%s", %s)'%(self._typedef_vars[target.id], target.id, self.visit(node.value.value)) ) + else: ## also assign variable in current javascript scope ## @@ -2109,6 +2127,12 @@ def visit_Call(self, node): F = '%s_%s' %(clsname, node.func.attr) + elif isinstance(node.func, ast.Attribute) and isinstance(node.func.value, ast.Name) and node.func.value.id in self._typedef_vars: + #raise RuntimeError(node.func.value.id) + clsname = self._typedef_vars[ node.func.value.id ] + F = '%s_%s' %(clsname, node.func.attr) + args.insert(0, node.func.value.id) + if node.keywords: args.extend( [self.visit(x.value) for x in node.keywords] ) @@ -2559,6 +2583,8 @@ def visit_FunctionDef(self, node): assert len(decorator.args) == 1 assert isinstance( decorator.args[0], Name) return_type = decorator.args[0].id + if return_type in typedpython.glsl_types: + self._gpu_return_types.add( return_type ) elif isinstance(decorator, Attribute) and isinstance(decorator.value, Name) and decorator.value.id == 'gpu': gpu = True diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index d42b60e..8798b8c 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -523,6 +523,7 @@ GLSLJITRuntime.prototype.__init__ = function(header) { this.object_packagers = []; this.struct_types = __jsdict([]); this.glsltypes = ["vec2", "vec3", "vec4", "mat4", "mat4x4"]; + this.matrices = []; } GLSLJITRuntime.__init__ = function () { return GLSLJITRuntime.prototype.__init__.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; @@ -680,6 +681,7 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { if (__contains__(this.glsltypes, sname)) { if (__test_if_true__(( sname ) == "mat4" || ( sname ) == "mat4x4")) { if (__test_if_true__(Object.hasOwnProperty.call(ob, "elements"))) { + this.matrices.push(ob.elements); var i,i__end__; i = 0; i__end__ = ob.elements.length; @@ -883,6 +885,26 @@ GLSLJITRuntime.prototype.unpack_vec4 = function(arr, dims) { } GLSLJITRuntime.unpack_vec4 = function () { return GLSLJITRuntime.prototype.unpack_vec4.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; +GLSLJITRuntime.prototype.unpack_mat4 = function(arr) { + var i; + i = 0; + var __iter13 = this.matrices; + if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } + for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { + var mat = __iter13[ __idx13 ]; + var j,j__end__; + j = 0; + j__end__ = 16; + while (( j ) < j__end__) { + mat[j] = arr[i]; + i += 1; + j += 1; + } + } + return this.matrices; +} + +GLSLJITRuntime.unpack_mat4 = function () { return GLSLJITRuntime.prototype.unpack_mat4.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.__properties__ = { }; GLSLJITRuntime.prototype.__unbound_methods__ = { }; __getattr__ = function(ob, a) { @@ -1003,10 +1025,10 @@ __contains__ = function(ob, a) { throw new TypeError; } else { if (__test_if_true__(__is_typed_array(ob))) { - var __iter13 = ob; - if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } - for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { - var x = __iter13[ __idx13 ]; + var __iter14 = ob; + if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } + for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { + var x = __iter14[ __idx14 ]; if (( x ) == a) { return true; } @@ -1089,10 +1111,10 @@ __mul_op = function(a, b) { __jsdict = function(items) { var d,key; d = {}; - var __iter14 = items; - if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } - for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { - var item = __iter14[ __idx14 ]; + var __iter15 = items; + if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } + for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { + var item = __iter15[ __idx15 ]; key = item[0]; if (__test_if_true__(key.__uid__)) { key = key.__uid__; @@ -1140,10 +1162,10 @@ __jsdict_values = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object)) { arr = []; - var __iter15 = ob; - if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } - for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { - var key = __iter15[ __idx15 ]; + var __iter16 = ob; + if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } + for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { + var key = __iter16[ __idx16 ]; if (__test_if_true__(ob.hasOwnProperty(key))) { value = ob[key]; arr.push(value); @@ -1159,10 +1181,10 @@ __jsdict_items = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; - var __iter16 = ob; - if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } - for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { - var key = __iter16[ __idx16 ]; + var __iter17 = ob; + if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } + for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { + var key = __iter17[ __idx17 ]; if (__test_if_true__(Object.hasOwnProperty.call(ob, key))) { value = ob[key]; arr.push([key, value]); @@ -1228,10 +1250,10 @@ __object_keys__ = function(ob) { __bind_property_descriptors__ = function(o, klass) { var prop,desc; - var __iter17 = klass.__properties__; - if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } - for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { - var name = __iter17[ __idx17 ]; + var __iter18 = klass.__properties__; + if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } + for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { + var name = __iter18[ __idx18 ]; desc = __jsdict([["enumerable", true]]); prop = klass.__properties__[name]; if (__test_if_true__(prop["get"])) { @@ -1242,10 +1264,10 @@ __bind_property_descriptors__ = function(o, klass) { } Object.defineProperty(o, name, desc); } - var __iter18 = klass.__bases__; - if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } - for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { - var base = __iter18[ __idx18 ]; + var __iter19 = klass.__bases__; + if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } + for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { + var base = __iter19[ __idx19 ]; __bind_property_descriptors__(o, base); } } @@ -1277,10 +1299,10 @@ __sprintf = function(fmt, args) { arr = []; var i; i = 0; - var __iter19 = chunks; - if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } - for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { - var txt = __iter19[ __idx19 ]; + var __iter20 = chunks; + if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } + for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { + var txt = __iter20[ __idx20 ]; arr.append(txt); if (( i ) >= args.length) { break; @@ -1313,10 +1335,10 @@ __create_class__ = function(class_name, parents, attrs, props) { klass.__all_method_names__ = []; klass.__properties__ = props; klass.__attributes__ = attrs; - var __iter20 = attrs; - if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } - for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { - var key = __iter20[ __idx20 ]; + var __iter21 = attrs; + if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } + for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { + var key = __iter21[ __idx21 ]; if (( typeof(attrs[key]) ) == "function") { klass.__all_method_names__.push(key); f = attrs[key]; @@ -1337,20 +1359,20 @@ __create_class__ = function(class_name, parents, attrs, props) { } klass.__setters__ = []; klass.__getters__ = []; - var __iter21 = klass.__properties__; - if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } - for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { - var name = __iter21[ __idx21 ]; + var __iter22 = klass.__properties__; + if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } + for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { + var name = __iter22[ __idx22 ]; prop = klass.__properties__[name]; klass.__getters__.push(name); if (__test_if_true__(prop["set"])) { klass.__setters__.push(name); } } - var __iter22 = klass.__bases__; - if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } - for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { - var base = __iter22[ __idx22 ]; + var __iter23 = klass.__bases__; + if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } + for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { + var base = __iter23[ __idx23 ]; Array.prototype.push.apply(klass.__getters__, base.__getters__); Array.prototype.push.apply(klass.__setters__, base.__setters__); Array.prototype.push.apply(klass.__all_method_names__, base.__all_method_names__); @@ -1363,10 +1385,10 @@ __create_class__ = function(class_name, parents, attrs, props) { object.__dict__ = object; has_getattribute = false; has_getattr = false; - var __iter23 = klass.__all_method_names__; - if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } - for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { - var name = __iter23[ __idx23 ]; + var __iter24 = klass.__all_method_names__; + if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } + for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { + var name = __iter24[ __idx24 ]; if (( name ) == "__getattribute__") { has_getattribute = true; } else { @@ -1511,8 +1533,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 684: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 685: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 694: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 695: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1741,10 +1763,10 @@ _setup_str_prototype = function(args, kwargs) { arr = a["$wrapped"]; } i = 0; - var __iter24 = arr; - if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } - for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { - var value = __iter24[ __idx24 ]; + var __iter25 = arr; + if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } + for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { + var value = __iter25[ __idx25 ]; out += value; i += 1; if (( i ) < arr.length) { @@ -1786,10 +1808,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; - var __iter25 = this; - if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } - for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { - var char = __iter25[ __idx25 ]; + var __iter26 = this; + if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } + for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { + var char = __iter26[ __idx26 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1803,10 +1825,10 @@ _setup_str_prototype = function(args, kwargs) { var func = function() { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."]; - var __iter26 = this; - if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } - for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { - var char = __iter26[ __idx26 ]; + var __iter27 = this; + if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } + for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { + var char = __iter27[ __idx27 ]; if (__contains__(digits, char)) { /*pass*/ } else { @@ -1833,10 +1855,10 @@ _setup_str_prototype = function(args, kwargs) { var keys,r; r = this; keys = Object.keys(fmt); - var __iter27 = keys; - if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } - for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { - var key = __iter27[ __idx27 ]; + var __iter28 = keys; + if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } + for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { + var key = __iter28[ __idx28 ]; r = r.split(key).join(fmt[key]); } r = r.split("{").join("").split("}").join(""); @@ -1983,10 +2005,10 @@ _setup_array_prototype = function(args, kwargs) { stop = this.length; } arr = [start, (stop - start)]; - var __iter28 = items; - if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } - for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { - var item = __iter28[ __idx28 ]; + var __iter29 = items; + if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } + for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { + var item = __iter29[ __idx29 ]; arr.push(item); } this.splice.apply(this, arr); @@ -2002,10 +2024,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "append", { enumerable:false,value:func,writeable:true,configurable:true }); var extend = function(other) { - var __iter29 = other; - if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } - for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { - var obj = __iter29[ __idx29 ]; + var __iter30 = other; + if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } + for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { + var obj = __iter30[ __idx30 ]; this.push(obj); } return this; @@ -2037,10 +2059,10 @@ _setup_array_prototype = function(args, kwargs) { var count = function(obj) { var a; a = 0; - var __iter30 = this; - if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } - for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { - var item = __iter30[ __idx30 ]; + var __iter31 = this; + if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } + for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { + var item = __iter31[ __idx31 ]; if (( item ) === obj) { a += 1; } @@ -2096,10 +2118,10 @@ _setup_array_prototype = function(args, kwargs) { Object.defineProperty(Array.prototype, "intersection", { enumerable:false,value:func,writeable:true,configurable:true }); var func = function(other) { - var __iter31 = this; - if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } - for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { - var item = __iter31[ __idx31 ]; + var __iter32 = this; + if (! (__iter32 instanceof Array || typeof __iter32 == "string" || __is_typed_array(__iter32)) ) { __iter32 = __object_keys__(__iter32) } + for (var __idx32=0; __idx32 < __iter32.length; __idx32++) { + var item = __iter32[ __idx32 ]; if (( other.indexOf(item) ) == -1) { return false; } @@ -2267,12 +2289,12 @@ sum = function(args, kwargs) { __args__ = __getargs__("sum", __sig__, args, kwargs); var arr = __args__['arr']; a = 0; - var b,__iterator__37; - __iterator__37 = __get__(__get__(arr, "__iter__", "no iterator - line 1174: for b in arr:"), "__call__")([], __NULL_OBJECT__); - var __next__37; - __next__37 = __get__(__iterator__37, "next"); - while (( __iterator__37.index ) < __iterator__37.length) { - b = __next__37(); + var b,__iterator__39; + __iterator__39 = __get__(__get__(arr, "__iter__", "no iterator - line 1184: for b in arr:"), "__call__")([], __NULL_OBJECT__); + var __next__39; + __next__39 = __get__(__iterator__39, "next"); + while (( __iterator__39.index ) < __iterator__39.length) { + b = __next__39(); a += b; } return a; @@ -2308,7 +2330,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1194: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1204: return ob.__len__()"), "__call__")(); } } } @@ -2328,7 +2350,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1198: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1208: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2346,12 +2368,12 @@ map = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__38; - __iterator__38 = __get__(__get__(objs, "__iter__", "no iterator - line 1203: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__38; - __next__38 = __get__(__iterator__38, "next"); - while (( __iterator__38.index ) < __iterator__38.length) { - ob = __next__38(); + var ob,__iterator__40; + __iterator__40 = __get__(__get__(objs, "__iter__", "no iterator - line 1213: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__40; + __next__40 = __get__(__iterator__40, "next"); + while (( __iterator__40.index ) < __iterator__40.length) { + ob = __next__40(); v = __get__(func, "__call__")([ob], __NULL_OBJECT__); arr.push(v); } @@ -2373,12 +2395,12 @@ filter = function(args, kwargs) { var func = __args__['func']; var objs = __args__['objs']; arr = []; - var ob,__iterator__39; - __iterator__39 = __get__(__get__(objs, "__iter__", "no iterator - line 1211: for ob in objs:"), "__call__")([], __NULL_OBJECT__); - var __next__39; - __next__39 = __get__(__iterator__39, "next"); - while (( __iterator__39.index ) < __iterator__39.length) { - ob = __next__39(); + var ob,__iterator__41; + __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1221: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + var __next__41; + __next__41 = __get__(__iterator__41, "next"); + while (( __iterator__41.index ) < __iterator__41.length) { + ob = __next__41(); if (__test_if_true__(__get__(func, "__call__")([ob], __NULL_OBJECT__))) { arr.push(ob); } @@ -2400,12 +2422,12 @@ min = function(args, kwargs) { __args__ = __getargs__("min", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__40; - __iterator__40 = __get__(__get__(lst, "__iter__", "no iterator - line 1220: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__40; - __next__40 = __get__(__iterator__40, "next"); - while (( __iterator__40.index ) < __iterator__40.length) { - value = __next__40(); + var value,__iterator__42; + __iterator__42 = __get__(__get__(lst, "__iter__", "no iterator - line 1230: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__42; + __next__42 = __get__(__iterator__42, "next"); + while (( __iterator__42.index ) < __iterator__42.length) { + value = __next__42(); if (( a ) === null) { a = value; } else { @@ -2431,12 +2453,12 @@ max = function(args, kwargs) { __args__ = __getargs__("max", __sig__, args, kwargs); var lst = __args__['lst']; a = null; - var value,__iterator__41; - __iterator__41 = __get__(__get__(lst, "__iter__", "no iterator - line 1227: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__41; - __next__41 = __get__(__iterator__41, "next"); - while (( __iterator__41.index ) < __iterator__41.length) { - value = __next__41(); + var value,__iterator__43; + __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1237: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__43; + __next__43 = __get__(__iterator__43, "next"); + while (( __iterator__43.index ) < __iterator__43.length) { + value = __next__43(); if (( a ) === null) { a = value; } else { @@ -2546,7 +2568,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1262: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1272: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2656,28 +2678,28 @@ __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o,__iterator__42; - __iterator__42 = __get__(__get__(ob, "__iter__", "no iterator - line 1317: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__42; - __next__42 = __get__(__iterator__42, "next"); - while (( __iterator__42.index ) < __iterator__42.length) { - o = __next__42(); + var o,__iterator__44; + __iterator__44 = __get__(__get__(ob, "__iter__", "no iterator - line 1327: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__44; + __next__44 = __get__(__iterator__44, "next"); + while (( __iterator__44.index ) < __iterator__44.length) { + o = __next__44(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1319: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1319: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1319: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1329: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1329: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1329: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1321: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1321: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1321: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1331: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1331: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1331: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { - var key,__iterator__43; - __iterator__43 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1323: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__43; - __next__43 = __get__(__iterator__43, "next"); - while (( __iterator__43.index ) < __iterator__43.length) { - key = __next__43(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1324: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1325: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + var key,__iterator__45; + __iterator__45 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1333: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__45; + __next__45 = __get__(__iterator__45, "next"); + while (( __iterator__45.index ) < __iterator__45.length) { + key = __next__45(); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1334: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1335: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2703,16 +2725,16 @@ __dict_jsify = function(args, kwargs) { __args__ = __getargs__("__dict_jsify", __sig__, args, kwargs); var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); - var key,__iterator__44; - __iterator__44 = __get__(__get__(keys, "__iter__", "no iterator - line 1333: for key in keys:"), "__call__")([], __NULL_OBJECT__); - var __next__44; - __next__44 = __get__(__iterator__44, "next"); - while (( __iterator__44.index ) < __iterator__44.length) { - key = __next__44(); - value = __get__(self["$wrapped"], "__getitem__", "line 1334: value = self[...][key]")([key], __NULL_OBJECT__); + var key,__iterator__46; + __iterator__46 = __get__(__get__(keys, "__iter__", "no iterator - line 1343: for key in keys:"), "__call__")([], __NULL_OBJECT__); + var __next__46; + __next__46 = __get__(__iterator__46, "next"); + while (( __iterator__46.index ) < __iterator__46.length) { + key = __next__46(); + value = __get__(self["$wrapped"], "__getitem__", "line 1344: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1337: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1347: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2774,7 +2796,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1353: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1363: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2798,13 +2820,13 @@ __dict_update = function(args, kwargs) { __args__ = __getargs__("__dict_update", __sig__, args, kwargs); var self = __args__['self']; var other = __args__['other']; - var key,__iterator__45; - __iterator__45 = __get__(__get__(other, "__iter__", "no iterator - line 1361: for key in other:"), "__call__")([], __NULL_OBJECT__); - var __next__45; - __next__45 = __get__(__iterator__45, "next"); - while (( __iterator__45.index ) < __iterator__45.length) { - key = __next__45(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1362: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1362: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + var key,__iterator__47; + __iterator__47 = __get__(__get__(other, "__iter__", "no iterator - line 1371: for key in other:"), "__call__")([], __NULL_OBJECT__); + var __next__47; + __next__47 = __get__(__iterator__47, "next"); + while (( __iterator__47.index ) < __iterator__47.length) { + key = __next__47(); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1372: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1372: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2823,13 +2845,13 @@ __dict_items = function(args, kwargs) { __args__ = __getargs__("__dict_items", __sig__, args, kwargs); var self = __args__['self']; arr = []; - var key,__iterator__46; - __iterator__46 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1366: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); - var __next__46; - __next__46 = __get__(__iterator__46, "next"); - while (( __iterator__46.index ) < __iterator__46.length) { - key = __next__46(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1367: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + var key,__iterator__48; + __iterator__48 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1376: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + var __next__48; + __next__48 = __get__(__iterator__48, "next"); + while (( __iterator__48.index ) < __iterator__48.length) { + key = __next__48(); + __get__(__get__(arr, "append", "missing attribute `append` - line 1377: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2874,7 +2896,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1377: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1387: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -3010,10 +3032,10 @@ __dict_values = function(args, kwargs) { var self = __args__['self']; keys = Object.keys(self["$wrapped"]); out = []; - var __iter32 = keys; - if (! (__iter32 instanceof Array || typeof __iter32 == "string" || __is_typed_array(__iter32)) ) { __iter32 = __object_keys__(__iter32) } - for (var __idx32=0; __idx32 < __iter32.length; __idx32++) { - var key = __iter32[ __idx32 ]; + var __iter33 = keys; + if (! (__iter33 instanceof Array || typeof __iter33 == "string" || __is_typed_array(__iter33)) ) { __iter33 = __object_keys__(__iter33) } + for (var __idx33=0; __idx33 < __iter33.length; __idx33++) { + var key = __iter33[ __idx33 ]; out.push(self["$wrapped"][key]); } return out; @@ -3100,10 +3122,10 @@ set = function(args, kwargs) { } fallback = false; if (__test_if_true__(hashtable)) { - var __iter33 = a; - if (! (__iter33 instanceof Array || typeof __iter33 == "string" || __is_typed_array(__iter33)) ) { __iter33 = __object_keys__(__iter33) } - for (var __idx33=0; __idx33 < __iter33.length; __idx33++) { - var b = __iter33[ __idx33 ]; + var __iter34 = a; + if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34)) ) { __iter34 = __object_keys__(__iter34) } + for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { + var b = __iter34[ __idx34 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[key] = b; @@ -3118,20 +3140,20 @@ set = function(args, kwargs) { } s = []; if (__test_if_true__(fallback)) { - var __iter34 = a; - if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34)) ) { __iter34 = __object_keys__(__iter34) } - for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { - var item = __iter34[ __idx34 ]; + var __iter35 = a; + if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35)) ) { __iter35 = __object_keys__(__iter35) } + for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { + var item = __iter35[ __idx35 ]; if (( s.indexOf(item) ) == -1) { s.push(item); } } } else { __sort_method(keys); - var __iter35 = keys; - if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35)) ) { __iter35 = __object_keys__(__iter35) } - for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { - var key = __iter35[ __idx35 ]; + var __iter36 = keys; + if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36)) ) { __iter36 = __object_keys__(__iter36) } + for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { + var key = __iter36[ __idx36 ]; s.push(hashtable[key]); } } @@ -3179,7 +3201,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1578: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1578: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1588: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1588: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3203,7 +3225,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1602: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1612: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3238,7 +3260,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1610: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1620: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3264,7 +3286,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1620: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1620: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1630: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1630: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3303,7 +3325,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1639: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1639: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1649: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1649: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3374,13 +3396,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1664: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1664: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1674: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1674: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1669: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1679: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3440,7 +3462,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1697: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1707: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3459,13 +3481,13 @@ __array_extend = function(args, kwargs) { __args__ = __getargs__("__array_extend", __sig__, args, kwargs); var self = __args__['self']; var lst = __args__['lst']; - var value,__iterator__51; - __iterator__51 = __get__(__get__(lst, "__iter__", "no iterator - line 1701: for value in lst:"), "__call__")([], __NULL_OBJECT__); - var __next__51; - __next__51 = __get__(__iterator__51, "next"); - while (( __iterator__51.index ) < __iterator__51.length) { - value = __next__51(); - __get__(__get__(self, "append", "missing attribute `append` - line 1702: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + var value,__iterator__53; + __iterator__53 = __get__(__get__(lst, "__iter__", "no iterator - line 1711: for value in lst:"), "__call__")([], __NULL_OBJECT__); + var __next__53; + __next__53 = __get__(__iterator__53, "next"); + while (( __iterator__53.index ) < __iterator__53.length) { + value = __next__53(); + __get__(__get__(self, "append", "missing attribute `append` - line 1712: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3507,7 +3529,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1714: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1724: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3525,9 +3547,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1718: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1728: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1719: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1729: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3664,17 +3686,17 @@ json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (f __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; - var __iter36 = threading.workers; - if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36)) ) { __iter36 = __object_keys__(__iter36) } - for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { - var b = __iter36[ __idx36 ]; + var __iter37 = threading.workers; + if (! (__iter37 instanceof Array || typeof __iter37 == "string" || __is_typed_array(__iter37)) ) { __iter37 = __object_keys__(__iter37) } + for (var __idx37=0; __idx37 < __iter37.length; __idx37++) { + var b = __iter37[ __idx37 ]; other = b["worker"]; args = b["args"]; if (( other ) !== worker) { - var __iter37 = args; - if (! (__iter37 instanceof Array || typeof __iter37 == "string" || __is_typed_array(__iter37)) ) { __iter37 = __object_keys__(__iter37) } - for (var __idx37=0; __idx37 < __iter37.length; __idx37++) { - var arg = __iter37[ __idx37 ]; + var __iter38 = args; + if (! (__iter38 instanceof Array || typeof __iter38 == "string" || __is_typed_array(__iter38)) ) { __iter38 = __object_keys__(__iter38) } + for (var __idx38=0; __idx38 < __iter38.length; __idx38++) { + var arg = __iter38[ __idx38 ]; if (( arg ) === ob) { if (! (__contains__(a, other))) { a.append(other); @@ -3706,10 +3728,10 @@ __start_new_thread = function(f, args) { if (( event.data.type ) == "append") { a = args[event.data.argindex]; a.push(event.data.value); - var __iter38 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter38 instanceof Array || typeof __iter38 == "string" || __is_typed_array(__iter38)) ) { __iter38 = __object_keys__(__iter38) } - for (var __idx38=0; __idx38 < __iter38.length; __idx38++) { - var other = __iter38[ __idx38 ]; + var __iter39 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter39 instanceof Array || typeof __iter39 == "string" || __is_typed_array(__iter39)) ) { __iter39 = __object_keys__(__iter39) } + for (var __idx39=0; __idx39 < __iter39.length; __idx39++) { + var other = __iter39[ __idx39 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); } } else { @@ -3721,10 +3743,10 @@ __start_new_thread = function(f, args) { } else { a[event.data.index] = value; } - var __iter39 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter39 instanceof Array || typeof __iter39 == "string" || __is_typed_array(__iter39)) ) { __iter39 = __object_keys__(__iter39) } - for (var __idx39=0; __idx39 < __iter39.length; __idx39++) { - var other = __iter39[ __idx39 ]; + var __iter40 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter40 instanceof Array || typeof __iter40 == "string" || __is_typed_array(__iter40)) ) { __iter40 = __object_keys__(__iter40) } + for (var __idx40=0; __idx40 < __iter40.length; __idx40++) { + var other = __iter40[ __idx40 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); } } else { @@ -3739,10 +3761,10 @@ __start_new_thread = function(f, args) { jsargs = []; var i; i = 0; - var __iter40 = args; - if (! (__iter40 instanceof Array || typeof __iter40 == "string" || __is_typed_array(__iter40)) ) { __iter40 = __object_keys__(__iter40) } - for (var __idx40=0; __idx40 < __iter40.length; __idx40++) { - var arg = __iter40[ __idx40 ]; + var __iter41 = args; + if (! (__iter41 instanceof Array || typeof __iter41 == "string" || __is_typed_array(__iter41)) ) { __iter41 = __object_keys__(__iter41) } + for (var __idx41=0; __idx41 < __iter41.length; __idx41++) { + var arg = __iter41[ __idx41 ]; if (__test_if_true__(arg.jsify)) { jsargs.append(arg.jsify()); } else { diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 7f7c298..8b9bf25 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -17,6 +17,7 @@ #import inline_function #import code_writer +import typedpython class JSGenerator(NodeVisitor): #, inline_function.Inliner): def __init__(self, requirejs=True, insert_runtime=True, webworker=False, function_expressions=False): @@ -36,6 +37,11 @@ def __init__(self, requirejs=True, insert_runtime=True, webworker=False, functio self._has_glsl = False self._typed_vars = dict() + ## the helper function below _mat4_to_vec4 is invalid because something can only be indexed + ## with a constant expression. The GLSL compiler will throw this ERROR: 0:19: '[]' : Index expression must be constant" + #self.glsl_runtime = 'vec4 _mat4_to_vec4( mat4 a, int col) { return vec4(a[col][0], a[col][1], a[col][2],a[col][3]); }' + self.glsl_runtime = '' + def indent(self): return ' ' * self._indent def push(self): self._indent += 1 def pull(self): @@ -105,8 +111,7 @@ def visit_Module(self, node): lines.append('}) //end requirejs define') if self._has_glsl: - #header.append( 'var __shader_header__ = ["struct MyStruct { float xxx; }; const MyStruct XX = MyStruct(1.1); MyStruct myarr[2]; myarr[0]= MyStruct(1.1);"]' ) - header.append( 'var __shader_header__ = []' ) + header.append( 'var __shader_header__ = ["%s"]'%self.glsl_runtime ) lines = header + lines ## fixed by Foxboron @@ -234,6 +239,8 @@ def _visit_function(self, node): else: return_type = decor.args[0].id + if return_type in typedpython.glsl_types: + gpu_return_types[ return_type ] = True elif isinstance(decor, Attribute) and isinstance(decor.value, Name) and decor.value.id == 'gpu': if decor.attr == 'vectorize': @@ -279,7 +286,7 @@ def _visit_function(self, node): self.push() # `_id_` always write out an array of floats or array of vec4floats if is_main: - lines.append( 'glsljit.push("vec2 _id_ = get_global_id();");') + lines.append( 'glsljit.push("vec2 _id_ = get_global_id(); int _FRAGMENT_ID_ = int(_id_.x + _id_.y);");') else: lines.append( '__shader_header__.push("vec2 _id_ = get_global_id();");') @@ -331,14 +338,14 @@ def _visit_function(self, node): else: ## subroutine or method if '`' in sub: sub = sub.replace('`', '') - lines.append( '__shader_header__.push("%s");' %(self.indent()+sub) ) + lines.append( '__shader_header__.push("%s");' %sub ) self._glsl = False - #buffer += '\n'.join(body) self.pull() if is_main: - lines.append('glsljit.push("%s}");' %self.indent()) + lines.append('glsljit.push("(1+1);");') ## fixes WebCLGL 2.0 parser + lines.append('glsljit.push("}");') else: lines.append('__shader_header__.push("%s}");' %self.indent()) @@ -380,6 +387,9 @@ def _visit_function(self, node): lines.append(' var __return_length_vec4 = %s * %s' %(w,h)) else: lines.append(' var __return_length_vec4 = %s' %gpu_return_types['vec4']) + + elif 'mat4' in gpu_return_types: + lines.append(' var __return_length = 64') ## minimum size is 64 else: raise NotImplementedError else: @@ -398,32 +408,35 @@ def _visit_function(self, node): #lines.append(' console.log("kernel.compile OK")') if gpu_return_types: - if 'array' in gpu_return_types: - dim = gpu_return_types[ 'array' ] - lines.append(' var rbuffer_array = __webclgl.createBuffer(%s, "FLOAT", __offset)' %dim) - lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, rbuffer_array)') - lines.append(' var _raw_array_res = __webclgl.enqueueReadBuffer_Float( rbuffer_array )') - else: + if 'vec4' in gpu_return_types: dim = gpu_return_types[ 'vec4' ] lines.append(' var rbuffer_vec4 = __webclgl.createBuffer(%s, "FLOAT4", __offset)' %dim) lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, rbuffer_vec4)') - lines.append(' var _raw_vec4_res = __webclgl.enqueueReadBuffer_Float4( rbuffer_vec4 )') - - if 'array' in gpu_return_types and 'vec4' in gpu_return_types: - adim = gpu_return_types['array'] - vdim = gpu_return_types['vec4'] - lines.append(' return [glsljit.unpack_array2d(_raw_array_res, %s),glsljit.unpack_vec4(_raw_vec4_res, %s)]' %(adim, vdim)) - elif 'vec4' in gpu_return_types: - lines.append(' return glsljit.unpack_vec4(_raw_vec4_res, %s)' %gpu_return_types['vec4']) + lines.append(' var __res = __webclgl.enqueueReadBuffer_Float4( rbuffer_vec4 )') + lines.append(' return glsljit.unpack_vec4(__res, %s)' %gpu_return_types['vec4']) + elif 'array' in gpu_return_types: + dim = gpu_return_types[ 'array' ] + lines.append(' var rbuffer_array = __webclgl.createBuffer(%s, "FLOAT", __offset)' %dim) + lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, rbuffer_array)') + lines.append(' var __res = __webclgl.enqueueReadBuffer_Float( rbuffer_array )') + lines.append(' return glsljit.unpack_array2d(__res, %s)' %gpu_return_types['array']) + + elif 'mat4' in gpu_return_types: + lines.append(' var rbuffer = __webclgl.createBuffer([glsljit.matrices.length,4], "FLOAT4", __offset)') + lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, rbuffer)') + lines.append(' var __res = __webclgl.enqueueReadBuffer_Float4( rbuffer )') + lines.append(' return glsljit.unpack_mat4(__res)') else: - lines.append(' return glsljit.unpack_array2d(_raw_array_res, %s)' %gpu_return_types['array']) + raise SyntaxError('invalid GPU return type: %s' %gpu_return_types) else: + raise SyntaxError('GPU return type must be given') lines.append(' var __return = __webclgl.createBuffer(__return_length, "FLOAT", __offset)') lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, __return)') lines.append(' return __webclgl.enqueueReadBuffer_Float( __return )') lines.append('} // end of wrapper') + lines.append('%s.matrices = glsljit.matrices' %glsl_wrapper_name ) return '\n'.join(lines) @@ -477,7 +490,8 @@ def _visit_subscript_ellipsis(self, node): def visit_Subscript(self, node): if isinstance(node.slice, ast.Ellipsis): if self._glsl: - return '%s[_id_]' % self.visit(node.value) + #return '%s[_id_]' % self.visit(node.value) + return '%s[_FRAGMENT_ID_]' % self.visit(node.value) else: return self._visit_subscript_ellipsis( node ) else: @@ -566,6 +580,37 @@ def visit_Call(self, node): v = self.visit(s).replace('`', '') return '`%s.length`' %v + elif name == 'glsl_inline_assign_from_iterable': + sname = node.args[0].s + target = node.args[1].s + iter = node.args[2].id + self._typed_vars[ target ] = sname + + + lines = [ + '`@var __length__ = %s.length;`' %iter, + #'`@console.log("DEBUG iter: "+%s);`' %iter, + #'`@console.log("DEBUG first item: "+%s[0]);`' %iter, + #'`@var __struct_name__ = %s[0].__struct_name__;`' %iter, + ##same as above - slower ##'`@var __struct_name__ = glsljit.define_structure(%s[0]);`' %iter, + #'`@console.log("DEBUG sname: "+__struct_name__);`', + '`@var %s = %s[0];`' %(target, iter) ## capture first item with target name so that for loops can get the length of member arrays + ] + + lines.append('for (int _iter=0; _iter < `__length__`; _iter++) {' ) + + ## declare struct variable ## + lines.append( '%s %s;' %(sname, target)) + + ## at runtime loop over subarray, for each index inline into the shader's for-loop an if test, + lines.append( '`@for (var __j=0; __j<__length__; __j++) {`') + lines.append( '`@glsljit.push("if (_iter==" +__j+ ") { %s=%s_" +__j+ ";}");`' %(target, iter)) + lines.append( '`@}`') + + + lines.append( '}' ) ## end of for loop + return '\n'.join(lines) + elif name == 'glsl_inline_push_js_assign': # '@' triggers a new line of generated code n = node.args[0].s @@ -828,9 +873,12 @@ def visit_Is(self, node): return '===' def visit_Compare(self, node): - comp = [ '('] - comp.append( self.visit(node.left) ) - comp.append( ')' ) + if self._glsl: + comp = [self.visit(node.left)] + else: + comp = [ '('] + comp.append( self.visit(node.left) ) + comp.append( ')' ) for i in range( len(node.ops) ): comp.append( self.visit(node.ops[i]) ) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 873b60a..bc85961 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -33,6 +33,7 @@ def __init__(self, header): self.object_packagers = [] self.struct_types = {} self.glsltypes = ['vec2', 'vec3', 'vec4', 'mat4', 'mat4x4'] + self.matrices = [] def compile_header(self): a = [] ## insert structs at top of header @@ -155,6 +156,7 @@ def structure(self, ob, name): if sname == 'mat4' or sname == 'mat4x4': if Object.hasOwnProperty.call(ob, 'elements'): ## THREE.js + #self.matrices.push(ob.elements) for i in range(ob.elements.length): value = ob.elements[i] +'' if '.' not in value: value += '.0' @@ -281,6 +283,14 @@ def unpack_vec4(self, arr, dims): print('ERROR: __unpack_vec4, invalid height.') return rows + def unpack_mat4(self, arr): + i = 0 + for mat in self.matrices: + for j in range(16): + mat[j] = arr[i] + i += 1 + + return self.matrices with lowlevel: diff --git a/regtests/webclgl/three_returns_mat4.py b/regtests/webclgl/three_returns_mat4.py new file mode 100644 index 0000000..19c2df3 --- /dev/null +++ b/regtests/webclgl/three_returns_mat4.py @@ -0,0 +1,45 @@ +'''@gpu class three.js''' +import three + +gpu.object( three.Matrix4, 'mat4', 'elements') + +@gpu.object +class MyObject: + @gpu.method + def mymethod(self, other) -> mat4: + mat4 other + return self.mat * other + + def __init__(self, x,y,z): + self.mat = new( three.Matrix4() ) + print('THREE mat4') + print(self.mat) + + + +class myclass: + def run(self, w): + self.array = [ MyObject( 1.1, 1.2, 1.3 ) for x in range(w) ] + + @typedef(o=MyObject) + @gpu.main + def gpufunc() -> mat4: + struct* A = self.array + mat4 b = mat4(1.0) + #mat4 c = mat4(1.1) + + #for s in iter(A): + # b *= s.mymethod(c) + + o = A[...] + return o.mymethod(b) + + for ob in self.array: + gpufunc.matrices.append( ob.mat.elements ) + + return gpufunc() + +def main(): + m = myclass() + r = m.run(16) + print(r) From 54befd207d91f9c764899db10754ffe532282bbf Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 30 Jun 2014 18:40:02 -0700 Subject: [PATCH 088/222] gpu backend: fixed return array of mat4. --- doc/gpu.md | 28 +++++++++ pythonjs/python_to_pythonjs.py | 21 ++++--- pythonjs/pythonjs.js | 81 +++++++++++++------------- pythonjs/pythonjs.py | 24 ++++---- pythonjs/runtime/builtins.py | 7 +++ regtests/webclgl/returns_vec4.py | 2 +- regtests/webclgl/three_returns_mat4.py | 21 ++++--- 7 files changed, 117 insertions(+), 67 deletions(-) diff --git a/doc/gpu.md b/doc/gpu.md index 7f6cceb..289ea9c 100644 --- a/doc/gpu.md +++ b/doc/gpu.md @@ -373,4 +373,32 @@ class MyObject: float def mymethod(self): return self.vec1.x + self.vec2.y +``` + +array of mat4 input and output +------------------------------ + +The gpu.main function may also return `mat4`, an array of 4x4 float32 matrices, by using a `-> mat4` function return annotation. In this case the wrapper function will contain an attribute `return_matrices`, +appending Float32Array buffers to this list will update their values when the wrapper is called. + +Within the shader you can get the current index of the matrix in `return_matrices` with ellipsis on an iterable. +Below `A[...]` gets the current index in `gpufunc.return_matrices`. + +``` +class myclass: + def run(self, w): + self.array = [ MyObject( x+1.0 ) for x in range(w) ] + + @typedef(o=MyObject) + @gpu.main + def gpufunc() -> mat4: + struct* A = self.array + o = A[...] + return o.mat + + for ob in self.array: + gpufunc.return_matrices.append( ob.mat.elements ) + + return gpufunc() + ``` \ No newline at end of file diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 6007a9a..030a2fb 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1209,15 +1209,18 @@ def visit_Return(self, node): writer.write('out_float4 = %s' %self.visit(node.value)) elif 'mat4' in self._gpu_return_types: nv = self.visit(node.value) - writer.write('inline("mat4 _res_ = %s;")' %nv) - a = 'vec4(_res_[3][0],_res_[3][1],_res_[3][2],_res_[3][3])' - writer.write('if int(mod(float(_FRAGMENT_ID_), 4.0))==0: out_float4 = %s' % a) - a = 'vec4(_res_[2][0],_res_[2][1],_res_[2][2],_res_[2][3])' - writer.write('elif int(mod(float(_FRAGMENT_ID_), 3.0))==0: out_float4 = %s' % a) - a = 'vec4(_res_[1][0],_res_[1][1],_res_[1][2],_res_[1][3])' - writer.write('elif int(mod(float(_FRAGMENT_ID_), 2.0))==0: out_float4 = %s' % a) - a = 'vec4(_res_[0][0],_res_[0][1],_res_[0][2],_res_[0][3])' - writer.write('else: out_float4 = %s'%a) + writer.write('inline("mat4 _res_ = %s; int _row = matrix_row();")' %nv) + + r0 = 'vec4(_res_[0][0],_res_[0][1],_res_[0][2],_res_[0][3])' + r1 = 'vec4(_res_[1][0],_res_[1][1],_res_[1][2],_res_[1][3])' + r2 = 'vec4(_res_[2][0],_res_[2][1],_res_[2][2],_res_[2][3])' + r3 = 'vec4(_res_[3][0],_res_[3][1],_res_[3][2],_res_[3][3])' + + writer.write('if _row==0: out_float4 = %s' % r0) + writer.write('elif _row==1: out_float4 = %s'%r1) + writer.write('elif _row==2: out_float4 = %s'%r2) + writer.write('else: out_float4 = %s'%r3) + else: raise SyntaxError( self.format_error('invalid GPU return type: %s' %self._gpu_return_types) ) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 8798b8c..6a1dbfa 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -540,6 +540,8 @@ GLSLJITRuntime.prototype.compile_header = function() { a.push(this.struct_types[sname]["code"]); } } + a.push(__sprintf("int matrix_index() { return int(get_global_id().y*%s.0); }", this.matrices.length)); + a.push("int matrix_row() { return int(get_global_id().x*4.0); }"); a = "\n".join(a); b = "\n".join(this.header); return "\n".join([a, b]); @@ -681,7 +683,6 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { if (__contains__(this.glsltypes, sname)) { if (__test_if_true__(( sname ) == "mat4" || ( sname ) == "mat4x4")) { if (__test_if_true__(Object.hasOwnProperty.call(ob, "elements"))) { - this.matrices.push(ob.elements); var i,i__end__; i = 0; i__end__ = ob.elements.length; @@ -887,6 +888,8 @@ GLSLJITRuntime.prototype.unpack_vec4 = function(arr, dims) { GLSLJITRuntime.unpack_vec4 = function () { return GLSLJITRuntime.prototype.unpack_vec4.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.unpack_mat4 = function(arr) { var i; + console.log("unpack_mat4"); + console.log(arr); i = 0; var __iter13 = this.matrices; if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } @@ -1533,8 +1536,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 694: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 695: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 701: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 702: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2290,7 +2293,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__39; - __iterator__39 = __get__(__get__(arr, "__iter__", "no iterator - line 1184: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__39 = __get__(__get__(arr, "__iter__", "no iterator - line 1191: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__39; __next__39 = __get__(__iterator__39, "next"); while (( __iterator__39.index ) < __iterator__39.length) { @@ -2330,7 +2333,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1204: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1211: return ob.__len__()"), "__call__")(); } } } @@ -2350,7 +2353,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1208: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1215: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2369,7 +2372,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__40; - __iterator__40 = __get__(__get__(objs, "__iter__", "no iterator - line 1213: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(objs, "__iter__", "no iterator - line 1220: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2396,7 +2399,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__41; - __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1221: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1228: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { @@ -2423,7 +2426,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__42; - __iterator__42 = __get__(__get__(lst, "__iter__", "no iterator - line 1230: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(lst, "__iter__", "no iterator - line 1237: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { @@ -2454,7 +2457,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__43; - __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1237: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1244: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { @@ -2568,7 +2571,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1272: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1279: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2679,27 +2682,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__44; - __iterator__44 = __get__(__get__(ob, "__iter__", "no iterator - line 1327: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(ob, "__iter__", "no iterator - line 1334: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { o = __next__44(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1329: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1329: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1329: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1336: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1336: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1336: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1331: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1331: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1331: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1338: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1338: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1338: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__45; - __iterator__45 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1333: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1340: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { key = __next__45(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1334: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1335: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1341: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1342: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2726,15 +2729,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__46; - __iterator__46 = __get__(__get__(keys, "__iter__", "no iterator - line 1343: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(keys, "__iter__", "no iterator - line 1350: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = __get__(self["$wrapped"], "__getitem__", "line 1344: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1351: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1347: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1354: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2796,7 +2799,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1363: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1370: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2821,12 +2824,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__47; - __iterator__47 = __get__(__get__(other, "__iter__", "no iterator - line 1371: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(other, "__iter__", "no iterator - line 1378: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1372: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1372: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1379: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1379: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2846,12 +2849,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__48; - __iterator__48 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1376: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1383: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1377: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1384: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2896,7 +2899,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1387: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1394: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -3201,7 +3204,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1588: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1588: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1595: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1595: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3225,7 +3228,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1612: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1619: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3260,7 +3263,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1620: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1627: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3286,7 +3289,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1630: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1630: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1637: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1637: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3325,7 +3328,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1649: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1649: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1656: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1656: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3396,13 +3399,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1674: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1674: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1681: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1681: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1679: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1686: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3462,7 +3465,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1707: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1714: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3482,12 +3485,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__53; - __iterator__53 = __get__(__get__(lst, "__iter__", "no iterator - line 1711: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__53 = __get__(__get__(lst, "__iter__", "no iterator - line 1718: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__53; __next__53 = __get__(__iterator__53, "next"); while (( __iterator__53.index ) < __iterator__53.length) { value = __next__53(); - __get__(__get__(self, "append", "missing attribute `append` - line 1712: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1719: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3529,7 +3532,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1724: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1731: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3547,9 +3550,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1728: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1735: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1729: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1736: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 8b9bf25..a88292a 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -40,7 +40,7 @@ def __init__(self, requirejs=True, insert_runtime=True, webworker=False, functio ## the helper function below _mat4_to_vec4 is invalid because something can only be indexed ## with a constant expression. The GLSL compiler will throw this ERROR: 0:19: '[]' : Index expression must be constant" #self.glsl_runtime = 'vec4 _mat4_to_vec4( mat4 a, int col) { return vec4(a[col][0], a[col][1], a[col][2],a[col][3]); }' - self.glsl_runtime = '' + self.glsl_runtime = 'int _imod(int a, int b) { return int(mod(float(a),float(b))); }' def indent(self): return ' ' * self._indent def push(self): self._indent += 1 @@ -286,7 +286,8 @@ def _visit_function(self, node): self.push() # `_id_` always write out an array of floats or array of vec4floats if is_main: - lines.append( 'glsljit.push("vec2 _id_ = get_global_id(); int _FRAGMENT_ID_ = int(_id_.x + _id_.y);");') + #lines.append( 'glsljit.push("vec2 _id_ = get_global_id(); int _FRAGMENT_ID_ = int(_id_.x + _id_.y * 100.0);");') + pass else: lines.append( '__shader_header__.push("vec2 _id_ = get_global_id();");') @@ -344,7 +345,7 @@ def _visit_function(self, node): self._glsl = False self.pull() if is_main: - lines.append('glsljit.push("(1+1);");') ## fixes WebCLGL 2.0 parser + lines.append('glsljit.push(";(1+1);");') ## fixes WebCLGL 2.0 parser lines.append('glsljit.push("}");') else: lines.append('__shader_header__.push("%s}");' %self.indent()) @@ -422,7 +423,7 @@ def _visit_function(self, node): lines.append(' return glsljit.unpack_array2d(__res, %s)' %gpu_return_types['array']) elif 'mat4' in gpu_return_types: - lines.append(' var rbuffer = __webclgl.createBuffer([glsljit.matrices.length,4], "FLOAT4", __offset)') + lines.append(' var rbuffer = __webclgl.createBuffer([4,glsljit.matrices.length], "FLOAT4", __offset)') lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, rbuffer)') lines.append(' var __res = __webclgl.enqueueReadBuffer_Float4( rbuffer )') lines.append(' return glsljit.unpack_mat4(__res)') @@ -436,7 +437,7 @@ def _visit_function(self, node): lines.append(' return __webclgl.enqueueReadBuffer_Float( __return )') lines.append('} // end of wrapper') - lines.append('%s.matrices = glsljit.matrices' %glsl_wrapper_name ) + lines.append('%s.return_matrices = glsljit.matrices' %glsl_wrapper_name ) return '\n'.join(lines) @@ -491,7 +492,7 @@ def visit_Subscript(self, node): if isinstance(node.slice, ast.Ellipsis): if self._glsl: #return '%s[_id_]' % self.visit(node.value) - return '%s[_FRAGMENT_ID_]' % self.visit(node.value) + return '%s[matrix_index()]' % self.visit(node.value) else: return self._visit_subscript_ellipsis( node ) else: @@ -581,6 +582,8 @@ def visit_Call(self, node): return '`%s.length`' %v elif name == 'glsl_inline_assign_from_iterable': + ## the target must be declared without a typedef, because if declared first, it can not be redeclared, + ## in the if-assignment block, the typedef is not given because `Iter_n` already has been typed beforehand. sname = node.args[0].s target = node.args[1].s iter = node.args[2].id @@ -597,18 +600,19 @@ def visit_Call(self, node): '`@var %s = %s[0];`' %(target, iter) ## capture first item with target name so that for loops can get the length of member arrays ] - lines.append('for (int _iter=0; _iter < `__length__`; _iter++) {' ) + #lines.append('for (int _iter=0; _iter < `__length__`; _iter++) {' ) ## declare struct variable ## - lines.append( '%s %s;' %(sname, target)) + #lines.append( '%s %s;' %(sname, target)) ## at runtime loop over subarray, for each index inline into the shader's for-loop an if test, lines.append( '`@for (var __j=0; __j<__length__; __j++) {`') - lines.append( '`@glsljit.push("if (_iter==" +__j+ ") { %s=%s_" +__j+ ";}");`' %(target, iter)) + #lines.append( '`@glsljit.push("if (OUTPUT_INDEX==" +__j+ ") { %s %s=%s_" +__j+ ";}");`' %(sname, target, iter)) + lines.append( '`@glsljit.push("if (matrix_index()==" +__j+ ") { %s=%s_" +__j+ ";}");`' %(target, iter)) lines.append( '`@}`') - lines.append( '}' ) ## end of for loop + #lines.append( '}' ) ## end of for loop return '\n'.join(lines) elif name == 'glsl_inline_push_js_assign': diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index bc85961..ba5cad7 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -43,6 +43,11 @@ def compile_header(self): else: a.push( self.struct_types[sname]['code'] ) + ## calls get_global_id, see WebCLGL API docs. ## + a.push('int matrix_index() { return int(get_global_id().y*%s.0); }' %self.matrices.length) + a.push('int matrix_row() { return int(get_global_id().x*4.0); }') ## returns: 0, 1, 2, 3 + + a = '\n'.join(a) ## code in header could be methods that reference the struct types above. b = "\n".join(self.header) @@ -284,6 +289,8 @@ def unpack_vec4(self, arr, dims): return rows def unpack_mat4(self, arr): + print('unpack_mat4') + print(arr) i = 0 for mat in self.matrices: for j in range(16): diff --git a/regtests/webclgl/returns_vec4.py b/regtests/webclgl/returns_vec4.py index 69305f9..0fa3dcb 100644 --- a/regtests/webclgl/returns_vec4.py +++ b/regtests/webclgl/returns_vec4.py @@ -3,7 +3,7 @@ def main(): - @returns( vec4=[32,32] ) + @returns( vec4=[2,32] ) @gpu.main def gpufunc(x,y,z,w): float x diff --git a/regtests/webclgl/three_returns_mat4.py b/regtests/webclgl/three_returns_mat4.py index 19c2df3..fdeb955 100644 --- a/regtests/webclgl/three_returns_mat4.py +++ b/regtests/webclgl/three_returns_mat4.py @@ -10,16 +10,20 @@ def mymethod(self, other) -> mat4: mat4 other return self.mat * other - def __init__(self, x,y,z): + def __init__(self, x): self.mat = new( three.Matrix4() ) print('THREE mat4') - print(self.mat) + print(dir(self.mat)) + for i in range(16): + self.mat.elements[i] = i*10 + self.mat.multiplyScalar(x) + class myclass: def run(self, w): - self.array = [ MyObject( 1.1, 1.2, 1.3 ) for x in range(w) ] + self.array = [ MyObject( x+1.0 ) for x in range(w) ] @typedef(o=MyObject) @gpu.main @@ -31,15 +35,16 @@ def gpufunc() -> mat4: #for s in iter(A): # b *= s.mymethod(c) - o = A[...] - return o.mymethod(b) + o = A[...] ## gets the current index in gpufunc.return_matrices + return o.mat #.mymethod(b) for ob in self.array: - gpufunc.matrices.append( ob.mat.elements ) + gpufunc.return_matrices.append( ob.mat.elements ) return gpufunc() def main(): m = myclass() - r = m.run(16) - print(r) + r = m.run(8) + for a in r: + print(a) From 0a56457224f87bc3fe88553aea90a6a8fd37da51 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 1 Jul 2014 15:23:55 -0700 Subject: [PATCH 089/222] gpu backend: removed hardcoding for THREE.js matrix. --- pythonjs/python_to_pythonjs.py | 8 ++- pythonjs/pythonjs.js | 112 +++++++++++++++++---------------- pythonjs/runtime/builtins.py | 26 ++++---- regtests/run.py | 6 ++ regtests/webclgl/subroutine.py | 4 +- 5 files changed, 86 insertions(+), 70 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 030a2fb..04833b6 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1034,11 +1034,15 @@ def visit_ClassDef(self, node): self._classes[ name ].append( item.name ) item_name = item.name item.original_name = item.name - item.name = '__%s_%s' % (name, item_name) + + if self.is_gpu_method( item ): + item.name = '%s_%s' % (name, item_name) + else: + item.name = '__%s_%s' % (name, item_name) self.visit(item) # this will output the code for the function - if item_name in self._decorator_properties: + if item_name in self._decorator_properties or self.is_gpu_method( item ): pass else: writer.write('__%s_attrs.%s = %s' % (name, item_name, item.name)) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 6a1dbfa..8c722b3 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -496,9 +496,10 @@ KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Obj ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError"; AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError"; RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError"; -__gpu_object = function(cls, struct_name) { +__gpu_object = function(cls, struct_name, data_name) { cls.prototype.__struct_name__ = struct_name; + cls.prototype.__struct_data__ = data_name; } gpu = { "object":__gpu_object }; @@ -522,7 +523,7 @@ GLSLJITRuntime.prototype.__init__ = function(header) { this.shader = []; this.object_packagers = []; this.struct_types = __jsdict([]); - this.glsltypes = ["vec2", "vec3", "vec4", "mat4", "mat4x4"]; + this.glsltypes = ["vec2", "vec3", "vec4", "mat4"]; this.matrices = []; } @@ -574,7 +575,7 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { integers = []; structs = []; struct_type = []; - if (__test_if_true__(struct_name && __contains__(this.glsltypes, struct_name) && Object.hasOwnProperty.call(ob, "elements"))) { + if (__test_if_true__(struct_name && __contains__(this.glsltypes, struct_name))) { return struct_name; } var __iter2 = dir(ob); @@ -663,7 +664,7 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { GLSLJITRuntime.define_structure = function () { return GLSLJITRuntime.prototype.define_structure.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.structure = function(ob, name) { - var sname,args,wrapper,value,aname,stype; + var sname,args,o,wrapper,value,aname,stype; wrapper = null; if (__test_if_true__(ob instanceof Object)) { /*pass*/ @@ -681,19 +682,22 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { stype = this.struct_types[sname]; if (! (__contains__(this.struct_types, sname))) { if (__contains__(this.glsltypes, sname)) { - if (__test_if_true__(( sname ) == "mat4" || ( sname ) == "mat4x4")) { - if (__test_if_true__(Object.hasOwnProperty.call(ob, "elements"))) { - var i,i__end__; - i = 0; - i__end__ = ob.elements.length; - while (( i ) < i__end__) { - value = (ob.elements[i] + ""); - if (! (__contains__(value, "."))) { - value += ".0"; - } - args.push(value); - i += 1; + if (( sname ) == "mat4") { + if (__test_if_true__(ob.__struct_data__)) { + o = ob[ob.__struct_data__]; + } else { + o = ob; + } + var i,i__end__; + i = 0; + i__end__ = o.length; + while (( i ) < i__end__) { + value = (o[i] + ""); + if (! (__contains__(value, "."))) { + value += ".0"; } + args.push(value); + i += 1; } } } else { @@ -1536,8 +1540,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 701: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 702: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 703: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 704: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2293,7 +2297,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__39; - __iterator__39 = __get__(__get__(arr, "__iter__", "no iterator - line 1191: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__39 = __get__(__get__(arr, "__iter__", "no iterator - line 1193: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__39; __next__39 = __get__(__iterator__39, "next"); while (( __iterator__39.index ) < __iterator__39.length) { @@ -2333,7 +2337,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1211: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1213: return ob.__len__()"), "__call__")(); } } } @@ -2353,7 +2357,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1215: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1217: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2372,7 +2376,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__40; - __iterator__40 = __get__(__get__(objs, "__iter__", "no iterator - line 1220: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(objs, "__iter__", "no iterator - line 1222: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2399,7 +2403,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__41; - __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1228: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1230: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { @@ -2426,7 +2430,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__42; - __iterator__42 = __get__(__get__(lst, "__iter__", "no iterator - line 1237: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(lst, "__iter__", "no iterator - line 1239: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { @@ -2457,7 +2461,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__43; - __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1244: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1246: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { @@ -2571,7 +2575,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1279: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1281: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2682,27 +2686,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__44; - __iterator__44 = __get__(__get__(ob, "__iter__", "no iterator - line 1334: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(ob, "__iter__", "no iterator - line 1336: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { o = __next__44(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1336: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1336: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1336: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1338: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1338: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1338: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1338: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1338: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1338: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1340: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1340: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1340: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__45; - __iterator__45 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1340: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1342: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { key = __next__45(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1341: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1342: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1343: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1344: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2729,15 +2733,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__46; - __iterator__46 = __get__(__get__(keys, "__iter__", "no iterator - line 1350: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(keys, "__iter__", "no iterator - line 1352: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = __get__(self["$wrapped"], "__getitem__", "line 1351: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1353: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1354: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1356: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2799,7 +2803,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1370: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1372: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2824,12 +2828,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__47; - __iterator__47 = __get__(__get__(other, "__iter__", "no iterator - line 1378: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(other, "__iter__", "no iterator - line 1380: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1379: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1379: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1381: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1381: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2849,12 +2853,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__48; - __iterator__48 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1383: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1385: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1384: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1386: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2899,7 +2903,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1394: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1396: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -3204,7 +3208,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1595: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1595: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1597: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1597: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3228,7 +3232,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1619: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1621: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3263,7 +3267,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1627: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1629: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3289,7 +3293,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1637: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1637: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1639: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1639: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3328,7 +3332,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1656: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1656: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1658: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1658: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3399,13 +3403,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1681: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1681: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1683: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1683: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1686: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1688: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3465,7 +3469,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1714: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1716: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3485,12 +3489,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__53; - __iterator__53 = __get__(__get__(lst, "__iter__", "no iterator - line 1718: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__53 = __get__(__get__(lst, "__iter__", "no iterator - line 1720: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__53; __next__53 = __get__(__iterator__53, "next"); while (( __iterator__53.index ) < __iterator__53.length) { value = __next__53(); - __get__(__get__(self, "append", "missing attribute `append` - line 1719: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1721: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3532,7 +3536,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1731: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1733: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3550,9 +3554,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1735: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1737: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1736: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1738: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index ba5cad7..e65ace3 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -16,8 +16,9 @@ JS('RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError";') with javascript: - def __gpu_object(cls, struct_name): + def __gpu_object(cls, struct_name, data_name): cls.prototype.__struct_name__ = struct_name + cls.prototype.__struct_data__ = data_name with lowlevel: gpu = { 'object' : __gpu_object @@ -32,7 +33,7 @@ def __init__(self, header): self.shader = [] self.object_packagers = [] self.struct_types = {} - self.glsltypes = ['vec2', 'vec3', 'vec4', 'mat4', 'mat4x4'] + self.glsltypes = ['vec2', 'vec3', 'vec4', 'mat4'] self.matrices = [] def compile_header(self): @@ -74,8 +75,7 @@ def define_structure(self, ob): structs = [] struct_type = [] ## fallback for javascript objects - if struct_name and struct_name in self.glsltypes and Object.hasOwnProperty.call(ob, 'elements'): - #ob = ob.elements + if struct_name and struct_name in self.glsltypes: return struct_name #for key in ob.keys(): @@ -158,14 +158,16 @@ def structure(self, ob, name): # if stype is None: ## TODO fix me if sname not in self.struct_types: if sname in self.glsltypes: - if sname == 'mat4' or sname == 'mat4x4': - - if Object.hasOwnProperty.call(ob, 'elements'): ## THREE.js - #self.matrices.push(ob.elements) - for i in range(ob.elements.length): - value = ob.elements[i] +'' - if '.' not in value: value += '.0' - args.push( value ) + if sname == 'mat4': + if ob.__struct_data__: + o = ob[ ob.__struct_data__ ] + else: + o = ob + + for i in range(o.length): + value = o[i] +'' + if '.' not in value: value += '.0' + args.push( value ) else: raise RuntimeError('no method to pack structure: ' +sname) diff --git a/regtests/run.py b/regtests/run.py index faa84fc..3151fda 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -354,6 +354,10 @@ def vectorize(self, f): return f def main(self, f): return f + def object(self, f): + return f + def method(self, f): + return f webworker = __faker__() glsl = __faker__() @@ -362,6 +366,8 @@ def main(self, f): typedef = __faker__() vec2 = None +def int16(a): return int(a) + try: import numpy except: diff --git a/regtests/webclgl/subroutine.py b/regtests/webclgl/subroutine.py index bfc4327..6850832 100644 --- a/regtests/webclgl/subroutine.py +++ b/regtests/webclgl/subroutine.py @@ -11,8 +11,8 @@ def main(): @gpu.main def myfunc(a): float* a - #return mysub( 1.1 * a[_id_], 2.2 ) - return mysub( 1.1 * a[...], 2.2 ) + vec2 id = get_global_id() + return mysub( 1.1 * a[id], 2.2 ) A = [1.3 for i in range(64)] From af64cfdef4f172726adf01d3a50a0aa1677fcc4b Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 3 Jul 2014 00:01:29 -0700 Subject: [PATCH 090/222] refactoring requirejs imports, allow import with dash `import a-b` because many npm package names use dash. --- pythonjs/python_to_pythonjs.py | 47 ++++++++++------- pythonjs/pythonjs.js | 81 ++++++++++++++---------------- pythonjs/pythonjs.py | 16 ++++-- pythonjs/runtime/builtins.py | 13 ++--- pythonjs/runtime/pythonpythonjs.py | 9 +++- pythonjs/typedpython.py | 3 ++ regtests/run.py | 1 + regtests/typed/long.py | 2 + 8 files changed, 96 insertions(+), 76 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 04833b6..91d111b 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -381,12 +381,14 @@ def visit_Import(self, node): writer.write( 'if __NODEJS__==True and typeof(Worker)=="undefined": Worker = require("workerjs")') elif alias.asname: - writer.write( '''inline("var %s = requirejs('%s')")''' %(alias.asname, alias.name) ) + #writer.write( '''inline("var %s = requirejs('%s')")''' %(alias.asname, alias.name) ) + writer.write( '''inline("var %s = require('%s')")''' %(alias.asname, alias.name.replace('__DASH__', '-')) ) elif '.' in alias.name: raise NotImplementedError('import with dot not yet supported: line %s' % node.lineno) else: - writer.write( '''inline("var %s = requirejs('%s')")''' %(alias.name, alias.name) ) + #writer.write( '''inline("var %s = requirejs('%s')")''' %(alias.name, alias.name) ) + writer.write( '''inline("var %s = require('%s')")''' %(alias.name, alias.name) ) def visit_ImportFrom(self, node): if self._with_dart: @@ -1145,6 +1147,8 @@ def visit_TryExcept(self, node): map(self.visit, node.body) writer.pull() map(self.visit, node.handlers) + if len(node.handlers)==0: + raise SyntaxError(self.format_error('no except handlers')) def visit_Raise(self, node): #if self._with_js or self._with_dart: @@ -2693,19 +2697,6 @@ def visit_FunctionDef(self, node): writer.write('self.onmessage = onmessage' ) - if return_type or return_type_keywords: - if return_type_keywords and return_type: - kw = ['%s=%s' %(k,v) for k,v in return_type_keywords.items()] - writer.write('@returns(%s, %s)' %(return_type,','.join(kw)) ) - elif return_type_keywords: - writer.write('@returns(%s)' %','.join( ['%s=%s' %(k,v) for k,v in return_type_keywords.items()] )) - else: - writer.write('@returns(%s)' %return_type) - - if gpu_vectorize: - writer.write('@gpu.vectorize') - if gpu_method: - writer.write('@gpu.method') ## force python variable scope, and pass user type information to second stage of translation. ## the dart backend can use this extra type information. @@ -2718,6 +2709,7 @@ def visit_FunctionDef(self, node): raise SyntaxError( self.format_error(err) ) local_vars = local_vars-global_vars + inlined_long = False if local_vars: args_typedefs = [] args = [ a.id for a in node.args.args ] @@ -2730,7 +2722,8 @@ def visit_FunctionDef(self, node): t = t[0].upper() + t[1:] v = '%s=%s' %(n,t) ## reverse local_typedef_names.add( n ) - if t == 'long': + if t == 'long' and inlined_long == False: + inlined_long = True writer.write('''inline("if (__NODEJS__==true) var long = require('long')")''') ## this is ugly if n in args: @@ -2744,6 +2737,24 @@ def visit_FunctionDef(self, node): writer.write('@__typedef__(%s)' %','.join(args_typedefs)) + if not self._with_dart and not self._with_lua and not self._with_js and not javascript and not self._with_glsl: + writer.write('@__pyfunction__') + + if return_type or return_type_keywords: + if return_type_keywords and return_type: + kw = ['%s=%s' %(k,v) for k,v in return_type_keywords.items()] + writer.write('@returns(%s, %s)' %(return_type,','.join(kw)) ) + elif return_type_keywords: + writer.write('@returns(%s)' %','.join( ['%s=%s' %(k,v) for k,v in return_type_keywords.items()] )) + else: + writer.write('@returns(%s)' %return_type) + + if gpu_vectorize: + writer.write('@gpu.vectorize') + if gpu_method: + writer.write('@gpu.method') + + if self._with_dart: ## dart supports optional positional params [x=1, y=2], or optional named {x:1, y:2} ## but not both at the same time. @@ -3087,8 +3098,8 @@ def visit_FunctionDef(self, node): writer.pull() ## end function body - if not self._with_dart and not self._with_lua and not self._with_js and not javascript and not self._with_glsl: - writer.write('%s.pythonscript_function=True'%node.name) + #if not self._with_dart and not self._with_lua and not self._with_js and not javascript and not self._with_glsl: + # writer.write('%s.pythonscript_function=True'%node.name) if gpu: diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 8c722b3..edc1bcb 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -654,9 +654,6 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { } members = "".join(member_list); code = (((("struct " + struct_name) + " {") + members) + "};"); - console.log("-------struct glsl code-------"); - console.log(code); - console.log("------------------------------"); this.struct_types[struct_name] = __jsdict([["arrays", arrays], ["floats", floats], ["integers", integers], ["structs", structs], ["code", code]]); } return struct_name; @@ -892,8 +889,6 @@ GLSLJITRuntime.prototype.unpack_vec4 = function(arr, dims) { GLSLJITRuntime.unpack_vec4 = function () { return GLSLJITRuntime.prototype.unpack_vec4.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.unpack_mat4 = function(arr) { var i; - console.log("unpack_mat4"); - console.log(arr); i = 0; var __iter13 = this.matrices; if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } @@ -1540,8 +1535,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 703: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 704: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 700: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 701: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2297,7 +2292,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__39; - __iterator__39 = __get__(__get__(arr, "__iter__", "no iterator - line 1193: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__39 = __get__(__get__(arr, "__iter__", "no iterator - line 1190: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__39; __next__39 = __get__(__iterator__39, "next"); while (( __iterator__39.index ) < __iterator__39.length) { @@ -2337,7 +2332,7 @@ len = function(args, kwargs) { if (__test_if_true__(ob instanceof Object)) { return Object.keys(ob).length; } else { - return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1213: return ob.__len__()"), "__call__")(); + return __get__(__get__(ob, "__len__", "missing attribute `__len__` - line 1210: return ob.__len__()"), "__call__")(); } } } @@ -2357,7 +2352,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1217: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1214: return obj.next()"), "__call__")(); } next.pythonscript_function = true; @@ -2376,7 +2371,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__40; - __iterator__40 = __get__(__get__(objs, "__iter__", "no iterator - line 1222: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(objs, "__iter__", "no iterator - line 1219: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2403,7 +2398,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__41; - __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1230: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1227: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { @@ -2430,7 +2425,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__42; - __iterator__42 = __get__(__get__(lst, "__iter__", "no iterator - line 1239: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(lst, "__iter__", "no iterator - line 1236: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { @@ -2461,7 +2456,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__43; - __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1246: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1243: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { @@ -2575,7 +2570,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1281: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1278: self.obj_get = obj.get ## cache this for speed"); } __Iterator___init__.pythonscript_function = true; @@ -2686,27 +2681,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__44; - __iterator__44 = __get__(__get__(ob, "__iter__", "no iterator - line 1336: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(ob, "__iter__", "no iterator - line 1333: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { o = __next__44(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1338: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1338: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1338: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1335: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1335: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1335: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1340: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1340: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1340: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1337: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1337: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1337: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__45; - __iterator__45 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1342: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1339: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { key = __next__45(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1343: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1344: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1340: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1341: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2733,15 +2728,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__46; - __iterator__46 = __get__(__get__(keys, "__iter__", "no iterator - line 1352: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(keys, "__iter__", "no iterator - line 1349: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = __get__(self["$wrapped"], "__getitem__", "line 1353: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1350: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1356: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1353: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2803,7 +2798,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1372: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1369: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2828,12 +2823,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__47; - __iterator__47 = __get__(__get__(other, "__iter__", "no iterator - line 1380: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(other, "__iter__", "no iterator - line 1377: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1381: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1381: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1378: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1378: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } @@ -2853,12 +2848,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__48; - __iterator__48 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1385: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1382: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1386: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1383: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2903,7 +2898,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1396: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1393: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } __dict_set.pythonscript_function = true; @@ -3208,7 +3203,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1597: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1597: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1594: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1594: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3232,7 +3227,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1621: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1618: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } __array___init__.pythonscript_function = true; @@ -3267,7 +3262,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1629: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1626: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3293,7 +3288,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1639: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1639: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1636: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1636: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3332,7 +3327,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1658: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1658: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1655: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1655: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3403,13 +3398,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1683: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1683: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1680: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1680: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1688: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1685: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3469,7 +3464,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1716: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1713: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } @@ -3489,12 +3484,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__53; - __iterator__53 = __get__(__get__(lst, "__iter__", "no iterator - line 1720: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__53 = __get__(__get__(lst, "__iter__", "no iterator - line 1717: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__53; __next__53 = __get__(__iterator__53, "next"); while (( __iterator__53.index ) < __iterator__53.length) { value = __next__53(); - __get__(__get__(self, "append", "missing attribute `append` - line 1721: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1718: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } @@ -3536,7 +3531,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1733: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1730: return self.to_array()"), "__call__")(); } __array_to_list.pythonscript_function = true; @@ -3554,9 +3549,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1737: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1734: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1738: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1735: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index a88292a..f966688 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -32,7 +32,7 @@ def __init__(self, requirejs=True, insert_runtime=True, webworker=False, functio self._webworker = webworker self._exports = set() - self.special_decorators = set(['__typedef__', '__glsl__']) + self.special_decorators = set(['__typedef__', '__glsl__', '__pyfunction__']) self._glsl = False self._has_glsl = False self._typed_vars = dict() @@ -215,6 +215,7 @@ def _visit_call_helper_var_glsl(self, node): def _visit_function(self, node): is_main = node.name == 'main' + is_pyfunc = False return_type = None glsl = False glsl_wrapper_name = False @@ -223,7 +224,9 @@ def _visit_function(self, node): gpu_method = False args_typedefs = {} for decor in node.decorator_list: - if isinstance(decor, ast.Name) and decor.id == '__glsl__': + if isinstance(decor, ast.Name) and decor.id == '__pyfunction__': + is_pyfunc = True + elif isinstance(decor, ast.Name) and decor.id == '__glsl__': glsl = True elif isinstance(decor, ast.Attribute) and isinstance(decor.value, ast.Name) and decor.value.id == '__glsl__': glsl_wrapper_name = decor.attr @@ -371,7 +374,7 @@ def _visit_function(self, node): lines.append(' var __webclgl = new WebCLGL()') lines.append(' var header = glsljit.compile_header()') lines.append(' var shader = glsljit.compile_main()') - lines.append(' console.log(shader)') + #lines.append(' console.log(shader)') ## create the webCLGL kernel, compiles GLSL source lines.append(' var __kernel = __webclgl.createKernel( shader, header );') @@ -425,7 +428,7 @@ def _visit_function(self, node): elif 'mat4' in gpu_return_types: lines.append(' var rbuffer = __webclgl.createBuffer([4,glsljit.matrices.length], "FLOAT4", __offset)') lines.append(' __webclgl.enqueueNDRangeKernel(__kernel, rbuffer)') - lines.append(' var __res = __webclgl.enqueueReadBuffer_Float4( rbuffer )') + lines.append(' var __res = __webclgl.enqueueReadBuffer_Float4( rbuffer )') ## slow lines.append(' return glsljit.unpack_mat4(__res)') else: raise SyntaxError('invalid GPU return type: %s' %gpu_return_types) @@ -442,7 +445,7 @@ def _visit_function(self, node): return '\n'.join(lines) - elif len(node.decorator_list)==1 and not ( isinstance(node.decorator_list[0], ast.Call) and node.decorator_list[0].func.id not in self.special_decorators ): + elif len(node.decorator_list)==1 and not (isinstance(node.decorator_list[0], ast.Call) and node.decorator_list[0].func.id in self.special_decorators ) and not (isinstance(node.decorator_list[0], ast.Name) and node.decorator_list[0].id in self.special_decorators): dec = self.visit(node.decorator_list[0]) buffer = self.indent() + '%s.%s = function(%s) {\n' % (dec,node.name, ', '.join(args)) @@ -481,6 +484,8 @@ def _visit_function(self, node): buffer += '\n'.join(body) self.pull() buffer += '\n%s}\n' %self.indent() + if is_pyfunc: + buffer += ';%s.is_wrapper = true;' %node.name ## TODO change to .__pyfunc__ return buffer def _visit_subscript_ellipsis(self, node): @@ -1086,6 +1091,7 @@ def generate_runtime(): return '\n'.join( lines ) def main(script, requirejs=True, insert_runtime=True, webworker=False, function_expressions=False): + #print(script) tree = ast.parse( script ) return JSGenerator( requirejs=requirejs, insert_runtime=insert_runtime, webworker=webworker, function_expressions=function_expressions ).visit(tree) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index e65ace3..b34bfa4 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -63,7 +63,7 @@ def push(self, s): def define_structure(self, ob): struct_name = None - ##if Object.hasOwnProperty(ob,'__struct_name__'): ## this is not right? + #if Object.hasOwnProperty.call(ob,'__struct_name__'): if ob.__struct_name__: struct_name = ob.__struct_name__ if struct_name in self.struct_types: @@ -128,9 +128,9 @@ def define_structure(self, ob): members = ''.join(member_list) code = 'struct ' +struct_name+ ' {' +members+ '};' - print('-------struct glsl code-------') - print(code) - print('------------------------------') + #print('-------struct glsl code-------') + #print(code) + #print('------------------------------') self.struct_types[ struct_name ] = { 'arrays' : arrays, 'floats' : floats, @@ -291,14 +291,11 @@ def unpack_vec4(self, arr, dims): return rows def unpack_mat4(self, arr): - print('unpack_mat4') - print(arr) i = 0 for mat in self.matrices: for j in range(16): mat[j] = arr[i] i += 1 - return self.matrices with lowlevel: @@ -652,7 +649,7 @@ def __call__(): return object - __call__.pythonscript_function = True + __call__.is_wrapper = True klass.__call__ = __call__ return klass diff --git a/pythonjs/runtime/pythonpythonjs.py b/pythonjs/runtime/pythonpythonjs.py index 4fb8aa6..438bbad 100644 --- a/pythonjs/runtime/pythonpythonjs.py +++ b/pythonjs/runtime/pythonpythonjs.py @@ -56,8 +56,13 @@ def __get__(object, attribute, error_message): else: raise AttributeError('undefined has no attribute: ' +attribute) + #if attribute == '__getitem__' and instanceof(object, Array): ## NOT REQUIRED + # ## allows list comp on Array called from Python-mode ## + # def wrapper(args,kwargs): return object[ args[0] ] + # wrapper.is_wrapper = True + # return wrapper if attribute == '__call__': - if object.pythonscript_function or object.is_wrapper: ## common case + if object.pythonscript_function or object.is_wrapper: ## common case - TODO replaced by __pyfunc__ return object elif object.cached_wrapper: ## rare case return object.cached_wrapper @@ -124,7 +129,7 @@ def wrapper(args,kwargs): return attr.apply(object, args) ## attr can be null and will return, undefined will raise AttributeError ## if attr is not undefined: if typeof(attr) == 'function': - if JS("attr.pythonscript_function === undefined && attr.is_wrapper === undefined"): + if JS("attr.pythonscript_function === undefined && attr.is_wrapper === undefined"): ## TODO pythonscript_function will be replaced with __pyfunc__ ## if there is a prototype with methods, then we can be sure that the user indends to call `new` on it, ## however rare, it is still possible that it is a constructor without a prototype of any length, diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index a82d2c7..bc965a5 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -76,6 +76,9 @@ def transform_source( source, strip=False ): break indent = ''.join(indent) output.append( indent + '@returns(%s)' %rtype) + elif c.startswith('import ') and '-' in c: + c = c.replace('-', '__DASH__') + output.append( c ) diff --git a/regtests/run.py b/regtests/run.py index 3151fda..54ffcdf 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -365,6 +365,7 @@ def method(self, f): returns = __faker__() typedef = __faker__() vec2 = None +mat4 = None def int16(a): return int(a) diff --git a/regtests/typed/long.py b/regtests/typed/long.py index 76f637e..cfacbc9 100644 --- a/regtests/typed/long.py +++ b/regtests/typed/long.py @@ -15,3 +15,5 @@ def main(): TestError( y <= b ) TestError( b >= y ) + +## TODO check why this fails when used with translator.py directly (bad indent bug) \ No newline at end of file From 2ce6f21be3b1cc7af8e83dffd3c16683b7f2cd99 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 3 Jul 2014 00:02:37 -0700 Subject: [PATCH 091/222] testing ripple-lib npm package. --- regtests/requirejs/import_ripplelib.py | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 regtests/requirejs/import_ripplelib.py diff --git a/regtests/requirejs/import_ripplelib.py b/regtests/requirejs/import_ripplelib.py new file mode 100644 index 0000000..30914c3 --- /dev/null +++ b/regtests/requirejs/import_ripplelib.py @@ -0,0 +1,37 @@ +'''test ripple library''' +# sudo npm install -g ripple-lib +# https://github.com/ripple/ripple-lib/blob/develop/docs/GUIDES.md + +import ripple-lib as ripple + +def main(): + R = new(ripple.Remote( + trusted=True, + local_signing=True, + local_fee=True, + fee_cushion=1.5, + servers = [ + {'host':'s1.ripple.com', 'port':443, 'secure':True} + ] + )) + def on_connect(): + print('connected!') + test2(R) + + R.connect( on_connect ) + +def test2(R): + req = R.request_server_info() + def on_server_info_ok(r): + print('info ok') + print(r) + def on_server_info_err(e): + print('info err') + print(e) + + req.on('success', on_server_info_ok) + req.on('error', on_server_info_err) + + req.request() + + print('ripple-lib test complete') From 278fd35bc8af642eff7c7444fb0c0cecb26fb2f0 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 5 Jul 2014 00:16:54 -0700 Subject: [PATCH 092/222] updated test runner to run test in regtests/html/ in google-chrome, for testing external libs like three.js --- pythonjs/python_to_pythonjs.py | 2 + pythonjs/pythonjs.js | 292 ++++++++++----------------- pythonjs/runtime/builtins.py | 7 +- pythonjs/translator.py | 5 +- regtests/html/three_basic_geoms.html | 91 +++++++++ regtests/run.py | 52 ++++- 6 files changed, 261 insertions(+), 188 deletions(-) create mode 100644 regtests/html/three_basic_geoms.html diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 91d111b..1dc06b9 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -133,6 +133,8 @@ def format_error(self, node): return msg def __init__(self, source=None, module=None, module_path=None, dart=False, coffee=False, lua=False): + if source.strip().startswith(' + + + + + +Meshes = [] +ren = None +scn = None +cam = None + +def main(): + global ren, scn, cam + + div = document.createElement( 'div' ) + document.body.appendChild(div) + print(div) + + width = 640; height = 320 + scn = new( THREE.Scene() ) + print(scn) + cam = new( THREE.PerspectiveCamera( 45, width/height, 0.01, 10000) ) + print(cam) + cam.position.z = 60 + cam.position.x = 5 + + ren = new( THREE.WebGLRenderer() ) + print(ren) + ren.setSize( width, height ) + #ren.setClearColor( 0.5, 0.5, 0.5 ) + + div.appendChild( ren.domElement ) + + light = new( THREE.PointLight() ) + light.position.set( 0, 100, 90 ) + scn.add( light ) + print(light) + + radius = 4; segments = 32 + geo = new( THREE.CircleGeometry( radius, segments ) ) + mat = new( THREE.MeshBasicMaterial() ) + mesh = new( THREE.Mesh( geo, mat ) ) + mesh.position.x = -30 + scn.add( mesh ) + Meshes.append( mesh ) + + radiusTop=3; radiusBottom=6; height=10 + geo = new( THREE.CylinderGeometry( radiusTop, radiusBottom, height ) ) + mat = new( THREE.MeshPhongMaterial() ) + mesh = new( THREE.Mesh( geo, mat ) ) + mesh.position.x = -15 + scn.add( mesh ) + Meshes.append( mesh ) + + radius=4.0; detail=1 + geo = new( THREE.IcosahedronGeometry( radius, detail ) ) + mat = new( THREE.MeshPhongMaterial() ) + mesh = new( THREE.Mesh( geo, mat ) ) + mesh.position.x = 0 + scn.add( mesh ) + Meshes.append( mesh ) + + geo = new( THREE.OctahedronGeometry( radius, detail ) ) + mat = new( THREE.MeshPhongMaterial() ) + mesh = new( THREE.Mesh( geo, mat ) ) + mesh.position.x = 15 + scn.add( mesh ) + Meshes.append( mesh ) + + print('OK') + animate() + +def animate(): + requestAnimationFrame( animate ) + for m in Meshes: + m.rotation.x = m.rotation.x + 0.01 + m.rotation.y = m.rotation.y + 0.02 + x = m.quaternion.x + y = m.quaternion.y + z = m.quaternion.z + m.material.color.setRGB( x,y,z ) + + ren.render( scn, cam ) + + + + + + + + \ No newline at end of file diff --git a/regtests/run.py b/regtests/run.py index 54ffcdf..b8a3c10 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -204,6 +204,9 @@ def files(): benchmarks.append( dirpath + os.path.sep + filename ) else: tests.append( dirpath + os.path.sep + filename ) + elif 'html' in dirpath and filename.endswith(".html"): + tests.append( dirpath + os.path.sep + filename ) + tests.extend( benchmarks ) return tests @@ -424,7 +427,7 @@ def run_python3_test_on(filename): -def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False, luajs=False, multioutput=False): +def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False, luajs=False, multioutput=False, requirejs=True): global tmpname tmpname = os.path.join( tempfile.gettempdir(), @@ -480,6 +483,9 @@ def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False elif luajs: cmd.append( '--luajs') + if not requirejs: + cmd.append( '--no-wrapper' ) + stdout, stderr = run_command(' '.join(cmd), returns_stdout_stderr=True) if stderr: return '' @@ -725,6 +731,45 @@ def run_luajs_node(content): return run_command("node %s.js" % tmpname) +def run_html_test( filename, sum_errors ): + lines = open(filename, 'rb').read().decode('utf-8').splitlines() + filename = os.path.split(filename)[-1] + doc = []; script = None + for line in lines: + if line.strip().startswith('') + script = list() + elif 'src=' in line and '~/' in line: ## external javascripts installed in users home folder + x = line.split('src="')[-1].split('"')[0] + if os.path.isfile(os.path.expanduser(x)): + + doc.append( '') + else: + doc.append( line ) + + elif line.strip() == '': + if script: + open('/tmp/%s.js'%filename, 'wb').write( ('\n'.join(script)).encode('utf-8') ) + js = translate_js( '/tmp/%s.js'%filename, requirejs=False ) ## inserts TestError and others + doc.append( js ) + doc.append( line ) + script = None + + elif isinstance( script, list ): + script.append( line ) + + else: + doc.append( line ) + + html = '\n'.join(doc) + open('/tmp/%s.html'%filename, 'wb').write( html.encode('utf-8') ) + ## non-blocking, TODO check for chrome extension that allows output of console.log to stdout + subprocess.check_call(['google-chrome', '--app=file:///tmp/%s.html'%filename]) + + table_header = "%-12.12s %-28.28s" table_cell = '%-6.6s' @@ -736,6 +781,11 @@ def run_test_on(filename): f.close() print(table_header % (filename[2:-3], comment), end='') sum_errors = {} + + if filename.endswith('.html'): + run_html_test( filename, sum_errors ) + return sum_errors + def display(function): global _test_description _test_description = function.__doc__ From 4da010f7e32234e8c51f3c64524618e12b6a520c Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 5 Jul 2014 16:48:01 -0700 Subject: [PATCH 093/222] allow javascript-style syntax `new XXX`, skip comment lines `//`. new three.js test. --- pythonjs/typedpython.py | 14 ++- regtests/html/webgl_css3d_sandbox.html | 151 +++++++++++++++++++++++++ 2 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 regtests/html/webgl_css3d_sandbox.html diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index bc965a5..ddb5531 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -49,8 +49,17 @@ def transform_source( source, strip=False ): a.append( char ) else: a.append( char ) - + if not a: + continue + if a[-1]==';': + a.pop() c = ''.join(a) + cs = c.strip() + if cs.startswith('//'): + continue + if cs.startswith('var '): + c = c.replace('var ', '') + if '= def ' in c: x, c = c.split('= def ') indent = [] @@ -78,6 +87,9 @@ def transform_source( source, strip=False ): output.append( indent + '@returns(%s)' %rtype) elif c.startswith('import ') and '-' in c: c = c.replace('-', '__DASH__') + elif ' new ' in c: + c += ')' * c.count(' new ') + c = c.replace(' new ', ' new(') output.append( c ) diff --git a/regtests/html/webgl_css3d_sandbox.html b/regtests/html/webgl_css3d_sandbox.html new file mode 100644 index 0000000..1fab1b6 --- /dev/null +++ b/regtests/html/webgl_css3d_sandbox.html @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + From fd5c8cc8f09155bde90dcf0c952d3abaa25a572c Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 5 Jul 2014 23:30:10 -0700 Subject: [PATCH 094/222] testing postproc shaders with three.js webgl and css mix. --- regtests/html/three_basic_geoms.html | 2 +- regtests/html/webgl_css3d_sandbox.html | 160 +++++++++++++++++++++---- 2 files changed, 139 insertions(+), 23 deletions(-) diff --git a/regtests/html/three_basic_geoms.html b/regtests/html/three_basic_geoms.html index 0b263ee..6432a72 100644 --- a/regtests/html/three_basic_geoms.html +++ b/regtests/html/three_basic_geoms.html @@ -2,7 +2,7 @@ - + @@ -16,12 +30,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 666fc14b5d689b6ac03bd2f2afc61666ff31ba6c Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 6 Jul 2014 18:34:43 -0700 Subject: [PATCH 096/222] found some new hacks: if `element.focus()` is called when an html INPUT or TEXTAREA is clicked it will then accept keyboard input, the same trick also works for drop down select menus, the enter key will trigger the options to show. the direct hack for taking keyboard input is no longer required. --- regtests/html/webgl_css3d_simple_editor.html | 457 +++++++++++++++++++ regtests/run.py | 11 +- 2 files changed, 467 insertions(+), 1 deletion(-) create mode 100644 regtests/html/webgl_css3d_simple_editor.html diff --git a/regtests/html/webgl_css3d_simple_editor.html b/regtests/html/webgl_css3d_simple_editor.html new file mode 100644 index 0000000..c45b9e0 --- /dev/null +++ b/regtests/html/webgl_css3d_simple_editor.html @@ -0,0 +1,457 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/regtests/run.py b/regtests/run.py index b8a3c10..4d0210f 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -736,7 +736,16 @@ def run_html_test( filename, sum_errors ): filename = os.path.split(filename)[-1] doc = []; script = None for line in lines: - if line.strip().startswith('') + css = line.split('href=')[-1].split()[0][1:-1] + print('css', css) + assert css.startswith('~/') + assert css.endswith('.css') + assert os.path.isfile( os.path.expanduser(css) ) + doc.append( open(os.path.expanduser(css), 'rb').read().decode('utf-8') ) + doc.append('') + elif line.strip().startswith('') script = list() From 777c710d8c4281597403d11ef3121c3749a09f31 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 6 Jul 2014 19:49:37 -0700 Subject: [PATCH 097/222] fixed loop over NodeList items `for node in document.getElementsByTagName(XXX):` in javascript mode. fixed select dropdown box - display picked option. --- pythonjs/pythonjs.js | 184 ++++++++++--------- pythonjs/pythonjs.py | 2 +- pythonjs/runtime/builtins.py | 5 + regtests/html/webgl_css3d_simple_editor.html | 152 ++++----------- 4 files changed, 136 insertions(+), 207 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index f3ed58a..30b054a 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -283,7 +283,7 @@ __get__ = function(object, attribute, error_message) { } bases = __class__.__bases__; var __iter1 = bases; - if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) ) { __iter1 = __object_keys__(__iter1) } + if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) || __is_node_list(__iter1) ) { __iter1 = __object_keys__(__iter1) } for (var __idx1=0; __idx1 < __iter1.length; __idx1++) { var base = __iter1[ __idx1 ]; attr = _get_upstream_attribute(base, attribute); @@ -330,7 +330,7 @@ __get__ = function(object, attribute, error_message) { } } var __iter2 = bases; - if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } + if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) || __is_node_list(__iter2) ) { __iter2 = __object_keys__(__iter2) } for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { var base = __iter2[ __idx2 ]; var prop; @@ -343,7 +343,7 @@ __get__ = function(object, attribute, error_message) { return __class__["__getattr__"]([object, attribute], {}); } var __iter3 = bases; - if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) ) { __iter3 = __object_keys__(__iter3) } + if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) || __is_node_list(__iter3) ) { __iter3 = __object_keys__(__iter3) } for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { var base = __iter3[ __idx3 ]; var f; @@ -405,7 +405,7 @@ _get_upstream_attribute = function(base, attr) { return base[attr]; } var __iter4 = base.__bases__; - if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } + if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) || __is_node_list(__iter4) ) { __iter4 = __object_keys__(__iter4) } for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { var parent = __iter4[ __idx4 ]; return _get_upstream_attribute(parent, attr); @@ -417,7 +417,7 @@ _get_upstream_property = function(base, attr) { return base.__properties__[attr]; } var __iter5 = base.__bases__; - if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } + if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) || __is_node_list(__iter5) ) { __iter5 = __object_keys__(__iter5) } for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { var parent = __iter5[ __idx5 ]; return _get_upstream_property(parent, attr); @@ -486,8 +486,8 @@ try { } catch(__exception__) { console.trace(); console.error(__exception__, __exception__.message); -console.error("line 5: pythonjs.configure( runtime_exceptions=False )"); -throw new RuntimeError("line 5: pythonjs.configure( runtime_exceptions=False )"); +console.error("line 4: pythonjs.configure( runtime_exceptions=False )"); +throw new RuntimeError("line 4: pythonjs.configure( runtime_exceptions=False )"); } _PythonJS_UID = 0; @@ -532,7 +532,7 @@ GLSLJITRuntime.prototype.compile_header = function() { var a,b; a = []; var __iter1 = this.struct_types; - if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) ) { __iter1 = __object_keys__(__iter1) } + if (! (__iter1 instanceof Array || typeof __iter1 == "string" || __is_typed_array(__iter1)) || __is_node_list(__iter1) ) { __iter1 = __object_keys__(__iter1) } for (var __idx1=0; __idx1 < __iter1.length; __idx1++) { var sname = __iter1[ __idx1 ]; if (__contains__(this.glsltypes, sname)) { @@ -579,7 +579,7 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { return struct_name; } var __iter2 = dir(ob); - if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) ) { __iter2 = __object_keys__(__iter2) } + if (! (__iter2 instanceof Array || typeof __iter2 == "string" || __is_typed_array(__iter2)) || __is_node_list(__iter2) ) { __iter2 = __object_keys__(__iter2) } for (var __idx2=0; __idx2 < __iter2.length; __idx2++) { var key = __iter2[ __idx2 ]; if (__test_if_true__(( key.length ) == 1 && __contains__("0123456789", key))) { @@ -624,26 +624,26 @@ GLSLJITRuntime.prototype.define_structure = function(ob) { if (! (__contains__(this.struct_types, struct_name))) { member_list = []; var __iter3 = integers; - if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) ) { __iter3 = __object_keys__(__iter3) } + if (! (__iter3 instanceof Array || typeof __iter3 == "string" || __is_typed_array(__iter3)) || __is_node_list(__iter3) ) { __iter3 = __object_keys__(__iter3) } for (var __idx3=0; __idx3 < __iter3.length; __idx3++) { var key = __iter3[ __idx3 ]; member_list.append((("int " + key) + ";")); } var __iter4 = floats; - if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) ) { __iter4 = __object_keys__(__iter4) } + if (! (__iter4 instanceof Array || typeof __iter4 == "string" || __is_typed_array(__iter4)) || __is_node_list(__iter4) ) { __iter4 = __object_keys__(__iter4) } for (var __idx4=0; __idx4 < __iter4.length; __idx4++) { var key = __iter4[ __idx4 ]; member_list.append((("float " + key) + ";")); } var __iter5 = arrays; - if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) ) { __iter5 = __object_keys__(__iter5) } + if (! (__iter5 instanceof Array || typeof __iter5 == "string" || __is_typed_array(__iter5)) || __is_node_list(__iter5) ) { __iter5 = __object_keys__(__iter5) } for (var __idx5=0; __idx5 < __iter5.length; __idx5++) { var key = __iter5[ __idx5 ]; arr = ob[key]; member_list.append((((("float " + key) + "[") + arr.length) + "];")); } var __iter6 = structs; - if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) ) { __iter6 = __object_keys__(__iter6) } + if (! (__iter6 instanceof Array || typeof __iter6 == "string" || __is_typed_array(__iter6)) || __is_node_list(__iter6) ) { __iter6 = __object_keys__(__iter6) } for (var __idx6=0; __idx6 < __iter6.length; __idx6++) { var key = __iter6[ __idx6 ]; subtype = ob[key].__struct_name__; @@ -703,13 +703,13 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { } if (__test_if_true__(stype)) { var __iter7 = stype["integers"]; - if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) ) { __iter7 = __object_keys__(__iter7) } + if (! (__iter7 instanceof Array || typeof __iter7 == "string" || __is_typed_array(__iter7)) || __is_node_list(__iter7) ) { __iter7 = __object_keys__(__iter7) } for (var __idx7=0; __idx7 < __iter7.length; __idx7++) { var key = __iter7[ __idx7 ]; args.push((ob[key][0] + "")); } var __iter8 = stype["floats"]; - if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) ) { __iter8 = __object_keys__(__iter8) } + if (! (__iter8 instanceof Array || typeof __iter8 == "string" || __is_typed_array(__iter8)) || __is_node_list(__iter8) ) { __iter8 = __object_keys__(__iter8) } for (var __idx8=0; __idx8 < __iter8.length; __idx8++) { var key = __iter8[ __idx8 ]; value = (ob[key] + ""); @@ -719,7 +719,7 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { args.push(value); } var __iter9 = stype["arrays"]; - if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) ) { __iter9 = __object_keys__(__iter9) } + if (! (__iter9 instanceof Array || typeof __iter9 == "string" || __is_typed_array(__iter9)) || __is_node_list(__iter9) ) { __iter9 = __object_keys__(__iter9) } for (var __idx9=0; __idx9 < __iter9.length; __idx9++) { var key = __iter9[ __idx9 ]; aname = (("_" + key) + name); @@ -727,7 +727,7 @@ GLSLJITRuntime.prototype.structure = function(ob, name) { args.push(aname); } var __iter10 = stype["structs"]; - if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) ) { __iter10 = __object_keys__(__iter10) } + if (! (__iter10 instanceof Array || typeof __iter10 == "string" || __is_typed_array(__iter10)) || __is_node_list(__iter10) ) { __iter10 = __object_keys__(__iter10) } for (var __idx10=0; __idx10 < __iter10.length; __idx10++) { var key = __iter10[ __idx10 ]; aname = (("_" + key) + name); @@ -800,7 +800,7 @@ GLSLJITRuntime.array = function () { return GLSLJITRuntime.prototype.array.apply GLSLJITRuntime.prototype.object = function(ob, name) { var func,cls; var __iter11 = this.object_packagers; - if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) ) { __iter11 = __object_keys__(__iter11) } + if (! (__iter11 instanceof Array || typeof __iter11 == "string" || __is_typed_array(__iter11)) || __is_node_list(__iter11) ) { __iter11 = __object_keys__(__iter11) } for (var __idx11=0; __idx11 < __iter11.length; __idx11++) { var p = __iter11[ __idx11 ]; var __r_0; @@ -826,7 +826,7 @@ GLSLJITRuntime.prototype.unpack_array2d = function(arr, dims) { row = []; rows = [row]; var __iter12 = arr; - if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) ) { __iter12 = __object_keys__(__iter12) } + if (! (__iter12 instanceof Array || typeof __iter12 == "string" || __is_typed_array(__iter12)) || __is_node_list(__iter12) ) { __iter12 = __object_keys__(__iter12) } for (var __idx12=0; __idx12 < __iter12.length; __idx12++) { var value = __iter12[ __idx12 ]; row.append(value); @@ -891,7 +891,7 @@ GLSLJITRuntime.prototype.unpack_mat4 = function(arr) { var i; i = 0; var __iter13 = this.matrices; - if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) ) { __iter13 = __object_keys__(__iter13) } + if (! (__iter13 instanceof Array || typeof __iter13 == "string" || __is_typed_array(__iter13)) || __is_node_list(__iter13) ) { __iter13 = __object_keys__(__iter13) } for (var __idx13=0; __idx13 < __iter13.length; __idx13++) { var mat = __iter13[ __idx13 ]; var j,j__end__; @@ -979,6 +979,16 @@ __split_method = function(ob, delim) { } } ;__split_method.is_wrapper = true; +__is_node_list = function(ob) { + + if (( typeof(NodeList) ) == "function") { + if (__test_if_true__(ob instanceof NodeList)) { + return true; + } + } + return false; +} + __is_typed_array = function(ob) { if (__test_if_true__(ob instanceof Int8Array || ob instanceof Uint8Array)) { @@ -1024,7 +1034,7 @@ __contains__ = function(ob, a) { } else { if (__test_if_true__(__is_typed_array(ob))) { var __iter14 = ob; - if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) ) { __iter14 = __object_keys__(__iter14) } + if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14)) || __is_node_list(__iter14) ) { __iter14 = __object_keys__(__iter14) } for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { var x = __iter14[ __idx14 ]; if (( x ) == a) { @@ -1110,7 +1120,7 @@ __jsdict = function(items) { var d,key; d = {}; var __iter15 = items; - if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) ) { __iter15 = __object_keys__(__iter15) } + if (! (__iter15 instanceof Array || typeof __iter15 == "string" || __is_typed_array(__iter15)) || __is_node_list(__iter15) ) { __iter15 = __object_keys__(__iter15) } for (var __idx15=0; __idx15 < __iter15.length; __idx15++) { var item = __iter15[ __idx15 ]; key = item[0]; @@ -1161,7 +1171,7 @@ __jsdict_values = function(ob) { if (__test_if_true__(ob instanceof Object)) { arr = []; var __iter16 = ob; - if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) ) { __iter16 = __object_keys__(__iter16) } + if (! (__iter16 instanceof Array || typeof __iter16 == "string" || __is_typed_array(__iter16)) || __is_node_list(__iter16) ) { __iter16 = __object_keys__(__iter16) } for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { var key = __iter16[ __idx16 ]; if (__test_if_true__(ob.hasOwnProperty(key))) { @@ -1180,7 +1190,7 @@ __jsdict_items = function(ob) { if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; var __iter17 = ob; - if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) ) { __iter17 = __object_keys__(__iter17) } + if (! (__iter17 instanceof Array || typeof __iter17 == "string" || __is_typed_array(__iter17)) || __is_node_list(__iter17) ) { __iter17 = __object_keys__(__iter17) } for (var __idx17=0; __idx17 < __iter17.length; __idx17++) { var key = __iter17[ __idx17 ]; if (__test_if_true__(Object.hasOwnProperty.call(ob, key))) { @@ -1249,7 +1259,7 @@ __object_keys__ = function(ob) { __bind_property_descriptors__ = function(o, klass) { var prop,desc; var __iter18 = klass.__properties__; - if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) ) { __iter18 = __object_keys__(__iter18) } + if (! (__iter18 instanceof Array || typeof __iter18 == "string" || __is_typed_array(__iter18)) || __is_node_list(__iter18) ) { __iter18 = __object_keys__(__iter18) } for (var __idx18=0; __idx18 < __iter18.length; __idx18++) { var name = __iter18[ __idx18 ]; desc = __jsdict([["enumerable", true]]); @@ -1263,7 +1273,7 @@ __bind_property_descriptors__ = function(o, klass) { Object.defineProperty(o, name, desc); } var __iter19 = klass.__bases__; - if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) ) { __iter19 = __object_keys__(__iter19) } + if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19)) || __is_node_list(__iter19) ) { __iter19 = __object_keys__(__iter19) } for (var __idx19=0; __idx19 < __iter19.length; __idx19++) { var base = __iter19[ __idx19 ]; __bind_property_descriptors__(o, base); @@ -1298,7 +1308,7 @@ __sprintf = function(fmt, args) { var i; i = 0; var __iter20 = chunks; - if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) ) { __iter20 = __object_keys__(__iter20) } + if (! (__iter20 instanceof Array || typeof __iter20 == "string" || __is_typed_array(__iter20)) || __is_node_list(__iter20) ) { __iter20 = __object_keys__(__iter20) } for (var __idx20=0; __idx20 < __iter20.length; __idx20++) { var txt = __iter20[ __idx20 ]; arr.append(txt); @@ -1334,7 +1344,7 @@ __create_class__ = function(class_name, parents, attrs, props) { klass.__properties__ = props; klass.__attributes__ = attrs; var __iter21 = attrs; - if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) ) { __iter21 = __object_keys__(__iter21) } + if (! (__iter21 instanceof Array || typeof __iter21 == "string" || __is_typed_array(__iter21)) || __is_node_list(__iter21) ) { __iter21 = __object_keys__(__iter21) } for (var __idx21=0; __idx21 < __iter21.length; __idx21++) { var key = __iter21[ __idx21 ]; if (( typeof(attrs[key]) ) == "function") { @@ -1358,7 +1368,7 @@ __create_class__ = function(class_name, parents, attrs, props) { klass.__setters__ = []; klass.__getters__ = []; var __iter22 = klass.__properties__; - if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) ) { __iter22 = __object_keys__(__iter22) } + if (! (__iter22 instanceof Array || typeof __iter22 == "string" || __is_typed_array(__iter22)) || __is_node_list(__iter22) ) { __iter22 = __object_keys__(__iter22) } for (var __idx22=0; __idx22 < __iter22.length; __idx22++) { var name = __iter22[ __idx22 ]; prop = klass.__properties__[name]; @@ -1368,7 +1378,7 @@ __create_class__ = function(class_name, parents, attrs, props) { } } var __iter23 = klass.__bases__; - if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) ) { __iter23 = __object_keys__(__iter23) } + if (! (__iter23 instanceof Array || typeof __iter23 == "string" || __is_typed_array(__iter23)) || __is_node_list(__iter23) ) { __iter23 = __object_keys__(__iter23) } for (var __idx23=0; __idx23 < __iter23.length; __idx23++) { var base = __iter23[ __idx23 ]; Array.prototype.push.apply(klass.__getters__, base.__getters__); @@ -1384,7 +1394,7 @@ __create_class__ = function(class_name, parents, attrs, props) { has_getattribute = false; has_getattr = false; var __iter24 = klass.__all_method_names__; - if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) ) { __iter24 = __object_keys__(__iter24) } + if (! (__iter24 instanceof Array || typeof __iter24 == "string" || __is_typed_array(__iter24)) || __is_node_list(__iter24) ) { __iter24 = __object_keys__(__iter24) } for (var __idx24=0; __idx24 < __iter24.length; __idx24++) { var name = __iter24[ __idx24 ]; if (( name ) == "__getattribute__") { @@ -1432,7 +1442,7 @@ type = function(args, kwargs) { var ob_or_class_name = __args__['ob_or_class_name']; var bases = __args__['bases']; var class_dict = __args__['class_dict']; - "\n type(object) -> the object's type\n type(name, bases, dict) -> a new type ## broken? - TODO test\n "; + "\n type(object) -> the object's type\n type(name, bases, dict) -> a new(type ## broken? - TODO test)\n "; if (__test_if_true__(( bases ) === null && ( class_dict ) === null)) { return ob_or_class_name.__class__; } else { @@ -1527,8 +1537,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 700: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 701: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 606: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 607: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -1752,7 +1762,7 @@ _setup_str_prototype = function(args, kwargs) { } i = 0; var __iter25 = arr; - if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) ) { __iter25 = __object_keys__(__iter25) } + if (! (__iter25 instanceof Array || typeof __iter25 == "string" || __is_typed_array(__iter25)) || __is_node_list(__iter25) ) { __iter25 = __object_keys__(__iter25) } for (var __idx25=0; __idx25 < __iter25.length; __idx25++) { var value = __iter25[ __idx25 ]; out += value; @@ -1797,7 +1807,7 @@ _setup_str_prototype = function(args, kwargs) { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; var __iter26 = this; - if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) ) { __iter26 = __object_keys__(__iter26) } + if (! (__iter26 instanceof Array || typeof __iter26 == "string" || __is_typed_array(__iter26)) || __is_node_list(__iter26) ) { __iter26 = __object_keys__(__iter26) } for (var __idx26=0; __idx26 < __iter26.length; __idx26++) { var char = __iter26[ __idx26 ]; if (__contains__(digits, char)) { @@ -1814,7 +1824,7 @@ _setup_str_prototype = function(args, kwargs) { var digits; digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."]; var __iter27 = this; - if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) ) { __iter27 = __object_keys__(__iter27) } + if (! (__iter27 instanceof Array || typeof __iter27 == "string" || __is_typed_array(__iter27)) || __is_node_list(__iter27) ) { __iter27 = __object_keys__(__iter27) } for (var __idx27=0; __idx27 < __iter27.length; __idx27++) { var char = __iter27[ __idx27 ]; if (__contains__(digits, char)) { @@ -1844,7 +1854,7 @@ _setup_str_prototype = function(args, kwargs) { r = this; keys = Object.keys(fmt); var __iter28 = keys; - if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) ) { __iter28 = __object_keys__(__iter28) } + if (! (__iter28 instanceof Array || typeof __iter28 == "string" || __is_typed_array(__iter28)) || __is_node_list(__iter28) ) { __iter28 = __object_keys__(__iter28) } for (var __idx28=0; __idx28 < __iter28.length; __idx28++) { var key = __iter28[ __idx28 ]; r = r.split(key).join(fmt[key]); @@ -1993,7 +2003,7 @@ _setup_array_prototype = function(args, kwargs) { } arr = [start, (stop - start)]; var __iter29 = items; - if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) ) { __iter29 = __object_keys__(__iter29) } + if (! (__iter29 instanceof Array || typeof __iter29 == "string" || __is_typed_array(__iter29)) || __is_node_list(__iter29) ) { __iter29 = __object_keys__(__iter29) } for (var __idx29=0; __idx29 < __iter29.length; __idx29++) { var item = __iter29[ __idx29 ]; arr.push(item); @@ -2012,7 +2022,7 @@ _setup_array_prototype = function(args, kwargs) { var extend = function(other) { var __iter30 = other; - if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) ) { __iter30 = __object_keys__(__iter30) } + if (! (__iter30 instanceof Array || typeof __iter30 == "string" || __is_typed_array(__iter30)) || __is_node_list(__iter30) ) { __iter30 = __object_keys__(__iter30) } for (var __idx30=0; __idx30 < __iter30.length; __idx30++) { var obj = __iter30[ __idx30 ]; this.push(obj); @@ -2047,7 +2057,7 @@ _setup_array_prototype = function(args, kwargs) { var a; a = 0; var __iter31 = this; - if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) ) { __iter31 = __object_keys__(__iter31) } + if (! (__iter31 instanceof Array || typeof __iter31 == "string" || __is_typed_array(__iter31)) || __is_node_list(__iter31) ) { __iter31 = __object_keys__(__iter31) } for (var __idx31=0; __idx31 < __iter31.length; __idx31++) { var item = __iter31[ __idx31 ]; if (( item ) === obj) { @@ -2106,7 +2116,7 @@ _setup_array_prototype = function(args, kwargs) { var func = function(other) { var __iter32 = this; - if (! (__iter32 instanceof Array || typeof __iter32 == "string" || __is_typed_array(__iter32)) ) { __iter32 = __object_keys__(__iter32) } + if (! (__iter32 instanceof Array || typeof __iter32 == "string" || __is_typed_array(__iter32)) || __is_node_list(__iter32) ) { __iter32 = __object_keys__(__iter32) } for (var __idx32=0; __idx32 < __iter32.length; __idx32++) { var item = __iter32[ __idx32 ]; if (( other.indexOf(item) ) == -1) { @@ -2272,7 +2282,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__39; - __iterator__39 = __get__(__get__(arr, "__iter__", "no iterator - line 1190: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__39 = __get__(__get__(arr, "__iter__", "no iterator - line 1009: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__39; __next__39 = __get__(__iterator__39, "next"); while (( __iterator__39.index ) < __iterator__39.length) { @@ -2330,7 +2340,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1213: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1027: return obj.next()"), "__call__")(); } ;next.is_wrapper = true; map = function(args, kwargs) { @@ -2348,7 +2358,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__40; - __iterator__40 = __get__(__get__(objs, "__iter__", "no iterator - line 1218: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(objs, "__iter__", "no iterator - line 1030: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2374,7 +2384,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__41; - __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1226: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1037: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { @@ -2400,7 +2410,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__42; - __iterator__42 = __get__(__get__(lst, "__iter__", "no iterator - line 1235: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(lst, "__iter__", "no iterator - line 1044: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { @@ -2430,7 +2440,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__43; - __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1242: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1050: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { @@ -2540,7 +2550,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1277: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1078: self.obj_get = obj.get ## cache this for speed"); } ;__Iterator___init__.is_wrapper = true; __Iterator_attrs.__init__ = __Iterator___init__; @@ -2647,27 +2657,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__44; - __iterator__44 = __get__(__get__(ob, "__iter__", "no iterator - line 1332: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(ob, "__iter__", "no iterator - line 1121: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { o = __next__44(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1334: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1334: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1334: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1123: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1123: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1123: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1336: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1336: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1336: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1125: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1125: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1125: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__45; - __iterator__45 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1338: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1127: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { key = __next__45(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1339: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1340: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1128: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1129: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2693,15 +2703,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__46; - __iterator__46 = __get__(__get__(keys, "__iter__", "no iterator - line 1348: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(keys, "__iter__", "no iterator - line 1136: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = __get__(self["$wrapped"], "__getitem__", "line 1349: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1137: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1352: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1140: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2760,7 +2770,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1368: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1153: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2784,12 +2794,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__47; - __iterator__47 = __get__(__get__(other, "__iter__", "no iterator - line 1376: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(other, "__iter__", "no iterator - line 1159: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1377: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1377: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1160: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1160: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } ;__dict_update.is_wrapper = true; @@ -2808,12 +2818,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__48; - __iterator__48 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1381: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1163: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1382: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1164: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2856,7 +2866,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1392: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1172: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } ;__dict_set.is_wrapper = true; __dict_attrs.set = __dict_set; @@ -2987,7 +2997,7 @@ __dict_values = function(args, kwargs) { keys = Object.keys(self["$wrapped"]); out = []; var __iter33 = keys; - if (! (__iter33 instanceof Array || typeof __iter33 == "string" || __is_typed_array(__iter33)) ) { __iter33 = __object_keys__(__iter33) } + if (! (__iter33 instanceof Array || typeof __iter33 == "string" || __is_typed_array(__iter33)) || __is_node_list(__iter33) ) { __iter33 = __object_keys__(__iter33) } for (var __idx33=0; __idx33 < __iter33.length; __idx33++) { var key = __iter33[ __idx33 ]; out.push(self["$wrapped"][key]); @@ -3048,7 +3058,7 @@ set = function(args, kwargs) { } __args__ = __getargs__("set", __sig__, args, kwargs); var a = __args__['a']; - "\n This returns an array that is a minimal implementation of set.\n Often sets are used simply to remove duplicate entries from a list, \n and then it get converted back to a list, it is safe to use fastset for this.\n\n The array prototype is overloaded with basic set functions:\n difference\n intersection\n issubset\n\n Note: sets in Python are not subscriptable, but can be iterated over.\n\n Python docs say that set are unordered, some programs may rely on this disorder\n for randomness, for sets of integers we emulate the unorder only uppon initalization \n of the set, by masking the value by bits-1. Python implements sets starting with an \n array of length 8, and mask of 7, if set length grows to 6 (3/4th), then it allocates \n a new array of length 32 and mask of 31. This is only emulated for arrays of \n integers up to an array length of 1536.\n\n "; + "\n This returns an array that is a minimal implementation of set.\n Often sets are used simply to remove duplicate entries from a list, \n and then it get converted back to a list, it is safe to use fastset for this.\n The array prototype is overloaded with basic set functions:\n difference\n intersection\n issubset\n Note: sets in Python are not subscriptable, but can be iterated over.\n Python docs say that set are unordered, some programs may rely on this disorder\n for randomness, for sets of integers we emulate the unorder only uppon initalization \n of the set, by masking the value by bits-1. Python implements sets starting with an \n array of length 8, and mask of 7, if set length grows to 6 (3/4th), then it allocates \n a new(array of length 32 and mask of 31. This is only emulated for arrays of )\n integers up to an array length of 1536.\n "; hashtable = null; if (( a.length ) <= 1536) { hashtable = __jsdict([]); @@ -3074,7 +3084,7 @@ set = function(args, kwargs) { fallback = false; if (__test_if_true__(hashtable)) { var __iter34 = a; - if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34)) ) { __iter34 = __object_keys__(__iter34) } + if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34)) || __is_node_list(__iter34) ) { __iter34 = __object_keys__(__iter34) } for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { var b = __iter34[ __idx34 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { @@ -3092,7 +3102,7 @@ set = function(args, kwargs) { s = []; if (__test_if_true__(fallback)) { var __iter35 = a; - if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35)) ) { __iter35 = __object_keys__(__iter35) } + if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35)) || __is_node_list(__iter35) ) { __iter35 = __object_keys__(__iter35) } for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { var item = __iter35[ __idx35 ]; if (( s.indexOf(item) ) == -1) { @@ -3102,7 +3112,7 @@ set = function(args, kwargs) { } else { __sort_method(keys); var __iter36 = keys; - if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36)) ) { __iter36 = __object_keys__(__iter36) } + if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36)) || __is_node_list(__iter36) ) { __iter36 = __object_keys__(__iter36) } for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { var key = __iter36[ __idx36 ]; s.push(hashtable[key]); @@ -3150,7 +3160,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1593: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1593: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1340: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1340: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3174,7 +3184,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1617: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1361: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; @@ -3207,7 +3217,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1625: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1367: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3232,7 +3242,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1635: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1635: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1375: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1375: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3270,7 +3280,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1654: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1654: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1391: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1391: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3338,13 +3348,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1679: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1679: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1411: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1411: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1684: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1416: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3402,7 +3412,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1712: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1439: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; @@ -3421,12 +3431,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__53; - __iterator__53 = __get__(__get__(lst, "__iter__", "no iterator - line 1716: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__53 = __get__(__get__(lst, "__iter__", "no iterator - line 1442: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__53; __next__53 = __get__(__iterator__53, "next"); while (( __iterator__53.index ) < __iterator__53.length) { value = __next__53(); - __get__(__get__(self, "append", "missing attribute `append` - line 1717: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1443: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; @@ -3466,7 +3476,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1729: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1453: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; @@ -3483,9 +3493,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1733: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1456: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1734: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1457: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3617,14 +3627,14 @@ __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; var __iter37 = threading.workers; - if (! (__iter37 instanceof Array || typeof __iter37 == "string" || __is_typed_array(__iter37)) ) { __iter37 = __object_keys__(__iter37) } + if (! (__iter37 instanceof Array || typeof __iter37 == "string" || __is_typed_array(__iter37)) || __is_node_list(__iter37) ) { __iter37 = __object_keys__(__iter37) } for (var __idx37=0; __idx37 < __iter37.length; __idx37++) { var b = __iter37[ __idx37 ]; other = b["worker"]; args = b["args"]; if (( other ) !== worker) { var __iter38 = args; - if (! (__iter38 instanceof Array || typeof __iter38 == "string" || __is_typed_array(__iter38)) ) { __iter38 = __object_keys__(__iter38) } + if (! (__iter38 instanceof Array || typeof __iter38 == "string" || __is_typed_array(__iter38)) || __is_node_list(__iter38) ) { __iter38 = __object_keys__(__iter38) } for (var __idx38=0; __idx38 < __iter38.length; __idx38++) { var arg = __iter38[ __idx38 ]; if (( arg ) === ob) { @@ -3659,7 +3669,7 @@ __start_new_thread = function(f, args) { a = args[event.data.argindex]; a.push(event.data.value); var __iter39 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter39 instanceof Array || typeof __iter39 == "string" || __is_typed_array(__iter39)) ) { __iter39 = __object_keys__(__iter39) } + if (! (__iter39 instanceof Array || typeof __iter39 == "string" || __is_typed_array(__iter39)) || __is_node_list(__iter39) ) { __iter39 = __object_keys__(__iter39) } for (var __idx39=0; __idx39 < __iter39.length; __idx39++) { var other = __iter39[ __idx39 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); @@ -3674,7 +3684,7 @@ __start_new_thread = function(f, args) { a[event.data.index] = value; } var __iter40 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter40 instanceof Array || typeof __iter40 == "string" || __is_typed_array(__iter40)) ) { __iter40 = __object_keys__(__iter40) } + if (! (__iter40 instanceof Array || typeof __iter40 == "string" || __is_typed_array(__iter40)) || __is_node_list(__iter40) ) { __iter40 = __object_keys__(__iter40) } for (var __idx40=0; __idx40 < __iter40.length; __idx40++) { var other = __iter40[ __idx40 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); @@ -3692,7 +3702,7 @@ __start_new_thread = function(f, args) { var i; i = 0; var __iter41 = args; - if (! (__iter41 instanceof Array || typeof __iter41 == "string" || __is_typed_array(__iter41)) ) { __iter41 = __object_keys__(__iter41) } + if (! (__iter41 instanceof Array || typeof __iter41 == "string" || __is_typed_array(__iter41)) || __is_node_list(__iter41) ) { __iter41 = __object_keys__(__iter41) } for (var __idx41=0; __idx41 < __iter41.length; __idx41++) { var arg = __iter41[ __idx41 ]; if (__test_if_true__(arg.jsify)) { diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index f966688..b6eacc1 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -962,7 +962,7 @@ def _visit_for_prep_iter_helper(self, node, out, iter_name): #out.append( self.indent() + 'if (! (iter instanceof Array) ) { iter = Object.keys(iter) }' ) ## new style - Object.keys only works for normal JS-objects, not ones created with `Object.create(null)` out.append( - self.indent() + 'if (! (%s instanceof Array || typeof %s == "string" || __is_typed_array(%s)) ) { %s = __object_keys__(%s) }' %(iter_name, iter_name, iter_name, iter_name, iter_name) + self.indent() + 'if (! (%s instanceof Array || typeof %s == "string" || __is_typed_array(%s) || __is_node_list(%s) )) { %s = __object_keys__(%s) }' %(iter_name, iter_name, iter_name, iter_name, iter_name, iter_name) ) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index f2e1e32..44732ef 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -349,6 +349,11 @@ def __split_method( ob, delim ): with javascript: + def __is_node_list( ob ): + if typeof(NodeList) == 'function': ## NodeList is only available in browsers + if instanceof(ob, NodeList): + return True + return False def __is_typed_array( ob ): if instanceof( ob, Int8Array ) or instanceof( ob, Uint8Array ): diff --git a/regtests/html/webgl_css3d_simple_editor.html b/regtests/html/webgl_css3d_simple_editor.html index c45b9e0..158eb0f 100644 --- a/regtests/html/webgl_css3d_simple_editor.html +++ b/regtests/html/webgl_css3d_simple_editor.html @@ -61,110 +61,28 @@ pythonjs.configure(javascript=True) -class KeyboardInputHack: - def __init__(self): - self.element = None - window.addEventListener( 'keydown', self.on_keydown.bind(self), False ) - window.addEventListener( 'keypress', self.on_keypress.bind(self), False ) - self.reset() - - def reset(self): - self.lines = [] - self.x = 0 - self.y = -1 - - def get_text(self): - lines = [] - for line in self.lines: - lines.append( ''.join(line) ) - return '\\n'.join(lines) - - def newline(self): - self.lines.append( [] ) - self.y += 1 - - def insert(self, char): - if char == '\\n' or len(self.lines)==0: - self.newline() - if char != '\\n': - self.lines[ self.y ].insert( self.x, char) - self.x += 1 - - def backspace(self): - if self.x==0: - self.lines.remove( self.y ) - else: - self.x -= 1 - self.lines[ self.y ].remove( self.x ) - - def move(self, d): - if d == 'L': - if self.x > 0: - self.x -= 1 - elif d == 'R': - if self.x < len(self.lines[self.y]): - self.x += 1 - elif d == 'U': - if self.y > 0: - self.y -= 1 - m = len(self.lines[self.y]) - if self.x > m: - self.x = m - elif d == 'D': - if self.y < len(self.lines): - self.y += 1 - m = len(self.lines[self.y]) - if self.x > m: - self.x = m - - def on_keydown(self, e): - if e.ctrlKey: - return - elif e.keyCode == 38: - self.move('U') - elif e.keyCode == 37: - self.move('L') - elif e.keyCode == 40: - self.move('D') - elif e.keyCode == 39: - self.move('R') - - elif e.keyCode == 9: ## tab keydown - self.insert( ' ' ) - elif e.keyCode == 8: ## backspace - e.preventDefault() - self.backspace() - elif e.keyCode == 27: ## escape key - self.reset() - - def on_keypress(self, e ): - if e.keyCode == 32: ## space - self.insert(' ') - elif e.keyCode == 12: ## enter key - self.newline() - else: - s = String.fromCharCode(e.charCode) - self.insert( s ) - - #if self.element: - # if self.element.tagName == 'TEXTAREA': - # if self.element.firstChild: - # self.element.removeChild( self.element.firstChild ) - # self.element.appendChild( document.createTextNode(self.get_text()) ) - # else: - # self.element.setAttribute('value', self.get_text()) - - - def create_textarea(self): - global ta - ta = document.createElement('textarea') - #def func(): self.element = ta - def func(): ta.focus() ## this allows normal keyboard input - ta.onclick = func.bind(self) - return ta - - -KeyboardInput = KeyboardInputHack() + +def create_textarea(): + ta = document.createElement('textarea') + def func(): ta.focus() ## this allows normal keyboard input + ta.onclick = func + return ta + +__sid = 0 +def create_select_dropdown( options ): + global __sid + __sid += 1 + a = document.createElement('select') + a.setAttribute('id', '__sid'+__sid) + def f(): a.focus() ## allows the enter key to display options + a.onclick = f + + for opt in options: + o = document.createElement('option') + o.appendChild(document.createTextNode(opt)) + a.appendChild(o) + + return a class Element3D: def __init__(self, element, scene, shadow_scene, interact_scene, position, scale ): @@ -239,6 +157,15 @@ self.shadow.element = self.element.cloneNode() ## this is just to display content + a = self.element.getElementsByTagName('SELECT') + b = self.shadow.element.getElementsByTagName('SELECT') + c = {} + for sel in b: + c[ sel.getAttribute('id') ] = sel + + for sel in a: + c[ sel.getAttribute('id') ].selectedIndex = sel.selectedIndex + camera = scene = renderer = None geometry = material = mesh = None @@ -376,24 +303,11 @@ con.style.width = '300px' con.style.height = '150px' this.parentNode.appendChild(con) - ta = KeyboardInput.create_textarea() + ta = create_textarea() con.appendChild( ta ) - a = document.createElement('select') - con.appendChild(a) - def f(): - a.focus() ## allows the enter key to display options - #a.click() - a.onclick = f - global XX - XX = a + con.appendChild( create_select_dropdown(['option1', 'option2']) ) - o = document.createElement('option') - o.appendChild(document.createTextNode('option1')) - a.appendChild(o) - o = document.createElement('option') - o.appendChild(document.createTextNode('option2')) - a.appendChild(o) for i in range(20): From cdaf6037e26f83d791a4bf11e35fd9eb22d0bb33 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 7 Jul 2014 02:17:04 -0700 Subject: [PATCH 098/222] fixed shadow dom images --- regtests/html/webgl_css3d_simple_editor.html | 148 ++++++++++++++----- 1 file changed, 110 insertions(+), 38 deletions(-) diff --git a/regtests/html/webgl_css3d_simple_editor.html b/regtests/html/webgl_css3d_simple_editor.html index 158eb0f..f62abfd 100644 --- a/regtests/html/webgl_css3d_simple_editor.html +++ b/regtests/html/webgl_css3d_simple_editor.html @@ -1,14 +1,13 @@ - - - - - - @@ -36,6 +31,7 @@ + @@ -60,15 +56,24 @@ + + @@ -55,7 +64,125 @@ - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/regtests/html/webgl_css3d_simple_editor.html b/regtests/html/webgl_css3d_simple_editor.html index 164f948..f81cbdb 100644 --- a/regtests/html/webgl_css3d_simple_editor.html +++ b/regtests/html/webgl_css3d_simple_editor.html @@ -91,6 +91,7 @@ camera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 1, 10000 ); camera.position.set( 200, 150, 800 ); + selectman = SelectManager( camera ) controls = new THREE.TrackballControls( camera ); camera.smooth_target = controls.target.clone() From 529ba11289a3cd2b126d25a16c51a0831014ef3a Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 16 Jul 2014 00:26:38 -0700 Subject: [PATCH 130/222] threepy and dddom: call onchange callback when new item is picked in a dropdown 3d popup. --- regtests/html/dddom.py | 11 ++- regtests/html/threepy.py | 99 ++++++++++++++++++--------- regtests/html/webgl_css3d_editor.html | 3 +- 3 files changed, 78 insertions(+), 35 deletions(-) diff --git a/regtests/html/dddom.py b/regtests/html/dddom.py index 8caadb4..ad704aa 100644 --- a/regtests/html/dddom.py +++ b/regtests/html/dddom.py @@ -473,7 +473,7 @@ def create_dropdown(self, e, options): ## this needs to be done anyways because `sel` must be given a height in pixels, ## to force it to display all the options, and not display a scroll bar (which are not synced). H = 12 * options.length - #if H < 150: H = 150 + if H < 100: H = 100 sel.style.height = int(H * 0.95) X = e.offsetLeft / 2 Y = ((self.element.clientHeight-H) / 2) - (e.offsetHeight + e.offsetTop) @@ -494,10 +494,19 @@ def create_dropdown(self, e, options): sel.focus() # required? + ## this is used to capture a click on the dropdown popup, and copy selectedIndex + ## from the clone to the source, and if the source has an onchange callback, call it. def onclick(evt): #sel.focus() ## this triggers a bug that offsets the interactive layer print(evt.toElement.getAttribute('index')) e.selectedIndex = sel.selectedIndex = int(evt.toElement.getAttribute('index')) + ## setting `selectedIndex` on the source e will not trigger its `onchange` callback to fire, + ## so call onchange directly. Note that the event `evt` from the clone is passed the source + ## as the first argument. end-user code inside e.onchange should not modify elements referenced in the event. + ## note that the calling context is set to the source by `e.onchange(evt)` so it is safe to use `this` + ## inside of onchange. + if e.onchange: + e.onchange( evt ) sel.onclick = onclick def onscroll(evt): ## this hack is required to capture the scroll position diff --git a/regtests/html/threepy.py b/regtests/html/threepy.py index 09c8379..fb6143b 100644 --- a/regtests/html/threepy.py +++ b/regtests/html/threepy.py @@ -50,9 +50,70 @@ def onclick(evt): - def _gen_ui_multi(self, arr): pass - def _gen_ui_single(self, o): pass + + def _gen_material_ui(self, model): + print(model.material) + div = document.createElement('div') + + ## Material.js + faceopts = ['FrontSide', 'BackSide', 'DoubleSide'] + div.appendChild(document.createTextNode(' face direction:')) + dd = self.create_select_dropdown(faceopts) + div.appendChild( dd ) + div.appendChild( document.createElement('br') ) + def onchange(evt): + opt = faceopts[this.selectedIndex] + print(opt) + model.material.side = eval('THREE.'+opt) + dd.onchange = onchange + + blendopts = ['NormalBlending', 'AdditiveBlending', 'SubtractiveBlending', 'NoBlending'] + div.appendChild(document.createTextNode(' blending:')) + dd = self.create_select_dropdown(blendopts) + div.appendChild( dd ) + div.appendChild( document.createElement('br') ) + def change_blending(evt): + opt = blendopts[this.selectedIndex] + print(opt) + model.material.blending = eval('THREE.'+opt) + dd.onchange = change_blending + + + + def change_opacity(val): + model.material.opacity = val + slider = create_slider( model.material.opacity, onchange=change_opacity ) + div.appendChild( document.createTextNode('opacity:') ) + div.appendChild( slider ) + + ## MeshBasicMaterial.js + + + ## MeshPhongMaterial.js + + return div + + + def _gen_ui_single(self, model): + div = document.createElement('div') + div.setAttribute('class', 'well') + h3 = document.createElement('h3') + h3.appendChild( document.createTextNode(model.name) ) + div.appendChild( h3 ) + + if hasattr(model, 'material'): ## could be THREE.Mesh or THREE.SkinnedMesh + ui = self._gen_material_ui(model) + div.appendChild( ui ) + return div + + def _gen_ui_multi(self, arr): + menu = self.create_tab_menu() + for i,model in enumerate(arr): + page = menu.add_tab( model.name ) + div = self._gen_ui_single( model ) + page.appendChild( div ) + return menu.root def _gen_ui(self, o): @@ -87,32 +148,13 @@ def onload(evt): print(collada.scene) collada.scene.scale.set(0.25, 0.25, 0.25) collada.scene.position.set(0, -100, 200) - element3D.root.add( collada.scene ) - element3D.collada = collada.scene - - menu = element3D.create_tab_menu() - container.appendChild( menu.root ) - + self.root.add( collada.scene ) + self.collada = collada.scene - for i,model in enumerate(collada.scene.children): - print(model) - page = menu.add_tab( model.name ) - div = document.createElement('div') - div.setAttribute('class', 'well') - page.appendChild( div ) - #div.id = element3D.newid() - - h3 = document.createElement('h3') - h3.appendChild( document.createTextNode(model.name) ) - div.appendChild( h3 ) - - if hasattr(model, 'material'): ## could be THREE.Mesh or THREE.SkinnedMesh - print(model.material) - ui = gen_material_ui(model) - div.appendChild( ui ) + self.element.appendChild( self._gen_ui(collada.scene.children) ) reader = new FileReader() - reader.onload = onload + reader.onload = onload.bind(self) reader.readAsText( file ) elif file.path.endswith('.html'): @@ -321,13 +363,6 @@ def __init__(self): - def gen_material_ui(model): - print('gen material ui') - def onchange(val): - model.material.opacity = val - slider = create_slider( model.material.opacity, onchange=onchange ) - return slider - def animate(self): requestAnimationFrame( self.animate.bind(self) ); self.gizmo.update() diff --git a/regtests/html/webgl_css3d_editor.html b/regtests/html/webgl_css3d_editor.html index 02b6a77..92dea0b 100644 --- a/regtests/html/webgl_css3d_editor.html +++ b/regtests/html/webgl_css3d_editor.html @@ -73,8 +73,7 @@ from threepy import * engine = threepy.Engine() -a = engine.Editor( position=[0,0,0] ) -#a = engine.create_editor( position=[0,0,0] ) +a = engine.Editor( position=[0,150,0] ) engine.run() From 5117d79c2f945552995efb8aeb7dafa50efb2762 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 16 Jul 2014 04:52:25 -0700 Subject: [PATCH 131/222] threepy and dddom: testing HTML color picker and checkbox --- regtests/html/dddom.py | 3 +- regtests/html/threepy.py | 67 ++++++++++++++++++++++++++- regtests/html/webgl_css3d_editor.html | 2 +- 3 files changed, 68 insertions(+), 4 deletions(-) diff --git a/regtests/html/dddom.py b/regtests/html/dddom.py index ad704aa..93fbc8f 100644 --- a/regtests/html/dddom.py +++ b/regtests/html/dddom.py @@ -218,11 +218,12 @@ def func(): ta.focus() ## this allows normal keyboard input ta.setAttribute('class', 'focused alert alert-info') return ta -def create_checkbox( checked ): +def create_checkbox( checked, onchange=None ): ## no special hacks required for checkboxes ## c = document.createElement('input') c.setAttribute('type', 'checkbox') if checked: c.setAttribute('checked', 'true') + if onchange: c.onchange = onchange return c def create_dropdown_button( name, options ): diff --git a/regtests/html/threepy.py b/regtests/html/threepy.py index fb6143b..c10bce2 100644 --- a/regtests/html/threepy.py +++ b/regtests/html/threepy.py @@ -79,18 +79,81 @@ def change_blending(evt): model.material.blending = eval('THREE.'+opt) dd.onchange = change_blending - - def change_opacity(val): model.material.opacity = val slider = create_slider( model.material.opacity, onchange=change_opacity ) div.appendChild( document.createTextNode('opacity:') ) div.appendChild( slider ) + div.appendChild( document.createElement('br') ) + + def change_wireframe(evt): model.material.wireframe = this.checked + div.appendChild(document.createTextNode(' wireframe:')) + checkbox = create_checkbox( model.material.wireframe, onchange=change_wireframe ) + #checkbox.onchange = change_wireframe + div.appendChild( checkbox ) + + div.appendChild( document.createElement('br') ) + ## MeshBasicMaterial.js + div.appendChild(document.createTextNode(' diffuse:')) + input = document.createElement('input') + input.setAttribute('type', 'color') + input.style.width=64; input.style.height=32 + div.appendChild( input ) + def change_diffuse(evt): + hex = int( '0x'+this.value[1:] ) + model.material.color.setHex( hex ) + print(model.material.color) + ## oninput fails, can only get update after use has picked color + input.onchange = change_diffuse ## MeshPhongMaterial.js + if hasattr(model.material, 'ambient'): + div.appendChild(document.createTextNode(' ambient:')) + input = document.createElement('input') + input.setAttribute('type', 'color') + input.style.width=64; input.style.height=32 + div.appendChild( input ) + def change_ambient(evt): + hex = int( '0x'+this.value[1:] ) + model.material.ambient.setHex( hex ) + print(model.material.ambient) + input.onchange = change_ambient + + if hasattr(model.material, 'emissive'): + div.appendChild(document.createTextNode(' emissive:')) + input = document.createElement('input') + input.setAttribute('type', 'color') + input.style.width=64; input.style.height=32 + div.appendChild( input ) + def change_emissive(evt): + hex = int( '0x'+this.value[1:] ) + model.material.emissive.setHex( hex ) + print(model.material.emissive) + input.onchange = change_emissive + + if hasattr(model.material, 'specular'): + div.appendChild( document.createElement('br') ) + + div.appendChild(document.createTextNode(' specular:')) + input = document.createElement('input') + input.setAttribute('type', 'color') + input.style.width=64; input.style.height=32 + div.appendChild( input ) + def change_specular(evt): + hex = int( '0x'+this.value[1:] ) + model.material.specular.setHex( hex ) + print(model.material.specular) + input.onchange = change_specular + + def change_shininess(val): + model.material.shininess = val * 100 + slider = create_slider( model.material.shininess*0.01, onchange=change_shininess ) + div.appendChild( document.createTextNode(' shininess:') ) + div.appendChild( slider ) + return div diff --git a/regtests/html/webgl_css3d_editor.html b/regtests/html/webgl_css3d_editor.html index 92dea0b..bec0501 100644 --- a/regtests/html/webgl_css3d_editor.html +++ b/regtests/html/webgl_css3d_editor.html @@ -73,7 +73,7 @@ from threepy import * engine = threepy.Engine() -a = engine.Editor( position=[0,150,0] ) +a = engine.Editor( position=[0,250,0] ) engine.run() From e24924b68ce0080ce0453810874dc086393fd20b Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 16 Jul 2014 18:01:52 -0700 Subject: [PATCH 132/222] fixed translator output with firefox 26+, TODO test other browsers. --- pythonjs/package.json | 2 +- pythonjs/pythonjs.js | 100 ++++++++++++++++++++--------------- pythonjs/runtime/builtins.py | 23 +++++--- 3 files changed, 74 insertions(+), 51 deletions(-) diff --git a/pythonjs/package.json b/pythonjs/package.json index 7b6edbc..45aafae 100644 --- a/pythonjs/package.json +++ b/pythonjs/package.json @@ -2,7 +2,7 @@ "author": "Brett Hartshorn ", "name": "python-js", "description": "python multi-translator: javascript, dart, coffee, lua, vis.js", - "version": "0.9.7", + "version": "0.9.8", "license": "BSD-3-Clause", "repository": { "type": "git", diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 876163a..7b55cfc 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -979,14 +979,26 @@ __split_method = function(ob, delim) { } } ;__split_method.is_wrapper = true; +__dom_array_types__ = []; +if (( typeof(NodeList) ) == "function") { + __dom_array_types__ = [NodeList, FileList, DOMStringList, HTMLCollection, SVGNumberList, SVGTransformList]; + if (( typeof(DataTransferItemList) ) == "function") { + __dom_array_types__.push(DataTransferItemList); + } + if (( typeof(HTMLAllCollection) ) == "function") { + __dom_array_types__.push(HTMLAllCollection); + } + if (( typeof(SVGElementInstanceList) ) == "function") { + __dom_array_types__.push(SVGElementInstanceList); + } + if (( typeof(ClientRectList) ) == "function") { + __dom_array_types__.push(ClientRectList); + } +} __is_some_array = function(ob) { - var dom_array_types; - if (( typeof(NodeList) ) == "function") { - dom_array_types = [NodeList, FileList, ClientRectList, DOMStringList, HTMLCollection, HTMLAllCollection, SVGElementInstanceList, SVGNumberList, SVGTransformList]; - if (( typeof(DataTransferItemList) ) == "function") { - dom_array_types.append(DataTransferItemList); - } - var __iter14 = dom_array_types; + + if (( __dom_array_types__.length ) > 0) { + var __iter14 = __dom_array_types__; if (! (__iter14 instanceof Array || typeof __iter14 == "string" || __is_typed_array(__iter14) || __is_some_array(__iter14) )) { __iter14 = __object_keys__(__iter14) } for (var __idx14=0; __idx14 < __iter14.length; __idx14++) { var t = __iter14[ __idx14 ]; @@ -1546,8 +1558,8 @@ issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 610: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 611: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 620: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 621: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2300,7 +2312,7 @@ sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__40; - __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1019: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1029: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2358,7 +2370,7 @@ next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1037: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1047: return obj.next()"), "__call__")(); } ;next.is_wrapper = true; map = function(args, kwargs) { @@ -2376,7 +2388,7 @@ map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__41; - __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1040: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1050: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { @@ -2402,7 +2414,7 @@ filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__42; - __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1047: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1057: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { @@ -2428,7 +2440,7 @@ min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__43; - __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1054: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1064: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { @@ -2458,7 +2470,7 @@ max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__44; - __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1060: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1070: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { @@ -2568,7 +2580,7 @@ __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1088: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1098: self.obj_get = obj.get ## cache this for speed"); } ;__Iterator___init__.is_wrapper = true; __Iterator_attrs.__init__ = __Iterator___init__; @@ -2675,27 +2687,27 @@ __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__45; - __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1131: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1141: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { o = __next__45(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1133: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1133: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1133: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1143: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1143: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1143: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1135: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1135: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1135: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1145: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1145: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1145: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__46; - __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1137: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1147: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1138: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1139: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1148: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1149: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2721,15 +2733,15 @@ __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__47; - __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1146: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1156: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - value = __get__(self["$wrapped"], "__getitem__", "line 1147: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1157: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1150: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1160: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2788,7 +2800,7 @@ __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1163: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1173: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2812,12 +2824,12 @@ __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__48; - __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1169: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1179: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1170: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1170: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1180: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1180: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } ;__dict_update.is_wrapper = true; @@ -2836,12 +2848,12 @@ __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__49; - __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1173: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1183: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__49; __next__49 = __get__(__iterator__49, "next"); while (( __iterator__49.index ) < __iterator__49.length) { key = __next__49(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1174: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1184: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2884,7 +2896,7 @@ __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1182: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1192: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } ;__dict_set.is_wrapper = true; __dict_attrs.set = __dict_set; @@ -3178,7 +3190,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1350: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1350: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1360: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1360: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3202,7 +3214,7 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1371: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1381: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; @@ -3235,7 +3247,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1377: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1387: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3260,7 +3272,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1385: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1385: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1395: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1395: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3298,7 +3310,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1401: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1401: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1411: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1411: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3366,13 +3378,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1421: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1421: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1431: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1431: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1426: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1436: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3430,7 +3442,7 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1449: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1459: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; @@ -3449,12 +3461,12 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1452: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1462: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1453: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1463: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; @@ -3494,7 +3506,7 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1463: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1473: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; @@ -3511,9 +3523,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1466: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1476: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1467: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1477: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 972b179..4f32eb2 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -349,13 +349,24 @@ def __split_method( ob, delim ): with javascript: - def __is_some_array( ob ): - if typeof(NodeList) == 'function': ## NodeList is only available in browsers - dom_array_types = [ NodeList, FileList, ClientRectList, DOMStringList, HTMLCollection, HTMLAllCollection, SVGElementInstanceList, SVGNumberList, SVGTransformList] - if typeof(DataTransferItemList) == 'function': ## missing in NodeWebkit - dom_array_types.append( DataTransferItemList ) + __dom_array_types__ = [] + if typeof(NodeList) == 'function': ## NodeList is only available in browsers + ## minimal dom array types common to allow browsers ## + __dom_array_types__ = [ NodeList, FileList, DOMStringList, HTMLCollection, SVGNumberList, SVGTransformList] + + ## extra dom array types ## + if typeof(DataTransferItemList) == 'function': ## missing in NodeWebkit + __dom_array_types__.push( DataTransferItemList ) + if typeof(HTMLAllCollection) == 'function': ## missing in Firefox + __dom_array_types__.push( HTMLAllCollection ) + if typeof(SVGElementInstanceList) == 'function':## missing in Firefox + __dom_array_types__.push( SVGElementInstanceList ) + if typeof(ClientRectList) == 'function': ## missing in Firefox-trunk + __dom_array_types__.push( ClientRectList ) - for t in dom_array_types: + def __is_some_array( ob ): + if __dom_array_types__.length > 0: + for t in __dom_array_types__: if instanceof(ob, t): return True return False From 0169877b005b95f3c29b2c4712ea9b212e5f3502 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 16 Jul 2014 18:48:42 -0700 Subject: [PATCH 133/222] threepy: more material controls --- regtests/html/dddom.py | 32 +++++++++-- regtests/html/threepy.py | 120 ++++++++++++++++++++++++++++----------- 2 files changed, 112 insertions(+), 40 deletions(-) diff --git a/regtests/html/dddom.py b/regtests/html/dddom.py index 93fbc8f..152a210 100644 --- a/regtests/html/dddom.py +++ b/regtests/html/dddom.py @@ -199,7 +199,7 @@ def create_slider(value, onchange=None, width=200): div = document.createElement('div') ## a parent container is required div.appendChild( slider ) - $( slider ).PPSlider( width=300, onInput=onchange, value=value ) + $( slider ).PPSlider( width=width, onInput=onchange, value=value ) slider.onclick = lambda : slider.focus() @@ -226,6 +226,29 @@ def create_checkbox( checked, onchange=None ): if onchange: c.onchange = onchange return c +def create_number_input(value, step=1, onchange=None): + input = document.createElement('input') + input.setAttribute('type', 'number') + input.setAttribute('step', step) + input.value = value + input.style.width = 64 + input.style.height = 32 + input.onclick = lambda : this.focus() + if onchange: input.onchange = onchange + return input + +def create_float_input(value, step=0.01, onchange=None): + input = document.createElement('input') + input.setAttribute('type', 'number') + input.setAttribute('step', step) + input.value = value + input.style.width = 64 + input.style.height = 32 + input.onclick = lambda : this.focus() + if onchange: input.onchange = onchange + return input + + def create_dropdown_button( name, options ): div = document.createElement('div') div.setAttribute('class', 'btn-group') @@ -611,13 +634,10 @@ def expand(inter): m.castShadow = true; CLICKABLES.append( m ) - def spin(inter): + def clickfooter(inter): if self.collasped: self.expand() - else: - self.spin90() - self.object.position.x = -200 - m.onclick = spin.bind(self) + m.onclick = clickfooter.bind(self) geo = new THREE.BoxGeometry( 0.2, 0.1, 10 ); mat = new THREE.MeshPhongMaterial( {'color': 0xffff00 } ); diff --git a/regtests/html/threepy.py b/regtests/html/threepy.py index c10bce2..25e6960 100644 --- a/regtests/html/threepy.py +++ b/regtests/html/threepy.py @@ -49,9 +49,6 @@ def onclick(evt): - - - def _gen_material_ui(self, model): print(model.material) div = document.createElement('div') @@ -79,6 +76,18 @@ def change_blending(evt): model.material.blending = eval('THREE.'+opt) dd.onchange = change_blending + def change_wireframe(evt): model.material.wireframe = this.checked + div.appendChild(document.createTextNode(' wireframe:')) + checkbox = create_checkbox( model.material.wireframe, onchange=change_wireframe ) + div.appendChild( checkbox ) + + def change_wireframe_width(val): model.material.wireframeLinewidth = val * 10 + slider = create_slider( model.material.wireframeLinewidth*0.1, onchange=change_wireframe_width ) + div.appendChild( slider ) + + div.appendChild( document.createElement('br') ) + + def change_opacity(val): model.material.opacity = val slider = create_slider( model.material.opacity, onchange=change_opacity ) @@ -87,20 +96,17 @@ def change_opacity(val): div.appendChild( document.createElement('br') ) - def change_wireframe(evt): model.material.wireframe = this.checked - div.appendChild(document.createTextNode(' wireframe:')) - checkbox = create_checkbox( model.material.wireframe, onchange=change_wireframe ) - #checkbox.onchange = change_wireframe - div.appendChild( checkbox ) - div.appendChild( document.createElement('br') ) + well = document.createElement('div') + well.setAttribute('class', 'well') + div.appendChild( well ) ## MeshBasicMaterial.js - div.appendChild(document.createTextNode(' diffuse:')) + well.appendChild(document.createTextNode(' diffuse:')) input = document.createElement('input') input.setAttribute('type', 'color') input.style.width=64; input.style.height=32 - div.appendChild( input ) + well.appendChild( input ) def change_diffuse(evt): hex = int( '0x'+this.value[1:] ) model.material.color.setHex( hex ) @@ -111,11 +117,11 @@ def change_diffuse(evt): ## MeshPhongMaterial.js if hasattr(model.material, 'ambient'): - div.appendChild(document.createTextNode(' ambient:')) + well.appendChild(document.createTextNode(' ambient:')) input = document.createElement('input') input.setAttribute('type', 'color') input.style.width=64; input.style.height=32 - div.appendChild( input ) + well.appendChild( input ) def change_ambient(evt): hex = int( '0x'+this.value[1:] ) model.material.ambient.setHex( hex ) @@ -123,11 +129,11 @@ def change_ambient(evt): input.onchange = change_ambient if hasattr(model.material, 'emissive'): - div.appendChild(document.createTextNode(' emissive:')) + well.appendChild(document.createTextNode(' emissive:')) input = document.createElement('input') input.setAttribute('type', 'color') input.style.width=64; input.style.height=32 - div.appendChild( input ) + well.appendChild( input ) def change_emissive(evt): hex = int( '0x'+this.value[1:] ) model.material.emissive.setHex( hex ) @@ -135,9 +141,16 @@ def change_emissive(evt): input.onchange = change_emissive if hasattr(model.material, 'specular'): - div.appendChild( document.createElement('br') ) + #div.appendChild( document.createElement('br') ) div.appendChild(document.createTextNode(' specular:')) + + def change_shininess(val): + model.material.shininess = val * 100 + slider = create_slider( model.material.shininess*0.01, onchange=change_shininess ) + #div.appendChild( document.createTextNode(' shininess:') ) + div.appendChild( slider ) + input = document.createElement('input') input.setAttribute('type', 'color') input.style.width=64; input.style.height=32 @@ -148,11 +161,6 @@ def change_specular(evt): print(model.material.specular) input.onchange = change_specular - def change_shininess(val): - model.material.shininess = val * 100 - slider = create_slider( model.material.shininess*0.01, onchange=change_shininess ) - div.appendChild( document.createTextNode(' shininess:') ) - div.appendChild( slider ) return div @@ -161,9 +169,58 @@ def change_shininess(val): def _gen_ui_single(self, model): div = document.createElement('div') div.setAttribute('class', 'well') - h3 = document.createElement('h3') - h3.appendChild( document.createTextNode(model.name) ) - div.appendChild( h3 ) + #h3 = document.createElement('h3') + #h3.appendChild( document.createTextNode(model.name) ) + #div.appendChild( h3 ) + + div.appendChild( document.createTextNode(' position:') ) + + def set_pos_x(evt): model.position.x = this.value + input = create_float_input( model.position.x, onchange=set_pos_x) + div.appendChild( input ) + + def set_pos_y(evt): model.position.y = this.value + input = create_float_input( model.position.y, onchange=set_pos_y) + div.appendChild( input ) + + def set_pos_z(evt): model.position.z = this.value + input = create_float_input( model.position.z, onchange=set_pos_z) + div.appendChild( input ) + + div.appendChild( document.createElement('br') ) + + div.appendChild( document.createTextNode(' rotation:') ) + + def set_rot_x(evt): model.rotation.x = this.value + input = create_float_input( model.rotation.x, onchange=set_rot_x) + div.appendChild( input ) + + def set_rot_y(evt): model.rotation.y = this.value + input = create_float_input( model.rotation.y, onchange=set_rot_y) + div.appendChild( input ) + + def set_rot_z(evt): model.rotation.z = this.value + input = create_float_input( model.rotation.z, onchange=set_rot_z) + div.appendChild( input ) + + div.appendChild( document.createElement('br') ) + + div.appendChild( document.createTextNode(' scale:') ) + + def set_scale_x(evt): model.scale.x = this.value + input = create_float_input( model.scale.x, onchange=set_scale_x) + div.appendChild( input ) + + def set_scale_y(evt): model.scale.y = this.value + input = create_float_input( model.scale.y, onchange=set_scale_y) + div.appendChild( input ) + + def set_scale_z(evt): model.scale.z = this.value + input = create_float_input( model.scale.z, onchange=set_scale_z) + div.appendChild( input ) + + + if hasattr(model, 'material'): ## could be THREE.Mesh or THREE.SkinnedMesh ui = self._gen_material_ui(model) @@ -320,15 +377,6 @@ def __init__(self): self.scene3 = scene3 = new THREE.Scene(); - - geometry = new THREE.BoxGeometry( 800, 400, 3800 ); - material = new THREE.MeshPhongMaterial( color=0xc1c1c1, transparent=true, opacity=0.27 ); - mesh = new THREE.Mesh( geometry, material ); - mesh.position.z = -400 - mesh.position.y = -220 - scene.add( mesh ); - mesh.receiveShadow = true; - self.renderer = renderer = new THREE.WebGLRenderer(alpha=True); renderer.shadowMapEnabled = true renderer.shadowMapType = THREE.PCFSoftShadowMap @@ -363,10 +411,14 @@ def __init__(self): scene.add( light ); - self.pointlight = pointlight = new( THREE.PointLight(0xffffff, 2, 500) ) + self.pointlight1 = pointlight = new( THREE.PointLight(0xffffff, 2, 500) ) pointlight.position.set( 10, 100, 300 ) scene.add( pointlight ) + self.pointlight2 = pointlight = new( THREE.PointLight(0xffffff, 2, 500) ) + pointlight.position.set( -10, -100, 200 ) + scene.add( pointlight ) + renderer.sortObjects = false renderer.autoClear = false From 1123bb7bf693e132c8a598dcb9d76924fd0bd911 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 16 Jul 2014 23:05:32 -0700 Subject: [PATCH 134/222] dddom.py: fixed NodeWebkit, and other browsers that are strict about `e.cloneNode(true)` --- regtests/html/dddom.py | 3 ++- regtests/html/threepy.py | 6 ++++-- regtests/run.py | 27 +++++++++++++++++---------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/regtests/html/dddom.py b/regtests/html/dddom.py index 152a210..9280220 100644 --- a/regtests/html/dddom.py +++ b/regtests/html/dddom.py @@ -685,7 +685,8 @@ def update(self): self.mask.scale.x = w*99 self.mask.scale.y = h*99 - self.shadow.element = self.element.cloneNode() ## this is just to display content + ## this is just to display content, cloneNode(true) ensures deep copy + self.shadow.element = self.element.cloneNode(true) ## sync scrollbars of any div with an id, ## note: this will not work with tab-content div's. diff --git a/regtests/html/threepy.py b/regtests/html/threepy.py index 25e6960..4ed9b48 100644 --- a/regtests/html/threepy.py +++ b/regtests/html/threepy.py @@ -354,12 +354,13 @@ def __init__(self): SCREEN_HEIGHT = window.innerHeight self.camera = camera = new THREE.PerspectiveCamera( 35, window.innerWidth / window.innerHeight, 1, 10000 ); - camera.position.set( 200, 150, 800 ); + camera.position.set( 200, 250, 800 ); self._selectman = SelectManager(self.camera) self.controls = controls = new THREE.TrackballControls( camera ); camera.smooth_target = controls.target.clone() + camera.smooth_target.y = 300 controls.rotateSpeed = 1.0; controls.zoomSpeed = 1.2; @@ -494,7 +495,8 @@ def animate(self): self.renderer3.render( self.scene3, self.camera ) def run(self): - self.animate() + #self.animate() + setTimeout(self.animate.bind(self), 1000) threepy = { 'Engine' : lambda : Engine(), diff --git a/regtests/run.py b/regtests/run.py index 127b182..aa33ea8 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -802,16 +802,23 @@ def run_html_test( filename, sum_errors ): html = '\n'.join(doc) open('/tmp/%s.html'%filename, 'wb').write( html.encode('utf-8') ) - ## chrome-extension that won't force you to close your browser windows when deving: `Allow-Control-Allow-Origin:*` - cmd = [ - 'google-chrome', - '--app=file:///tmp/%s.html'%filename, - '--allow-file-access-from-files', ## only takes affect if chrome is closed - '--allow-file-access', ## only takes affect if chrome is closed - '--disable-web-security' ## only takes affect if chrome is closed - ] - ## non-blocking, TODO check for chrome extension that allows output of console.log to stdout - subprocess.check_call(cmd) + if '--nodewebkit' in sys.argv: + ## nodewebkit can bypass all cross origin browser-side security + write("/tmp/package.json", '{"name":"test", "main":"%s.html"}' %filename) + run_command("%s /tmp" %nodewebkit, nodewebkit_workaround=True) + + else: + ## chrome-extension that won't force you to close your browser windows when deving: `Allow-Control-Allow-Origin:*` + ## this still fails with iframes that do not allow cross origin. + cmd = [ + 'google-chrome', + '--app=file:///tmp/%s.html'%filename, + '--allow-file-access-from-files', ## only takes affect if chrome is closed + '--allow-file-access', ## only takes affect if chrome is closed + '--disable-web-security' ## only takes affect if chrome is closed + ] + ## non-blocking, TODO check for chrome extension that allows output of console.log to stdout + subprocess.check_call(cmd) table_header = "%-12.12s %-28.28s" From 14005bc3d67750991b80ebc94060d3d3773043e4 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 17 Jul 2014 03:31:23 -0700 Subject: [PATCH 135/222] updated threepy and dddom.py --- regtests/html/dddom.py | 3 ++- regtests/html/threepy.py | 36 +++++++++++++-------------- regtests/html/webgl_css3d_editor.html | 19 +++++++++++++- regtests/run.py | 14 ++++++++--- 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/regtests/html/dddom.py b/regtests/html/dddom.py index 9280220..0335b5e 100644 --- a/regtests/html/dddom.py +++ b/regtests/html/dddom.py @@ -355,7 +355,7 @@ def create_tab_menu(self): def create_iframe( self, url, element ): ## this currently only renders on the top layer transparent layer, - ## to make iframes visible the top layer needs to become semi-transparent of opaque. + ## to make iframes visible the top layer needs to become semi-transparent or opaque. ## `element` is the DOM element that will have its opacity adjusted on mouse enter/leave iframe = document.createElement('iframe') iframe.setAttribute('src', url) @@ -635,6 +635,7 @@ def expand(inter): CLICKABLES.append( m ) def clickfooter(inter): + self.active = True if self.collasped: self.expand() m.onclick = clickfooter.bind(self) diff --git a/regtests/html/threepy.py b/regtests/html/threepy.py index 4ed9b48..18de547 100644 --- a/regtests/html/threepy.py +++ b/regtests/html/threepy.py @@ -34,8 +34,7 @@ def ondrop(evt): evt.preventDefault() if evt.dataTransfer.files.length==0: url = evt.dataTransfer.getData("text/plain") - iframe = self.create_iframe( url, self.engine.renderer3.domElement ) - self.element.appendChild(iframe) + self.open_iframe(url) else: self.handle_drop_event(evt.dataTransfer.files) @@ -47,7 +46,9 @@ def onclick(evt): eval( ta.value ) b.onclick = onclick.bind(self) - + def open_iframe(self, url): + iframe = self.create_iframe( url, self.engine.renderer3.domElement ) + self.element.appendChild(iframe) def _gen_material_ui(self, model): print(model.material) @@ -247,6 +248,10 @@ def _gen_ui(self, o): def handle_drop_event(self, files): + self.engine.pointlight1.position.copy( self.position ) + self.engine.pointlight1.position.z += 40 + self.engine.gizmo.attach( self.right_bar ) + images = [] videos = [] for file in files: @@ -279,13 +284,13 @@ def onload(evt): elif file.path.endswith('.html'): iframe = element3D.create_iframe( file.path, renderer3.domElement ) - container.appendChild(iframe) + self.element.appendChild(iframe) elif file.path.endswith('.css'): print( 'TODO css' ) elif file.path.endswith('.js'): print( 'TODO js' ) - elif file.path.endswith('.jpg') or file.path.endswith('.png'): + elif file.path.endswith('.jpg') or file.path.endswith('.png') or file.path.endswith('.gif'): li = document.createElement('li') images.append(li) @@ -297,14 +302,15 @@ def onload(evt): elif file.path.endswith('.mp4'): li = document.createElement('li') - video = element3D.create_video( mp4=file.path ) + video = self.create_video( mp4=file.path ) li.appendChild( video ) videos.append( li ) + ## note, nodewebkit is missing libffmpegsumo, then it only plays ogv videos elif file.path.endswith('.ogv'): #li = document.createElement('li') - video = element3D.create_video( ogv=file.path ) - container.appendChild(video) + video = self.create_video( ogv=file.path ) + self.element.appendChild(video) #li.appendChild( video ) #videos.append( li ) @@ -319,23 +325,18 @@ def on_load(event): if images: print('loading images') ul = document.createElement('ul') - container.appendChild(ul) + self.element.appendChild(ul) for li in images: ul.appendChild(li) if videos: print('loading videos') ul = document.createElement('ul') - container.appendChild(ul) + self.element.appendChild(ul) for li in videos: ul.appendChild(li) -if False: - camera = scene = renderer = None - geometry = material = mesh = None - scene2 = renderer2 = renderer3 = None - controls = gizmo = composer = None - Elements = [] + class Engine: def Editor(self, **kw): @@ -343,9 +344,6 @@ def Editor(self, **kw): self.windows.append( e ) return e - #def create_editor(self, position=None): - # return Editor(self, position=position) - def __init__(self): self.windows = [] diff --git a/regtests/html/webgl_css3d_editor.html b/regtests/html/webgl_css3d_editor.html index bec0501..2154bf3 100644 --- a/regtests/html/webgl_css3d_editor.html +++ b/regtests/html/webgl_css3d_editor.html @@ -73,7 +73,24 @@ from threepy import * engine = threepy.Engine() -a = engine.Editor( position=[0,250,0] ) + +for i in range(10): + a = engine.Editor( position=[(random()*600)-100, 250*random(), (random()*400)+(i*250)-800] ) + if random() > 0.8: + a.rotation.y = Math.PI/2 + a.position.x = -300 + else: + a.rotation.y = random() * random() + +geometry = new THREE.BoxGeometry( 800, 400, 3800 ); +material = new THREE.MeshPhongMaterial( color=0xc1c1c1 ) +mesh = new THREE.Mesh( geometry, material ); +mesh.position.z = -400 +mesh.position.y = -280 +engine.scene.add( mesh ); +mesh.receiveShadow = true; + + engine.run() diff --git a/regtests/run.py b/regtests/run.py index aa33ea8..f122999 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -158,14 +158,19 @@ def run_old_pypy_test_on(filename): ## download https://github.com/rogerwang/node-webkit/releases/tag/nw-v0.9.2 ## and extract to your home directory. nodewebkit_runnable = False -nodewebkit = os.path.expanduser('~/node-webkit-v0.9.2-linux-x64/nw') + + +nodewebkit = os.path.expanduser('~/node-webkit-v0.10.0-rc1-linux-x64/nw') if os.path.isfile( nodewebkit ): nodewebkit_runnable = True else: - nodewebkit = os.path.expanduser('~/node-webkit-v0.9.1-linux-x64/nw') + nodewebkit = os.path.expanduser('~/node-webkit-v0.9.2-linux-x64/nw') if os.path.isfile( nodewebkit ): nodewebkit_runnable = True else: - nodewebkit = os.path.expanduser('~/node-webkit-v0.8.4-linux-x64/nw') + nodewebkit = os.path.expanduser('~/node-webkit-v0.9.1-linux-x64/nw') if os.path.isfile( nodewebkit ): nodewebkit_runnable = True + else: + nodewebkit = os.path.expanduser('~/node-webkit-v0.8.4-linux-x64/nw') + if os.path.isfile( nodewebkit ): nodewebkit_runnable = True if not show_details or '--no-nodewebkit' in sys.argv: nodewebkit_runnable = False @@ -804,7 +809,8 @@ def run_html_test( filename, sum_errors ): open('/tmp/%s.html'%filename, 'wb').write( html.encode('utf-8') ) if '--nodewebkit' in sys.argv: ## nodewebkit can bypass all cross origin browser-side security - write("/tmp/package.json", '{"name":"test", "main":"%s.html"}' %filename) + cfg = '{"name":"test", "main":"%s.html", "window":{"width":1200, "height":700}}' %filename + write("/tmp/package.json", cfg) run_command("%s /tmp" %nodewebkit, nodewebkit_workaround=True) else: From 81a521caaea02ff5cb76cbb033a11548de15498a Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 17 Jul 2014 23:05:54 -0700 Subject: [PATCH 136/222] three.js catmull clark subdivision example --- regtests/html/three_catmull_clark.html | 136 +++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 regtests/html/three_catmull_clark.html diff --git a/regtests/html/three_catmull_clark.html b/regtests/html/three_catmull_clark.html new file mode 100644 index 0000000..f068b27 --- /dev/null +++ b/regtests/html/three_catmull_clark.html @@ -0,0 +1,136 @@ + + + + + + + + + + \ No newline at end of file From 1b26d4fe561958ac978df569cd88282892f8821f Mon Sep 17 00:00:00 2001 From: hartsantler Date: Fri, 18 Jul 2014 05:43:37 -0700 Subject: [PATCH 137/222] updated catmull clark example. --- regtests/html/three_catmull_clark.html | 106 +++++++++++++++++++------ 1 file changed, 80 insertions(+), 26 deletions(-) diff --git a/regtests/html/three_catmull_clark.html b/regtests/html/three_catmull_clark.html index f068b27..2d8223d 100644 --- a/regtests/html/three_catmull_clark.html +++ b/regtests/html/three_catmull_clark.html @@ -1,14 +1,23 @@ + From 7cfdfc9b18121b92b4ca67008ff176f806724757 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 19 Jul 2014 16:36:25 -0700 Subject: [PATCH 138/222] updated catmull clark example. --- regtests/html/three_catmull_clark.html | 76 +++++++++++++++++--------- 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/regtests/html/three_catmull_clark.html b/regtests/html/three_catmull_clark.html index 2d8223d..3b5a5a4 100644 --- a/regtests/html/three_catmull_clark.html +++ b/regtests/html/three_catmull_clark.html @@ -4,6 +4,7 @@ ` --- README.md | 5 ++++- pythonjs/python_to_pythonjs.py | 25 ++++++++++++++++++++- pythonjs/pythonjs.py | 40 ++++++++++++++++++++++++++++++---- pythonjs/translator.py | 2 +- 4 files changed, 65 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 69992eb..ee62930 100644 --- a/README.md +++ b/README.md @@ -48,15 +48,18 @@ If you want to run the latest version of the translator, you will need to instal Python2.7 and git clone this repo. (the NodeJS package above is not required) Then, to translate your python script, directly run the `translator.py` script in the "pythonjs" directory. You can give it a list of python files to translate at once. It will output the translation to stdout. The default output type is JavaScript. +An html file can also be used as input, python code inside a script tag: `': + if script: + source = '\n'.join(script) + script = True + self._html_tail.append( '') + + elif isinstance( script, list ): + script.append( line ) + + elif script is True: + self._html_tail.append( line ) + + else: + writer.write( line ) source = typedpython.transform_source( source ) @@ -258,6 +277,10 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe else: self.visit(node) + if self._html_tail: + for line in self._html_tail: + writer.write(line) + def visit(self, node): """Visit a node.""" ## modified code of visit() method from Python 2.7 stdlib diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 56eb8c9..6d73745 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -1101,9 +1101,34 @@ def generate_runtime(): ] return '\n'.join( lines ) -def main(script, requirejs=True, insert_runtime=True, webworker=False, function_expressions=False): +def main(source, requirejs=True, insert_runtime=True, webworker=False, function_expressions=False): + head = [] + tail = [] + script = False + if source.strip().startswith('') + script = list() + elif line.strip() == '': + if script: + source = '\n'.join(script) + script = True + tail.append( '') + + elif isinstance( script, list ): + script.append( line ) + + elif script is True: + tail.append( line ) + + else: + head.append( line ) + + try: - tree = ast.parse( script ) + tree = ast.parse( source ) except SyntaxError: import traceback err = traceback.format_exc() @@ -1116,7 +1141,7 @@ def main(script, requirejs=True, insert_runtime=True, webworker=False, function_ lineno = int(line.split()[-1]) - lines = script.splitlines() + lines = source.splitlines() if lineno > 10: for i in range(lineno-5, lineno+5): sys.stderr.write( 'line %s->'%i ) @@ -1131,7 +1156,14 @@ def main(script, requirejs=True, insert_runtime=True, webworker=False, function_ sys.exit(1) - return JSGenerator( requirejs=requirejs, insert_runtime=insert_runtime, webworker=webworker, function_expressions=function_expressions ).visit(tree) + gen = JSGenerator( requirejs=requirejs, insert_runtime=insert_runtime, webworker=webworker, function_expressions=function_expressions ) + output = gen.visit(tree) + if head: + head.append( output ) + head.extend( tail ) + output = '\n'.join( head ) + + return output def command(): diff --git a/pythonjs/translator.py b/pythonjs/translator.py index 7639639..bbeab65 100755 --- a/pythonjs/translator.py +++ b/pythonjs/translator.py @@ -65,7 +65,7 @@ def command(): scripts = [] if len(sys.argv) > 1: for arg in sys.argv[1:]: - if arg.endswith('.py'): + if arg.endswith('.py') or arg.endswith('.html'): scripts.append( arg ) if mpath is None: mpath = os.path.split(arg)[0] From 62dee2ded0c0314456ad17e63655c90dae7870d4 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 20 Jul 2014 22:55:15 -0700 Subject: [PATCH 142/222] updated README --- README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ee62930..3c26968 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,17 @@ Introduction ------------ -PythonJS is a transpiler written in Python that converts Python into fast +PythonJS is a transpiler written in Python that converts a superset of Python into fast JavaScript. It can be run with regular Python, or fully self-hosted within -NodeJS using Empythoned. PythonJS has been designed with speed and easy -integration with existing JavaScript code in mind. +NodeJS using Empythoned. PythonJS extends the Python language with new keywords, syntax, +and optional static typing, to increase performance and allow seamless +integration with existing JavaScript libraries. -To convert your python scripts into javascript, you have two options: +We are not trying to shoehorn Python as defined by the BDFL into JavaScript, +our goal is to design something better than JavaScript so you can write larger +and more complex programs in a Python-like language. + + +To get started, you have two options: 1. install NodeJS, python-js package, and write a build script. 2. or install Python2 and use translator.py from this repo directly. From e46b9ab1667b92526aac5f89d9f9fd3f52569a69 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 20 Jul 2014 23:24:27 -0700 Subject: [PATCH 143/222] allow new `->` syntax to auto bind method's this. --- README.md | 10 ++++++++++ pythonjs/typedpython.py | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/README.md b/README.md index 3c26968..8fed05d 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,13 @@ def setup_my_jquery_class( $ ): $.fn.someclass = myclass_init ``` +6. `->` can be used to as a special attribute operator for passing methods that will automatically bind +the method's `this` calling context. This enables you to pass methods as callbacks to other objects, +and not have to write `a.some_method.bind(a)` +``` + b.set_callback( a->some_method ) +``` + Speed --------------- PythonJS gives you the option to optimize your program for speed with a new syntax for static typing, in some cases this results in code that is 20X faster. @@ -349,6 +356,7 @@ pythonjs.configure( Gotchas --------- 1. The calling context of `this` must be taken into account when using fast javascript mode, code that comes after: `pythonjs.configure(javascript=True)` or is inside a `with javascript:` block. When in javascript mode, passing a method as a callback, or setting it as an attribute on another object, requires you call `f.bind(self)` to ensure that `self` within the method points to the class instance. This is not required when using classes defined normal mode, because the `this` calling context is automatically managed. +Note: you can use the special `->` syntax in place of the attribute operator `.` to call `bind` automatically. ``` class A: @@ -365,10 +373,12 @@ with javascript: b = B() a.b_method1 = b.method a.b_method2 = b.method.bind(b) + a.b_method3 = b->method a.method() ## OK: prints a a.b_method1() ## FAILS: prints a, should have printed b a.b_method2() ## OK: prints b + a.b_method3() ## OK: prints b b.a_method = a.method b.a_method() ## OK: prints a diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 8e1b80a..b9db14e 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -91,6 +91,12 @@ def transform_source( source, strip=False ): c += ')' * c.count(' new ') c = c.replace(' new ', ' new(') + if '->' in c: + a,b = c.split('->') + this_name = a.split()[-1].split('=')[-1].split(':')[-1].split(',')[-1] + method_name = b.split()[0].split('(')[0] + c = c.replace('->'+method_name, '.'+method_name+'.bind(%s)'%this_name) + ## jquery ## ## TODO ensure this is not inside quoted text if '$(' in c: @@ -117,6 +123,11 @@ def transform_source( source, strip=False ): if True: float* def Y(): pass + +A.callback = B->method +A.do_something( x,y,z, B->method ) +A.do_something( x,y,z, callback=B->method ) + ''' if __name__ == '__main__': From 31953c2e3f4eaa0ddb82ccf26dca49fb83675637 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 21 Jul 2014 03:44:49 -0700 Subject: [PATCH 144/222] allow inline function `x.func( callback=def cb(): ...)` syntax --- pythonjs/typedpython.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index b9db14e..4bacb26 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -23,6 +23,8 @@ def transform_source( source, strip=False ): output = [] + output_post = None + for line in source.splitlines(): a = [] for i,char in enumerate(line): @@ -91,12 +93,21 @@ def transform_source( source, strip=False ): c += ')' * c.count(' new ') c = c.replace(' new ', ' new(') + ## X.method.bind(X) shortcut `->` if '->' in c: a,b = c.split('->') this_name = a.split()[-1].split('=')[-1].split(':')[-1].split(',')[-1] method_name = b.split()[0].split('(')[0] c = c.replace('->'+method_name, '.'+method_name+'.bind(%s)'%this_name) + ## callback=def .. inline function ## + if '=def ' in c or '= def ' in c: + d = '=def ' + c, tail = c.split(d) + #name = c.split(d)[-1].split('(')[0] + c += '=lambda __INLINE_FUNCTION__: %s )' %tail.strip().split(':')[0] + output_post = 'def %s'%tail + ## jquery ## ## TODO ensure this is not inside quoted text if '$(' in c: @@ -110,8 +121,17 @@ def transform_source( source, strip=False ): c = c.replace('nonlocal ', 'global ') ## fake nonlocal with global output.append( c ) + if type(output_post) is str: + output.append(output_post) + output_post = True + elif output_post == True: + if output[-1].strip()==')': + output.pop() + output_post = None - return '\n'.join(output) + r = '\n'.join(output) + print(r) + return r test = ''' @@ -127,6 +147,9 @@ def transform_source( source, strip=False ): A.callback = B->method A.do_something( x,y,z, B->method ) A.do_something( x,y,z, callback=B->method ) +A.do_something( x,y,z, callback=def cb(x): + return x+y +) ''' From 9618b74ae73cfbd8032c29f444ac456cd2ea1061 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 21 Jul 2014 06:18:43 -0700 Subject: [PATCH 145/222] regtest for inline def --- pythonjs/python_to_pythonjs.py | 9 ++++---- pythonjs/pythonjs.py | 39 +++++++++++++++++++++++++++------- pythonjs/typedpython.py | 8 ++++++- regtests/calling/inline_def.py | 11 ++++++++++ 4 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 regtests/calling/inline_def.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 811a513..b7d6abb 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2540,10 +2540,11 @@ def visit_Call(self, node): def visit_Lambda(self, node): args = [self.visit(a) for a in node.args.args] - #if self._with_js: ## TODO is it better to return a normal lambda - # return """JS('(function (%s) {return %s})')""" %(','.join(args), self.visit(node.body)) - #else: - if hasattr(node, 'keep_as_lambda'): + + ##'__INLINE_FUNCTION__' from typedpython.py + + if hasattr(node, 'keep_as_lambda') or args and args[0]=='__INLINE_FUNCTION__': + ## TODO lambda keyword args self._in_lambda = True a = '(lambda %s: %s)' %(','.join(args), self.visit(node.body)) self._in_lambda = False diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 6d73745..cfe10e0 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -19,6 +19,11 @@ #import code_writer import typedpython +class SwapNode( RuntimeError ): + def __init__(self, node): + self.node = node + RuntimeError.__init__(self) + class JSGenerator(NodeVisitor): #, inline_function.Inliner): def __init__(self, requirejs=True, insert_runtime=True, webworker=False, function_expressions=False): #writer = code_writer.Writer() @@ -31,6 +36,7 @@ def __init__(self, requirejs=True, insert_runtime=True, webworker=False, functio self._insert_runtime = insert_runtime self._webworker = webworker self._exports = set() + self._inline_lambda = False self.special_decorators = set(['__typedef__', '__glsl__', '__pyfunction__']) self._glsl = False @@ -178,7 +184,11 @@ def visit_ExceptHandler(self, node): def visit_Lambda(self, node): args = [self.visit(a) for a in node.args.args] - return '(function (%s) {return %s;})' %(','.join(args), self.visit(node.body)) + if args and args[0]=='__INLINE_FUNCTION__': + self._inline_lambda = True + return '' ## skip node, the next function contains the real def + else: + return '(function (%s) {return %s;})' %(','.join(args), self.visit(node.body)) @@ -475,15 +485,24 @@ def _visit_function(self, node): self.push() body = list() - for child in node.body: + next = None + for i,child in enumerate(node.body): if isinstance(child, Str): continue + elif next: + next = None + continue + + try: + v = self.visit(child) + except SwapNode as error: + error.node.__class__ = ast.FunctionDef + next = node.body[i+1] + assert isinstance(next, ast.FunctionDef) + error.node.__dict__ = next.__dict__ + v = self.visit(child) + - #if isinstance(child, GeneratorType): ## not tested - # for sub in child: - # body.append( self.indent()+self.visit(sub)) - #else: - v = self.visit(child) if v is None: msg = 'error in function: %s'%node.name msg += '\n%s' %child @@ -494,7 +513,9 @@ def _visit_function(self, node): buffer += '\n'.join(body) self.pull() buffer += '\n%s}\n' %self.indent() - if is_pyfunc: + if self._inline_lambda: + self._inline_lambda = False + elif is_pyfunc: buffer += ';%s.is_wrapper = true;' %node.name ## TODO change to .__pyfunc__ return buffer @@ -963,6 +984,8 @@ def visit_Dict(self, node): for i in range( len(node.keys) ): k = self.visit( node.keys[ i ] ) v = self.visit( node.values[i] ) + if self._inline_lambda: + raise SwapNode( node.values[i] ) ## caller catches this, changes the node to a function a.append( '%s:%s'%(k,v) ) b = ','.join( a ) return '{ %s }' %b diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 4bacb26..67f23be 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -122,7 +122,13 @@ def transform_source( source, strip=False ): output.append( c ) if type(output_post) is str: - output.append(output_post) + indent = 0 + for u in output[-1]: + if u == ' ' or u == '\t': + indent += 1 + else: + break + output.append( ('\t'*indent)+output_post) output_post = True elif output_post == True: if output[-1].strip()==')': diff --git a/regtests/calling/inline_def.py b/regtests/calling/inline_def.py new file mode 100644 index 0000000..b1ef0fd --- /dev/null +++ b/regtests/calling/inline_def.py @@ -0,0 +1,11 @@ +"""inline def""" + +def test( callback=None ): + return callback + +def main(): + f = test( callback=def cb(x,y): + return x+y + ) + TestError( f(1,2) == 3 ) + From 832b29a5fd346d2db7b0af9e72e9140b2eb3d6cc Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 21 Jul 2014 14:04:07 -0700 Subject: [PATCH 146/222] fixed inline def in javascript mode. TODO fix for normal mode. --- README.md | 21 +++++++++++++++------ pythonjs/python_to_pythonjs.py | 2 +- pythonjs/pythonjs.py | 4 +++- pythonjs/typedpython.py | 6 +++++- regtests/calling/inline_def.py | 2 +- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 8fed05d..626fbfc 100644 --- a/README.md +++ b/README.md @@ -73,39 +73,48 @@ Extra Python Syntax PythonJS supports all the normal Python syntax you already know, and has been extended to support some extra JavaScript syntax. -1. it is ok to have `var ` before a variable name in an assignment. +. it is ok to have `var ` before a variable name in an assignment. ``` var x = 1 ``` -2. 'new' can be used to create a new JavaScript object +. 'new' can be used to create a new JavaScript object ``` a = new SomeObject() ``` -3. `$` can be used to call a function like jquery +. `$` can be used to call a function like jquery ``` $(selector).something( {'param1':1, 'param2':2} ) ``` -4. External Javascript functions that use an object as the last argument for optional named arguments, can be called with Python style keyword names instead. +. External Javascript functions that use an object as the last argument for optional named arguments, can be called with Python style keyword names instead. ``` $(selector).something( param1=1, param2=2 ) ``` -5. `$` can be used as a funtion parameter, and attributes can be get/set on `$`. +. `$` can be used as a funtion parameter, and attributes can be get/set on `$`. ``` def setup_my_jquery_class( $ ): $.fn.someclass = myclass_init ``` -6. `->` can be used to as a special attribute operator for passing methods that will automatically bind +. `->` can be used to as a special attribute operator for passing methods that will automatically bind the method's `this` calling context. This enables you to pass methods as callbacks to other objects, and not have to write `a.some_method.bind(a)` ``` b.set_callback( a->some_method ) ``` +. in a function call, as a keyword argument, define callbacks inline with def +``` +a.func( callback=def (x,y,z): + x += y + return x - z + +) +``` + Speed --------------- PythonJS gives you the option to optimize your program for speed with a new syntax for static typing, in some cases this results in code that is 20X faster. diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index b7d6abb..b87e9c2 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2162,7 +2162,7 @@ def visit_Call(self, node): self._direct_operators.add( kw.value.s ) else: - raise SyntaxError( self.format_error(node) ) + raise SyntaxError( self.format_error('invalid keyword option') ) elif self._with_ll or name == 'inline' or self._with_glsl: F = self.visit(node.func) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index cfe10e0..fbc23ad 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -498,8 +498,10 @@ def _visit_function(self, node): except SwapNode as error: error.node.__class__ = ast.FunctionDef next = node.body[i+1] - assert isinstance(next, ast.FunctionDef) + if not isinstance(next, ast.FunctionDef): + raise SyntaxError('inline def is only allowed in javascript mode') error.node.__dict__ = next.__dict__ + error.node.name = '' v = self.visit(child) diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 67f23be..44453eb 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -102,6 +102,8 @@ def transform_source( source, strip=False ): ## callback=def .. inline function ## if '=def ' in c or '= def ' in c: + if 'def (' in c: + c = c.replace('def (', 'def __NAMELESS__(') d = '=def ' c, tail = c.split(d) #name = c.split(d)[-1].split('(')[0] @@ -136,7 +138,6 @@ def transform_source( source, strip=False ): output_post = None r = '\n'.join(output) - print(r) return r @@ -156,6 +157,9 @@ def transform_source( source, strip=False ): A.do_something( x,y,z, callback=def cb(x): return x+y ) +A.do_something( x,y,z, callback=def (x,y,z): + return x+y +) ''' diff --git a/regtests/calling/inline_def.py b/regtests/calling/inline_def.py index b1ef0fd..ad2f317 100644 --- a/regtests/calling/inline_def.py +++ b/regtests/calling/inline_def.py @@ -4,7 +4,7 @@ def test( callback=None ): return callback def main(): - f = test( callback=def cb(x,y): + f = test( callback=def (x,y): return x+y ) TestError( f(1,2) == 3 ) From e877fd4ce08d3103095153030c71968165bef870 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 21 Jul 2014 23:33:39 -0700 Subject: [PATCH 147/222] adding support for RapydScript style inline function def --- pythonjs/typedpython.py | 62 +++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 44453eb..2d79167 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -45,8 +45,8 @@ def transform_source( source, strip=False ): if a[-1]=='*': a.pop() a.append('POINTER') - a.append('=') - a.append( char ) + a.append('=\t\t\t\t') + #a.append( char ) else: a.append( char ) else: @@ -62,8 +62,8 @@ def transform_source( source, strip=False ): if cs.startswith('var '): c = c.replace('var ', '') - if '= def ' in c: - x, c = c.split('= def ') + if '=\t\t\t\tdef ' in c: + x, c = c.split('=\t\t\t\tdef ') indent = [] pre = [] for char in x: @@ -101,14 +101,35 @@ def transform_source( source, strip=False ): c = c.replace('->'+method_name, '.'+method_name+'.bind(%s)'%this_name) ## callback=def .. inline function ## - if '=def ' in c or '= def ' in c: + if '=def ' in c or '= def ' in c or ': def ' in c or ':def ' in c: + if '=def ' in c: + d = '=def ' + elif '= def ' in c: + d = '= def ' + elif ': def ' in c: + d = ': def ' + elif ':def ' in c: + d = ':def ' + if 'def (' in c: c = c.replace('def (', 'def __NAMELESS__(') - d = '=def ' c, tail = c.split(d) #name = c.split(d)[-1].split('(')[0] - c += '=lambda __INLINE_FUNCTION__: %s )' %tail.strip().split(':')[0] - output_post = 'def %s'%tail + if d.startswith('='): + if '(' in c: + c += '=lambda __INLINE_FUNCTION__: %s )' %tail.strip().split(':')[0] + else: + c += '=lambda __INLINE_FUNCTION__: %s' %tail.strip().split(':')[0] + output_post = 'def %s'%tail + else: + c += ':lambda __INLINE_FUNCTION__: %s,' %tail.strip().split(':')[0] + output.append( c ) + if output_post: + if output_post[-1][-1]==',': + output_post[-1] = output_post[-1][:-1] + else: output_post = list() + c = 'def %s'%tail + ## jquery ## ## TODO ensure this is not inside quoted text @@ -122,7 +143,11 @@ def transform_source( source, strip=False ): if c.strip().startswith('nonlocal '): ## Python3 syntax c = c.replace('nonlocal ', 'global ') ## fake nonlocal with global - output.append( c ) + if type(output_post) is list: + output_post.append( c ) + else: + output.append( c ) + if type(output_post) is str: indent = 0 for u in output[-1]: @@ -136,6 +161,11 @@ def transform_source( source, strip=False ): if output[-1].strip()==')': output.pop() output_post = None + elif type(output_post) is list: + if output_post[-1].strip().endswith('}'): + output.append( output_post.pop() ) + output.extend( output_post ) + output_post = None r = '\n'.join(output) return r @@ -160,6 +190,20 @@ def transform_source( source, strip=False ): A.do_something( x,y,z, callback=def (x,y,z): return x+y ) +a = { + 'cb1': def (x,y): + return x+y +} + +b = { + 'cb1': def (x,y): + return x+y, + 'cb2': def (x,y): + return x+y +} + +c=def (x,y): + return x+y ''' From d63890916d00b88ccbdf332260f4c94f2c9734d3 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 22 Jul 2014 03:26:49 -0700 Subject: [PATCH 148/222] fixing inline def inside of dict --- pythonjs/pythonjs.py | 18 ++++++++++++++---- pythonjs/typedpython.py | 29 +++++++++++++++++++---------- regtests/dict/dict_inline_def.py | 10 ++++++++++ 3 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 regtests/dict/dict_inline_def.py diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index fbc23ad..27e8f9e 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -140,7 +140,16 @@ def visit_Tuple(self, node): return '[%s]' % ', '.join(map(self.visit, node.elts)) def visit_List(self, node): - return '[%s]' % ', '.join(map(self.visit, node.elts)) + a = [] + for elt in node.elts: + b = self.visit(elt) + if b is None: + raise SyntaxError(elt) + a.append( b ) + #if self._inline_lambda == True: + # raise SwapNode( elt ) + return '[%s]' % ', '.join(a) + def visit_TryExcept(self, node): out = [] @@ -186,7 +195,8 @@ def visit_Lambda(self, node): args = [self.visit(a) for a in node.args.args] if args and args[0]=='__INLINE_FUNCTION__': self._inline_lambda = True - return '' ## skip node, the next function contains the real def + #return '' ## skip node, the next function contains the real def + raise SwapNode( node ) else: return '(function (%s) {return %s;})' %(','.join(args), self.visit(node.body)) @@ -986,8 +996,8 @@ def visit_Dict(self, node): for i in range( len(node.keys) ): k = self.visit( node.keys[ i ] ) v = self.visit( node.values[i] ) - if self._inline_lambda: - raise SwapNode( node.values[i] ) ## caller catches this, changes the node to a function + #if self._inline_lambda: + # raise SwapNode( node.values[i] ) ## caller catches this, changes the node to a function a.append( '%s:%s'%(k,v) ) b = ','.join( a ) return '{ %s }' %b diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 2d79167..2542805 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -164,7 +164,16 @@ def transform_source( source, strip=False ): elif type(output_post) is list: if output_post[-1].strip().endswith('}'): output.append( output_post.pop() ) - output.extend( output_post ) + #output.extend( output_post ) + indent = 0 + for u in output[-1]: + if u == ' ' or u == '\t': + indent += 1 + else: + break + for ln in output_post: + output.append( ('\t'*indent)+ln ) + output_post = None r = '\n'.join(output) @@ -194,15 +203,15 @@ def transform_source( source, strip=False ): 'cb1': def (x,y): return x+y } - -b = { - 'cb1': def (x,y): - return x+y, - 'cb2': def (x,y): - return x+y -} - -c=def (x,y): +def xxx(): + b = { + 'cb1': def (x,y): + return x+y, + 'cb2': def (x,y): + return x+y + } + +c = def (x,y): return x+y ''' diff --git a/regtests/dict/dict_inline_def.py b/regtests/dict/dict_inline_def.py new file mode 100644 index 0000000..29b86f0 --- /dev/null +++ b/regtests/dict/dict_inline_def.py @@ -0,0 +1,10 @@ +"""dict inline def""" + + +def main(): + + d = { 'callback': def (x,y): + return x+y + } + TestError( d['callback'](1,2) == 3 ) + From ee3e16ebe15371be7d5a57967441198694a11d86 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 22 Jul 2014 05:11:16 -0700 Subject: [PATCH 149/222] support multiple inline function def's inside a dict --- pythonjs/pythonjs.py | 61 ++++++++++++++++++++------------ regtests/dict/dict_inline_def.py | 7 ++++ 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 27e8f9e..425c31a 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -19,7 +19,7 @@ #import code_writer import typedpython -class SwapNode( RuntimeError ): +class SwapLambda( RuntimeError ): def __init__(self, node): self.node = node RuntimeError.__init__(self) @@ -143,11 +143,8 @@ def visit_List(self, node): a = [] for elt in node.elts: b = self.visit(elt) - if b is None: - raise SyntaxError(elt) + if b is None: raise SyntaxError(elt) a.append( b ) - #if self._inline_lambda == True: - # raise SwapNode( elt ) return '[%s]' % ', '.join(a) @@ -196,7 +193,7 @@ def visit_Lambda(self, node): if args and args[0]=='__INLINE_FUNCTION__': self._inline_lambda = True #return '' ## skip node, the next function contains the real def - raise SwapNode( node ) + raise SwapLambda( node ) else: return '(function (%s) {return %s;})' %(','.join(args), self.visit(node.body)) @@ -497,22 +494,21 @@ def _visit_function(self, node): body = list() next = None for i,child in enumerate(node.body): - if isinstance(child, Str): - continue - elif next: - next = None + if isinstance(child, Str) or hasattr(child, 'SKIP'): continue - try: - v = self.visit(child) - except SwapNode as error: - error.node.__class__ = ast.FunctionDef - next = node.body[i+1] - if not isinstance(next, ast.FunctionDef): - raise SyntaxError('inline def is only allowed in javascript mode') - error.node.__dict__ = next.__dict__ - error.node.name = '' - v = self.visit(child) + #try: + # v = self.visit(child) + #except SwapLambda as error: + # error.node.__class__ = ast.FunctionDef + # next = node.body[i+1] + # if not isinstance(next, ast.FunctionDef): + # raise SyntaxError('inline def is only allowed in javascript mode') + # error.node.__dict__ = next.__dict__ + # error.node.name = '' + # v = self.visit(child) + + v = self.try_and_catch_swap_lambda(child, node.body) if v is None: @@ -531,6 +527,29 @@ def _visit_function(self, node): buffer += ';%s.is_wrapper = true;' %node.name ## TODO change to .__pyfunc__ return buffer + def try_and_catch_swap_lambda(self, child, body): + try: + return self.visit(child) + except SwapLambda as e: + + next = None + for i in range( body.index(child), len(body) ): + n = body[ i ] + if isinstance(n, ast.FunctionDef): + if hasattr(n, 'SKIP'): + continue + else: + next = n + break + assert next + next.SKIP = True + e.node.__class__ = ast.FunctionDef + e.node.__dict__ = next.__dict__ + e.node.name = '' + return self.try_and_catch_swap_lambda( child, body ) + + + def _visit_subscript_ellipsis(self, node): name = self.visit(node.value) return '%s["$wrapped"]' %name @@ -996,8 +1015,6 @@ def visit_Dict(self, node): for i in range( len(node.keys) ): k = self.visit( node.keys[ i ] ) v = self.visit( node.values[i] ) - #if self._inline_lambda: - # raise SwapNode( node.values[i] ) ## caller catches this, changes the node to a function a.append( '%s:%s'%(k,v) ) b = ','.join( a ) return '{ %s }' %b diff --git a/regtests/dict/dict_inline_def.py b/regtests/dict/dict_inline_def.py index 29b86f0..e4ad9cb 100644 --- a/regtests/dict/dict_inline_def.py +++ b/regtests/dict/dict_inline_def.py @@ -8,3 +8,10 @@ def main(): } TestError( d['callback'](1,2) == 3 ) + a = { 'cb1': def (x,y): + return x+y, + 'cb2' : def (x): + return x*2 + } + TestError( a['cb1'](1,2) == 3 ) + TestError( a['cb2'](100) == 200 ) From 86da02ebc0befa5eff38376d0962e7e546373b06 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 22 Jul 2014 06:26:13 -0700 Subject: [PATCH 150/222] support multiple inline functions as keyword args in function call. --- README.md | 22 +++++++++++---- pythonjs/typedpython.py | 50 ++++++++++++++++++++++++++-------- regtests/calling/inline_def.py | 13 +++++---- 3 files changed, 64 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 626fbfc..adba600 100644 --- a/README.md +++ b/README.md @@ -106,15 +106,27 @@ and not have to write `a.some_method.bind(a)` b.set_callback( a->some_method ) ``` -. in a function call, as a keyword argument, define callbacks inline with def +. in a function call, inline functions can be given as keyword arguments ``` -a.func( callback=def (x,y,z): - x += y - return x - z - +a.func( + callback1=def (x,y,z): + x += y + return x - z, + callback2= def (x, y): + return x * y ) ``` +. inline functions can be used inside a dict literal +``` +a = { + 'cb1' : def (x): + return x, + 'cb2' : def (y): + return y +} +``` + Speed --------------- PythonJS gives you the option to optimize your program for speed with a new syntax for static typing, in some cases this results in code that is 20X faster. diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 2542805..1356f9f 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -62,6 +62,13 @@ def transform_source( source, strip=False ): if cs.startswith('var '): c = c.replace('var ', '') + if '= function(' in c: + k = '= function(' + a,b = c.split(k) + output.append( '@func_expression(%s)' %a.strip()) + c = 'def __NAMELESS__(' + b + + if '=\t\t\t\tdef ' in c: x, c = c.split('=\t\t\t\tdef ') indent = [] @@ -114,13 +121,27 @@ def transform_source( source, strip=False ): if 'def (' in c: c = c.replace('def (', 'def __NAMELESS__(') c, tail = c.split(d) - #name = c.split(d)[-1].split('(')[0] + + #if d.startswith('='): + # if '(' in c: + # c += '=lambda __INLINE_FUNCTION__: %s )' %tail.strip().split(':')[0] + # else: + # c += '=lambda __INLINE_FUNCTION__: %s' %tail.strip().split(':')[0] + # output_post = 'def %s'%tail + if d.startswith('='): - if '(' in c: - c += '=lambda __INLINE_FUNCTION__: %s )' %tail.strip().split(':')[0] - else: - c += '=lambda __INLINE_FUNCTION__: %s' %tail.strip().split(':')[0] - output_post = 'def %s'%tail + c += '=lambda __INLINE_FUNCTION__: %s' %tail.strip().split(':')[0] + + if output_post: + if output_post[-1][-1]==',': + output_post[-1] = output_post[-1][:-1] + output[-1] += ',' + else: output_post = list() + + output.append( c ) + + c = 'def %s'%tail + else: c += ':lambda __INLINE_FUNCTION__: %s,' %tail.strip().split(':')[0] output.append( c ) @@ -148,7 +169,7 @@ def transform_source( source, strip=False ): else: output.append( c ) - if type(output_post) is str: + if type(output_post) is str: ## DEPRECATED indent = 0 for u in output[-1]: if u == ' ' or u == '\t': @@ -157,14 +178,14 @@ def transform_source( source, strip=False ): break output.append( ('\t'*indent)+output_post) output_post = True - elif output_post == True: + elif output_post == True: ## DEPRECATED if output[-1].strip()==')': output.pop() output_post = None + elif type(output_post) is list: - if output_post[-1].strip().endswith('}'): + if output_post[-1].strip().endswith( ('}',')') ): output.append( output_post.pop() ) - #output.extend( output_post ) indent = 0 for u in output[-1]: if u == ' ' or u == '\t': @@ -211,9 +232,16 @@ def xxx(): return x+y } -c = def (x,y): +X.func( cb1=def (): + return 1, + cb2=def (): + return 2 +) + +c = function(x,y): return x+y + ''' if __name__ == '__main__': diff --git a/regtests/calling/inline_def.py b/regtests/calling/inline_def.py index ad2f317..c9867fe 100644 --- a/regtests/calling/inline_def.py +++ b/regtests/calling/inline_def.py @@ -1,11 +1,14 @@ """inline def""" -def test( callback=None ): - return callback +def test( callback1=None, callback2=None ): + return {'cb1', callback1, 'cb2': callback2 } def main(): - f = test( callback=def (x,y): - return x+y + o = test( callback1=def (x,y): + return x+y, + callback2 = def (x): + return x*2 ) - TestError( f(1,2) == 3 ) + TestError( o['cb1'](1,2) == 3 ) + TestError( o['cb2'](100) == 200 ) From 3f087983b4d0ea8048f7bc72355f2b9c0a81b159 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 22 Jul 2014 17:26:24 -0700 Subject: [PATCH 151/222] implemented exception expressions: PEP 463 --- README.md | 7 +++++++ pythonjs/typedpython.py | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/README.md b/README.md index adba600..2e23f27 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,13 @@ a = { } ``` +. exception expressions (PEP 463) +``` +a = {} +b = a['somekey'] except KeyError: 'my-default' +``` + + Speed --------------- PythonJS gives you the option to optimize your program for speed with a new syntax for static typing, in some cases this results in code that is 20X faster. diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 1356f9f..e412265 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -68,6 +68,13 @@ def transform_source( source, strip=False ): output.append( '@func_expression(%s)' %a.strip()) c = 'def __NAMELESS__(' + b + if ' except ' in c: ## PEP 463 - exception expressions + s = c.split(' except ') + if len(s) == 2 and '=' in s[0]: + output.append('try: %s' %s[0]) + exception, default = s[1].split(':') + output.append('except %s: %s=%s' %( exception, s[0].split('=')[0], default) ) + c = '' if '=\t\t\t\tdef ' in c: x, c = c.split('=\t\t\t\tdef ') @@ -241,6 +248,7 @@ def xxx(): c = function(x,y): return x+y +d = a[ 'somekey' ] except KeyError: 'mydefault' ''' From 5015227f7ca65d6bde7f56275f37c94e294d83a2 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 23 Jul 2014 01:43:05 -0700 Subject: [PATCH 152/222] Exception Expressions: fixed indented blocks. --- pythonjs/typedpython.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index e412265..a245cf3 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -71,9 +71,17 @@ def transform_source( source, strip=False ): if ' except ' in c: ## PEP 463 - exception expressions s = c.split(' except ') if len(s) == 2 and '=' in s[0]: - output.append('try: %s' %s[0]) + indent = [] + for char in s[0]: + if char in __whitespace: + indent.append( char ) + else: + break + indent = ''.join(indent) + s0 = s[0].strip() + output.append('%stry: %s' %(indent, s0) ) exception, default = s[1].split(':') - output.append('except %s: %s=%s' %( exception, s[0].split('=')[0], default) ) + output.append('%sexcept %s: %s=%s' %(indent, exception, s0.split('=')[0], default) ) c = '' if '=\t\t\t\tdef ' in c: @@ -247,8 +255,8 @@ def xxx(): c = function(x,y): return x+y - -d = a[ 'somekey' ] except KeyError: 'mydefault' +if True: + d = a[ 'somekey' ] except KeyError: 'mydefault' ''' From 83900ef6c57d5a55289225bf325cad7ef9195330 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 23 Jul 2014 04:07:41 -0700 Subject: [PATCH 153/222] removed ripplelib test --- regtests/requirejs/import_ripplelib.py | 37 -------------------------- 1 file changed, 37 deletions(-) delete mode 100644 regtests/requirejs/import_ripplelib.py diff --git a/regtests/requirejs/import_ripplelib.py b/regtests/requirejs/import_ripplelib.py deleted file mode 100644 index 30914c3..0000000 --- a/regtests/requirejs/import_ripplelib.py +++ /dev/null @@ -1,37 +0,0 @@ -'''test ripple library''' -# sudo npm install -g ripple-lib -# https://github.com/ripple/ripple-lib/blob/develop/docs/GUIDES.md - -import ripple-lib as ripple - -def main(): - R = new(ripple.Remote( - trusted=True, - local_signing=True, - local_fee=True, - fee_cushion=1.5, - servers = [ - {'host':'s1.ripple.com', 'port':443, 'secure':True} - ] - )) - def on_connect(): - print('connected!') - test2(R) - - R.connect( on_connect ) - -def test2(R): - req = R.request_server_info() - def on_server_info_ok(r): - print('info ok') - print(r) - def on_server_info_err(e): - print('info err') - print(e) - - req.on('success', on_server_info_ok) - req.on('error', on_server_info_err) - - req.request() - - print('ripple-lib test complete') From 7ab57cf6a7fe75ecac60f3639ed7ca275e618792 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 23 Jul 2014 04:08:15 -0700 Subject: [PATCH 154/222] new command line option `--analyzer` for translator.py, trigger code analysis and debugging using dartanalyzer from the Dart SDK. --- README.md | 8 +- pythonjs/translator.py | 161 ++++++++++++++++++++++++----------------- 2 files changed, 103 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index 2e23f27..1c7b5b7 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ will be converted into JavaScript. Usage:: - translator.py [--dart|--coffee|--lua|--no-wrapper] file.py + translator.py [--help|--dart|--coffee|--lua|--no-wrapper|--analyzer] file.py Examples:: @@ -67,6 +67,12 @@ Examples:: ./translator.py myscript.py > myscript.js ./translator.py myapp.html > app.html +The option `--no-wrapper` will output the raw JavaScript, by default the output is wrapped as a requirejs module. + +The option `--analyzer` requires the Dart SDK is installed to your home directory: `~/dart-sdk`, +if this option is used then your script is also translated using the dart backend and fed to +`dartanalyzer` which will perform static analysis of your code. Dartanalyzer is able to catch many types of errors, like: missing functions, invalid names, calling a function with the wrong argument types. The quality of the analysis will depend on how much type information can be +inferred from your code, combined with the variables you have manually typed. If dartanalyzer detects an error in your code, translation will abort, and debugging information is printed. Extra Python Syntax ------------------- diff --git a/pythonjs/translator.py b/pythonjs/translator.py index bbeab65..46fd4b9 100755 --- a/pythonjs/translator.py +++ b/pythonjs/translator.py @@ -9,81 +9,112 @@ from pythonjs_to_luajs import main as pythonjs_to_luajs cmdhelp = """\ -usage: translator.py [--dart|--coffee|--lua] file.py - translator.py --visjs file.py\ +usage: translator.py [--dart|--coffee|--lua|--visjs|--no-wrapper|--analyze] file.py + +example: + translator.py --no-wrapper myscript.py > myscript.js """ + def main(script, module_path=None): - if '--visjs' in sys.argv: - import python_to_visjs - return python_to_visjs.main( script ) - else: - code = '' - if '--dart' in sys.argv: - a = python_to_pythonjs(script, dart=True, module_path=module_path) - code = pythonjs_to_dart( a ) - elif '--coffee' in sys.argv: - a = python_to_pythonjs(script, coffee=True, module_path=module_path) - code = pythonjs_to_coffee( a ) - elif '--lua' in sys.argv: - a = python_to_pythonjs(script, lua=True, module_path=module_path) - try: code = pythonjs_to_lua( a ) - except SyntaxError: - err = traceback.format_exc() - lineno = 0 - for line in err.splitlines(): - if "" in line: - lineno = int(line.split()[-1]) + if '--visjs' in sys.argv: + import python_to_visjs + return python_to_visjs.main( script ) + else: + code = '' + res = None + if '--dart' in sys.argv: + a = python_to_pythonjs(script, dart=True, module_path=module_path) + code = pythonjs_to_dart( a ) + elif '--coffee' in sys.argv: + a = python_to_pythonjs(script, coffee=True, module_path=module_path) + code = pythonjs_to_coffee( a ) + elif '--lua' in sys.argv: + a = python_to_pythonjs(script, lua=True, module_path=module_path) + try: code = pythonjs_to_lua( a ) + except SyntaxError: + err = traceback.format_exc() + lineno = 0 + for line in err.splitlines(): + if "" in line: + lineno = int(line.split()[-1]) + + b = a.splitlines()[ lineno ] + sys.stderr.write( '\n'.join([err,b]) ) + + elif '--luajs' in sys.argv: ## converts back to javascript + a = python_to_pythonjs(script, lua=True, module_path=module_path) + code = pythonjs_to_luajs( a ) + else: + a = python_to_pythonjs(script, module_path=module_path) + if isinstance(a, dict): + res = {} + for jsfile in a: + res[ jsfile ] = pythonjs_to_javascript( a[jsfile], webworker=jsfile != 'main' ) + return res + else: + ## requirejs module is on by default, this wraps the code in a `define` function + ## and returns `__module__` + ## if --no-wrapper is used, then the raw javascript is returned. + code = pythonjs_to_javascript( a, requirejs='--no-wrapper' not in sys.argv ) + + if '--analyze' in sys.argv: + dartanalyzer = os.path.expanduser('~/dart-sdk/bin/dartanalyzer') + #dart2js = os.path.expanduser('~/dart-sdk/bin/dart2js') + assert os.path.isfile( dartanalyzer ) - b = a.splitlines()[ lineno ] - sys.stderr.write( '\n'.join([err,b]) ) - - elif '--luajs' in sys.argv: ## converts back to javascript - a = python_to_pythonjs(script, lua=True, module_path=module_path) - code = pythonjs_to_luajs( a ) - else: - a = python_to_pythonjs(script, module_path=module_path) - if isinstance(a, dict): - res = {} - for jsfile in a: - res[ jsfile ] = pythonjs_to_javascript( a[jsfile], webworker=jsfile != 'main' ) - return res - else: - ## requirejs module is on by default, this wraps the code in a `define` function - ## and returns `__module__` - ## if --no-wrapper is used, then the raw javascript is returned. - code = pythonjs_to_javascript( a, requirejs='--no-wrapper' not in sys.argv ) + x = python_to_pythonjs(script, dart=True, module_path=module_path) + dartcode = pythonjs_to_dart( x ) + path = '/tmp/debug.dart' + open(path, 'wb').write( dartcode ) + import subprocess + try: + subprocess.check_output( [dartanalyzer, path] ) + except subprocess.CalledProcessError as err: + dartcodelines = dartcode.splitlines() + for line in err.output.splitlines(): + if line.startswith('[error]'): + a,b = line.split( path ) + a = a[:-1] + print( '\x1B[0;31m' + a + '\x1B[0m' ) + lineno = int( b.split('line ')[-1].split(',')[0] ) + print('line: %s' %lineno) + print( dartcodelines[lineno-1] ) + sys.exit(1) - return code + if res: ## dict return + return res + else: + return code def command(): - if '-h' in sys.argv or '--help' in sys.argv: - print(cmdhelp) - return + if '-h' in sys.argv or '--help' in sys.argv: + print(cmdhelp) + return - mpath = None - scripts = [] - if len(sys.argv) > 1: - for arg in sys.argv[1:]: - if arg.endswith('.py') or arg.endswith('.html'): - scripts.append( arg ) - if mpath is None: - mpath = os.path.split(arg)[0] + mpath = None + scripts = [] + if len(sys.argv) > 1: + for arg in sys.argv[1:]: + if arg.endswith('.py') or arg.endswith('.html'): + scripts.append( arg ) + if mpath is None: + mpath = os.path.split(arg)[0] - if len(scripts): - a = [] - for script in scripts: - a.append( open(script, 'rb').read() ) - data = '\n'.join( a ) - else: - data = sys.stdin.read() + if len(scripts): + a = [] + for script in scripts: + a.append( open(script, 'rb').read() ) + data = '\n'.join( a ) + else: + data = sys.stdin.read() - js = main(data, module_path=mpath) - if isinstance(js, dict): - print( json.dumps(js) ) - else: - print(js) + js = main(data, module_path=mpath) + if isinstance(js, dict): + print( json.dumps(js) ) + else: + print(js) if __name__ == '__main__': - command() + command() From 4d5b4a882889409036b9610eeeee7ef4b591eb3e Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 23 Jul 2014 07:07:01 -0700 Subject: [PATCH 155/222] new function expression syntax. --- README.md | 5 +++++ pythonjs/python_to_pythonjs.py | 8 ++++++++ pythonjs/pythonjs.py | 22 ++++++++++++++++------ pythonjs/typedpython.py | 2 +- regtests/calling/function_expression.py | 8 ++++++++ 5 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 regtests/calling/function_expression.py diff --git a/README.md b/README.md index 1c7b5b7..ee42959 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,11 @@ a = {} b = a['somekey'] except KeyError: 'my-default' ``` +. function expressions +``` +F = function(x): + return x +``` Speed --------------- diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index b87e9c2..619602d 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2592,6 +2592,7 @@ def visit_FunctionDef(self, node): gpu_vectorize = False gpu_method = False local_typedefs = [] + func_expr = None ## deprecated? self._cached_property = None @@ -2605,6 +2606,10 @@ def visit_FunctionDef(self, node): if isinstance(decorator, Name) and decorator.id == 'gpu': gpu = True + elif isinstance(decorator, Call) and decorator.func.id == 'expression': + assert len(decorator.args)==1 + func_expr = self.visit(decorator.args[0]) + elif isinstance(decorator, Call) and decorator.func.id == 'typedef': c = decorator assert len(c.args) == 0 and len(c.keywords) @@ -2780,6 +2785,9 @@ def visit_FunctionDef(self, node): if args_typedefs: writer.write('@__typedef__(%s)' %','.join(args_typedefs)) + if func_expr: + writer.write('@expression(%s)' %func_expr) + if not self._with_dart and not self._with_lua and not self._with_js and not javascript and not self._with_glsl: writer.write('@__pyfunction__') diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 425c31a..3910e7c 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -38,7 +38,7 @@ def __init__(self, requirejs=True, insert_runtime=True, webworker=False, functio self._exports = set() self._inline_lambda = False - self.special_decorators = set(['__typedef__', '__glsl__', '__pyfunction__']) + self.special_decorators = set(['__typedef__', '__glsl__', '__pyfunction__', 'expression']) self._glsl = False self._has_glsl = False self._typed_vars = dict() @@ -242,8 +242,15 @@ def _visit_function(self, node): gpu_vectorize = False gpu_method = False args_typedefs = {} + func_expr = False + for decor in node.decorator_list: - if isinstance(decor, ast.Name) and decor.id == '__pyfunction__': + if isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == 'expression': + assert len(decor.args)==1 + func_expr = True + node.name = self.visit(decor.args[0]) + + elif isinstance(decor, ast.Name) and decor.id == '__pyfunction__': is_pyfunc = True elif isinstance(decor, ast.Name) and decor.id == '__glsl__': glsl = True @@ -473,10 +480,13 @@ def _visit_function(self, node): elif len(self._function_stack) == 1: ## this style will not make function global to the eval context in NodeJS ## #buffer = self.indent() + 'function %s(%s) {\n' % (node.name, ', '.join(args)) - ## this is required for eval to be able to work in NodeJS, note there is no var keyword. - if self._func_expressions: - buffer = self.indent() + '%s = function(%s) {\n' % (node.name, ', '.join(args)) + ## note if there is no var keyword and this function is at the global level, + ## then it should be callable from eval in NodeJS - this is not correct. + ## infact, var should always be used with function expressions. + + if self._func_expressions or func_expr: + buffer = self.indent() + 'var %s = function(%s) {\n' % (node.name, ', '.join(args)) else: buffer = self.indent() + 'function %s(%s) {\n' % (node.name, ', '.join(args)) @@ -485,7 +495,7 @@ def _visit_function(self, node): else: - if self._func_expressions: + if self._func_expressions or func_expr: buffer = self.indent() + 'var %s = function(%s) {\n' % (node.name, ', '.join(args)) else: buffer = self.indent() + 'function %s(%s) {\n' % (node.name, ', '.join(args)) diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index a245cf3..b885edd 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -65,7 +65,7 @@ def transform_source( source, strip=False ): if '= function(' in c: k = '= function(' a,b = c.split(k) - output.append( '@func_expression(%s)' %a.strip()) + output.append( '@expression(%s)' %a.strip()) c = 'def __NAMELESS__(' + b if ' except ' in c: ## PEP 463 - exception expressions diff --git a/regtests/calling/function_expression.py b/regtests/calling/function_expression.py new file mode 100644 index 0000000..9c12bc7 --- /dev/null +++ b/regtests/calling/function_expression.py @@ -0,0 +1,8 @@ +"""func expr""" + +F = function( x,y ): + return x+y + +def main(): + TestError( F(1,2) == 3 ) + From ca4ca25920fe56e21b69d7ff88c971d6e1d4659b Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 23 Jul 2014 16:12:29 -0700 Subject: [PATCH 156/222] new regtest for tuple keys in dict --- regtests/dict/tuple_keys.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 regtests/dict/tuple_keys.py diff --git a/regtests/dict/tuple_keys.py b/regtests/dict/tuple_keys.py new file mode 100644 index 0000000..6767983 --- /dev/null +++ b/regtests/dict/tuple_keys.py @@ -0,0 +1,12 @@ +"""dict tuple key""" + + +def main(): + a = (1,2,3) + b = (1,2,3) + c = ( a, b, 'XXX' ) + + D = { a: 22, c:44 } + TestError( D[ a ] == 22) + TestError( D[ b ] == 22) + TestError( D[ c ] == 44) From cfd40f299176da955aa96582826f546bacd021c9 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 23 Jul 2014 18:07:16 -0700 Subject: [PATCH 157/222] fixed using tuple as dict key in normal mode. --- pythonjs/pythonjs.js | 278 ++++++++++++++++++----------------- pythonjs/runtime/builtins.py | 18 ++- pythonjs/typedpython.py | 9 ++ 3 files changed, 163 insertions(+), 142 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index de012ed..2a4317a 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -11,7 +11,7 @@ if (( typeof(window) ) != "undefined") { if (( typeof(importScripts) ) == "function") { __WEBWORKER__ = true; } -__create_array__ = function() { +var __create_array__ = function() { "Used to fix a bug/feature of Javascript where new Array(number)\n created a array with number of undefined elements which is not\n what we want"; var i,array; array = []; @@ -23,7 +23,7 @@ __create_array__ = function() { return array; } -__get__ = function(object, attribute, error_message) { +var __get__ = function(object, attribute, error_message) { "Retrieve an attribute, method, property, or wrapper function.\n\n method are actually functions which are converted to methods by\n prepending their arguments with the current object. Properties are\n not functions!\n\n DOM support:\n http://stackoverflow.com/questions/14202699/document-createelement-not-working\n https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof\n\n Direct JavaScript Calls:\n if an external javascript function is found, and it was not a wrapper that was generated here,\n check the function for a 'cached_wrapper' attribute, if none is found then generate a new\n wrapper, cache it on the function, and return the wrapper.\n "; if (( object ) === null) { if (error_message) { @@ -400,7 +400,7 @@ __get__ = function(object, attribute, error_message) { } } -_get_upstream_attribute = function(base, attr) { +var _get_upstream_attribute = function(base, attr) { if (( attr ) in base) { return base[attr]; } @@ -412,7 +412,7 @@ _get_upstream_attribute = function(base, attr) { } } -_get_upstream_property = function(base, attr) { +var _get_upstream_property = function(base, attr) { if (( attr ) in base.__properties__) { return base.__properties__[attr]; } @@ -424,7 +424,7 @@ _get_upstream_property = function(base, attr) { } } -__set__ = function(object, attribute, value) { +var __set__ = function(object, attribute, value) { "\n __setattr__ is always called when an attribute is set,\n unlike __getattr__ that only triggers when an attribute is not found,\n this asymmetry is in fact part of the Python spec.\n note there is no __setattribute__\n\n In normal Python a property setter is not called before __setattr__,\n this is bad language design because the user has been more explicit\n in having the property setter.\n\n In PythonJS, property setters are called instead of __setattr__.\n "; if (( "__class__" ) in object && ( object.__class__.__setters__.indexOf(attribute) ) != -1) { object[attribute] = value; @@ -437,7 +437,7 @@ __set__ = function(object, attribute, value) { } } -__getargs__ = function(func_name, signature, args, kwargs) { +var __getargs__ = function(func_name, signature, args, kwargs) { "Based on ``signature`` and ``args``, ``kwargs`` parameters retrieve\n the actual parameters.\n\n This will set default keyword arguments and retrieve positional arguments\n in kwargs if their called as such"; if (( args ) === null) { args = []; @@ -496,19 +496,19 @@ KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Obj ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError"; AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError"; RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError"; -__gpu_object = function(cls, struct_name, data_name) { +var __gpu_object = function(cls, struct_name, data_name) { cls.prototype.__struct_name__ = struct_name; cls.prototype.__struct_data__ = data_name; } gpu = { "object":__gpu_object }; -glsljit_runtime = function(header) { +var glsljit_runtime = function(header) { return new GLSLJITRuntime(header); } -GLSLJITRuntime = function(header) { +var GLSLJITRuntime = function(header) { GLSLJITRuntime.__init__(this, header); this.__class__ = GLSLJITRuntime; this.__uid__ = ("" + _PythonJS_UID); @@ -918,14 +918,14 @@ GLSLJITRuntime.prototype.unpack_mat4 = function(arr) { GLSLJITRuntime.unpack_mat4 = function () { return GLSLJITRuntime.prototype.unpack_mat4.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.__properties__ = { }; GLSLJITRuntime.prototype.__unbound_methods__ = { }; -__getattr__ = function(ob, a) { +var __getattr__ = function(ob, a) { if (ob.__getattr__) { return ob.__getattr__(a); } } ;__getattr__.is_wrapper = true; -__test_if_true__ = function(ob) { +var __test_if_true__ = function(ob) { if (( ob ) === true) { return true; @@ -962,7 +962,7 @@ __test_if_true__ = function(ob) { } } ;__test_if_true__.is_wrapper = true; -__replace_method = function(ob, a, b) { +var __replace_method = function(ob, a, b) { if (( typeof(ob) ) == "string") { return ob.split(a).join(b); @@ -971,7 +971,7 @@ __replace_method = function(ob, a, b) { } } ;__replace_method.is_wrapper = true; -__split_method = function(ob, delim) { +var __split_method = function(ob, delim) { if (( typeof(ob) ) == "string") { if (( delim ) === undefined) { @@ -1004,7 +1004,7 @@ if (( typeof(NodeList) ) == "function") { __dom_array_types__.push(ClientRectList); } } -__is_some_array = function(ob) { +var __is_some_array = function(ob) { if (( __dom_array_types__.length ) > 0) { var __iter14 = __dom_array_types__; @@ -1019,7 +1019,7 @@ __is_some_array = function(ob) { return false; } -__is_typed_array = function(ob) { +var __is_typed_array = function(ob) { if (__test_if_true__(ob instanceof Int8Array || ob instanceof Uint8Array)) { return true; @@ -1040,7 +1040,7 @@ __is_typed_array = function(ob) { } } -__js_typed_array = function(t, a) { +var __js_typed_array = function(t, a) { var arr; if (( t ) == "i") { arr = new Int32Array(a.length); @@ -1049,7 +1049,7 @@ __js_typed_array = function(t, a) { return arr; } -__contains__ = function(ob, a) { +var __contains__ = function(ob, a) { var t; t = typeof(ob); if (( t ) == "string") { @@ -1087,7 +1087,7 @@ __contains__ = function(ob, a) { } } -__add_op = function(a, b) { +var __add_op = function(a, b) { var c,t; t = typeof(a); if (__test_if_true__(( t ) == "string" || ( t ) == "number")) { @@ -1108,7 +1108,7 @@ __add_op = function(a, b) { } } -__mul_op = function(a, b) { +var __mul_op = function(a, b) { var c,arr,t; t = typeof(a); if (( t ) == "number") { @@ -1146,7 +1146,7 @@ __mul_op = function(a, b) { } } -__jsdict = function(items) { +var __jsdict = function(items) { var d,key; d = {}; var __iter16 = items; @@ -1162,7 +1162,7 @@ __jsdict = function(items) { return d; } -__jsdict_get = function(ob, key, default_value) { +var __jsdict_get = function(ob, key, default_value) { if (__test_if_true__(ob instanceof Object)) { if (__test_if_true__(key in ob)) { @@ -1178,7 +1178,7 @@ __jsdict_get = function(ob, key, default_value) { } } -__jsdict_set = function(ob, key, value) { +var __jsdict_set = function(ob, key, value) { if (__test_if_true__(ob instanceof Object)) { ob[key] = value; @@ -1187,7 +1187,7 @@ __jsdict_set = function(ob, key, value) { } } -__jsdict_keys = function(ob) { +var __jsdict_keys = function(ob) { if (__test_if_true__(ob instanceof Object)) { return Object.keys( ob ); @@ -1196,7 +1196,7 @@ __jsdict_keys = function(ob) { } } -__jsdict_values = function(ob) { +var __jsdict_values = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object)) { arr = []; @@ -1215,7 +1215,7 @@ __jsdict_values = function(ob) { } } -__jsdict_items = function(ob) { +var __jsdict_items = function(ob) { var arr,value; if (__test_if_true__(ob instanceof Object || ( ob.items ) === undefined)) { arr = []; @@ -1234,7 +1234,7 @@ __jsdict_items = function(ob) { } } -__jsdict_pop = function(ob, key, _kwargs_) { +var __jsdict_pop = function(ob, key, _kwargs_) { var v; if (!( _kwargs_ instanceof Object )) {; var _kwargs_ = {ob: arguments[0],key: arguments[1],_default: arguments[2]}; @@ -1269,7 +1269,7 @@ __jsdict_pop = function(ob, key, _kwargs_) { } } -dir = function(ob) { +var dir = function(ob) { if (__test_if_true__(ob instanceof Object)) { return Object.keys( ob ); @@ -1278,7 +1278,7 @@ dir = function(ob) { } } -__object_keys__ = function(ob) { +var __object_keys__ = function(ob) { var arr; "\n notes:\n . Object.keys(ob) will not work because we create PythonJS objects using `Object.create(null)`\n . this is different from Object.keys because it traverses the prototype chain.\n "; arr = []; @@ -1286,7 +1286,7 @@ __object_keys__ = function(ob) { return arr; } -__bind_property_descriptors__ = function(o, klass) { +var __bind_property_descriptors__ = function(o, klass) { var prop,desc; var __iter19 = klass.__properties__; if (! (__iter19 instanceof Array || typeof __iter19 == "string" || __is_typed_array(__iter19) || __is_some_array(__iter19) )) { __iter19 = __object_keys__(__iter19) } @@ -1310,7 +1310,7 @@ __bind_property_descriptors__ = function(o, klass) { } } -__generate_getter__ = function(klass, o, n) { +var __generate_getter__ = function(klass, o, n) { var __lambda__ = function() { @@ -1320,7 +1320,7 @@ __generate_getter__ = function(klass, o, n) { return __lambda__; } -__generate_setter__ = function(klass, o, n) { +var __generate_setter__ = function(klass, o, n) { var __lambda__ = function(v) { @@ -1330,7 +1330,7 @@ __generate_setter__ = function(klass, o, n) { return __lambda__; } -__sprintf = function(fmt, args) { +var __sprintf = function(fmt, args) { var chunks,item,arr; if (__test_if_true__(args instanceof Array)) { chunks = fmt.split("%s"); @@ -1363,7 +1363,7 @@ __sprintf = function(fmt, args) { } } -__create_class__ = function(class_name, parents, attrs, props) { +var __create_class__ = function(class_name, parents, attrs, props) { var f,klass,prop; "Create a PythonScript class"; klass = Object.create(null); @@ -1458,7 +1458,7 @@ __create_class__ = function(class_name, parents, attrs, props) { return klass; } -type = function(args, kwargs) { +var type = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{"bases": null, "class_dict": null},args:["ob_or_class_name", "bases", "class_dict"] }; @@ -1480,7 +1480,7 @@ type = function(args, kwargs) { } } ;type.is_wrapper = true; -hasattr = function(args, kwargs) { +var hasattr = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["ob", "attr"] }; @@ -1496,7 +1496,7 @@ hasattr = function(args, kwargs) { return Object.hasOwnProperty.call(ob, attr); } ;hasattr.is_wrapper = true; -getattr = function(args, kwargs) { +var getattr = function(args, kwargs) { var prop; var __sig__,__args__; __sig__ = { kwargs:{"property": false},args:["ob", "attr", "property"] }; @@ -1522,7 +1522,7 @@ getattr = function(args, kwargs) { } } ;getattr.is_wrapper = true; -setattr = function(args, kwargs) { +var setattr = function(args, kwargs) { var prop; var __sig__,__args__; __sig__ = { kwargs:{"property": false},args:["ob", "attr", "value", "property"] }; @@ -1549,7 +1549,7 @@ setattr = function(args, kwargs) { } } ;setattr.is_wrapper = true; -issubclass = function(args, kwargs) { +var issubclass = function(args, kwargs) { var i,bases; var __sig__,__args__; __sig__ = { kwargs:{},args:["C", "B"] }; @@ -1576,7 +1576,7 @@ issubclass = function(args, kwargs) { return false; } ;issubclass.is_wrapper = true; -isinstance = function(args, kwargs) { +var isinstance = function(args, kwargs) { var ob_class; var __sig__,__args__; __sig__ = { kwargs:{},args:["ob", "klass"] }; @@ -1608,7 +1608,7 @@ isinstance = function(args, kwargs) { } } ;isinstance.is_wrapper = true; -int = function(args, kwargs) { +var int = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; @@ -1627,14 +1627,14 @@ int = function(args, kwargs) { return a; } ;int.is_wrapper = true; -int16 = function(a) { +var int16 = function(a) { var arr; arr = new Int16Array(1); arr[0] = a; return arr; } -float = function(args, kwargs) { +var float = function(args, kwargs) { var b; var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; @@ -1662,7 +1662,7 @@ float = function(args, kwargs) { return b; } ;float.is_wrapper = true; -round = function(args, kwargs) { +var round = function(args, kwargs) { var y,x,c,b; var __sig__,__args__; __sig__ = { kwargs:{},args:["a", "places"] }; @@ -1686,7 +1686,7 @@ round = function(args, kwargs) { } } ;round.is_wrapper = true; -str = function(args, kwargs) { +var str = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["s"] }; @@ -1701,7 +1701,7 @@ str = function(args, kwargs) { return ("" + s); } ;str.is_wrapper = true; -_setup_str_prototype = function(args, kwargs) { +var _setup_str_prototype = function(args, kwargs) { "\n Extend JavaScript String.prototype with methods that implement the Python str API.\n The decorator @String.prototype.[name] assigns the function to the prototype,\n and ensures that the special 'this' variable will work.\n "; var func = function(a) { @@ -1906,7 +1906,7 @@ _setup_str_prototype = function(args, kwargs) { } ;_setup_str_prototype.is_wrapper = true; _setup_str_prototype(); -__sort_method = function(ob) { +var __sort_method = function(ob) { if (__test_if_true__(ob instanceof Array)) { var f = function(a, b) { @@ -1928,7 +1928,7 @@ __sort_method = function(ob) { } } -_setup_array_prototype = function(args, kwargs) { +var _setup_array_prototype = function(args, kwargs) { var func = function() { var i,item; @@ -2181,7 +2181,7 @@ _setup_array_prototype = function(args, kwargs) { } ;_setup_array_prototype.is_wrapper = true; _setup_array_prototype(); -_setup_nodelist_prototype = function(args, kwargs) { +var _setup_nodelist_prototype = function(args, kwargs) { var func = function(a) { @@ -2240,7 +2240,7 @@ _setup_nodelist_prototype = function(args, kwargs) { if (__test_if_true__(( __NODEJS__ ) == false && ( __WEBWORKER__ ) == false)) { _setup_nodelist_prototype(); } -bisect = function(args, kwargs) { +var bisect = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{"low": null, "high": null},args:["a", "x", "low", "high"] }; @@ -2258,7 +2258,7 @@ bisect = function(args, kwargs) { return a.bisect(x, low, high); } ;bisect.is_wrapper = true; -range = function(args, kwargs) { +var range = function(args, kwargs) { var i,arr; var __sig__,__args__; __sig__ = { kwargs:{},args:["num", "stop", "step"] }; @@ -2290,7 +2290,7 @@ range = function(args, kwargs) { return arr; } ;range.is_wrapper = true; -xrange = function(args, kwargs) { +var xrange = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["num", "stop", "step"] }; @@ -2307,7 +2307,7 @@ xrange = function(args, kwargs) { return range([num, stop, step], __NULL_OBJECT__); } ;xrange.is_wrapper = true; -sum = function(args, kwargs) { +var sum = function(args, kwargs) { var a; var __sig__,__args__; __sig__ = { kwargs:{},args:["arr"] }; @@ -2336,7 +2336,7 @@ __StopIteration_attrs = {}; __StopIteration_parents = []; __StopIteration_properties = {}; StopIteration = __create_class__("StopIteration", __StopIteration_parents, __StopIteration_attrs, __StopIteration_properties); -len = function(args, kwargs) { +var len = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["ob"] }; @@ -2367,7 +2367,7 @@ len = function(args, kwargs) { } } ;len.is_wrapper = true; -next = function(args, kwargs) { +var next = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["obj"] }; @@ -2382,7 +2382,7 @@ next = function(args, kwargs) { return __get__(__get__(obj, "next", "missing attribute `next` - line 1063: return obj.next()"), "__call__")(); } ;next.is_wrapper = true; -map = function(args, kwargs) { +var map = function(args, kwargs) { var arr,v; var __sig__,__args__; __sig__ = { kwargs:{},args:["func", "objs"] }; @@ -2408,7 +2408,7 @@ map = function(args, kwargs) { return arr; } ;map.is_wrapper = true; -filter = function(args, kwargs) { +var filter = function(args, kwargs) { var arr; var __sig__,__args__; __sig__ = { kwargs:{},args:["func", "objs"] }; @@ -2435,7 +2435,7 @@ filter = function(args, kwargs) { return arr; } ;filter.is_wrapper = true; -min = function(args, kwargs) { +var min = function(args, kwargs) { var a; var __sig__,__args__; __sig__ = { kwargs:{},args:["lst"] }; @@ -2465,7 +2465,7 @@ min = function(args, kwargs) { return a; } ;min.is_wrapper = true; -max = function(args, kwargs) { +var max = function(args, kwargs) { var a; var __sig__,__args__; __sig__ = { kwargs:{},args:["lst"] }; @@ -2495,7 +2495,7 @@ max = function(args, kwargs) { return a; } ;max.is_wrapper = true; -abs = function(args, kwargs) { +var abs = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["num"] }; @@ -2510,7 +2510,7 @@ abs = function(args, kwargs) { return Math.abs(num); } ;abs.is_wrapper = true; -ord = function(args, kwargs) { +var ord = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["char"] }; @@ -2525,7 +2525,7 @@ ord = function(args, kwargs) { return char.charCodeAt(0); } ;ord.is_wrapper = true; -chr = function(args, kwargs) { +var chr = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["num"] }; @@ -2540,7 +2540,7 @@ chr = function(args, kwargs) { return String.fromCharCode(num); } ;chr.is_wrapper = true; -__ArrayIterator = function(arr, index) { +var __ArrayIterator = function(arr, index) { __ArrayIterator.__init__(this, arr, index); this.__class__ = __ArrayIterator; this.__uid__ = ("" + _PythonJS_UID); @@ -2572,7 +2572,7 @@ var Iterator,__Iterator_attrs,__Iterator_parents; __Iterator_attrs = {}; __Iterator_parents = []; __Iterator_properties = {}; -__Iterator___init__ = function(args, kwargs) { +var __Iterator___init__ = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "obj", "index"] }; @@ -2593,7 +2593,7 @@ __Iterator___init__ = function(args, kwargs) { } ;__Iterator___init__.is_wrapper = true; __Iterator_attrs.__init__ = __Iterator___init__; -__Iterator_next = function(args, kwargs) { +var __Iterator_next = function(args, kwargs) { var index; var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2612,7 +2612,7 @@ __Iterator_next = function(args, kwargs) { ;__Iterator_next.is_wrapper = true; __Iterator_attrs.next = __Iterator_next; Iterator = __create_class__("Iterator", __Iterator_parents, __Iterator_attrs, __Iterator_properties); -tuple = function(args, kwargs) { +var tuple = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; @@ -2641,7 +2641,7 @@ tuple = function(args, kwargs) { } } ;tuple.is_wrapper = true; -list = function(args, kwargs) { +var list = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; @@ -2674,7 +2674,7 @@ var dict,__dict_attrs,__dict_parents; __dict_attrs = {}; __dict_parents = []; __dict_properties = {}; -__dict___init__ = function(args, kwargs) { +var __dict___init__ = function(args, kwargs) { var ob,value; var __sig__,__args__; __sig__ = { kwargs:{"js_object": null, "pointer": null},args:["self", "js_object", "pointer"] }; @@ -2728,7 +2728,7 @@ __dict___init__ = function(args, kwargs) { } ;__dict___init__.is_wrapper = true; __dict_attrs.__init__ = __dict___init__; -__dict_jsify = function(args, kwargs) { +var __dict_jsify = function(args, kwargs) { var keys,value; var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2762,7 +2762,7 @@ __dict_jsify = function(args, kwargs) { } ;__dict_jsify.is_wrapper = true; __dict_attrs.jsify = __dict_jsify; -__dict_copy = function(args, kwargs) { +var __dict_copy = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2778,7 +2778,7 @@ __dict_copy = function(args, kwargs) { } ;__dict_copy.is_wrapper = true; __dict_attrs.copy = __dict_copy; -__dict_clear = function(args, kwargs) { +var __dict_clear = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2794,7 +2794,7 @@ __dict_clear = function(args, kwargs) { } ;__dict_clear.is_wrapper = true; __dict_attrs.clear = __dict_clear; -__dict_has_key = function(args, kwargs) { +var __dict_has_key = function(args, kwargs) { var __dict; var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "key"] }; @@ -2819,7 +2819,7 @@ __dict_has_key = function(args, kwargs) { } ;__dict_has_key.is_wrapper = true; __dict_attrs.has_key = __dict_has_key; -__dict_update = function(args, kwargs) { +var __dict_update = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "other"] }; @@ -2843,7 +2843,7 @@ __dict_update = function(args, kwargs) { } ;__dict_update.is_wrapper = true; __dict_attrs.update = __dict_update; -__dict_items = function(args, kwargs) { +var __dict_items = function(args, kwargs) { var arr; var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2868,7 +2868,7 @@ __dict_items = function(args, kwargs) { } ;__dict_items.is_wrapper = true; __dict_attrs.items = __dict_items; -__dict_get = function(args, kwargs) { +var __dict_get = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{"_default": null},args:["self", "key", "_default"] }; @@ -2891,7 +2891,7 @@ return _default; } ;__dict_get.is_wrapper = true; __dict_attrs.get = __dict_get; -__dict_set = function(args, kwargs) { +var __dict_set = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "key", "value"] }; @@ -2909,7 +2909,7 @@ __dict_set = function(args, kwargs) { } ;__dict_set.is_wrapper = true; __dict_attrs.set = __dict_set; -__dict___len__ = function(args, kwargs) { +var __dict___len__ = function(args, kwargs) { var __dict; var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2926,7 +2926,7 @@ __dict___len__ = function(args, kwargs) { } ;__dict___len__.is_wrapper = true; __dict_attrs.__len__ = __dict___len__; -__dict___getitem__ = function(args, kwargs) { +var __dict___getitem__ = function(args, kwargs) { var __dict; var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "key"] }; @@ -2941,11 +2941,15 @@ __dict___getitem__ = function(args, kwargs) { var key = __args__['key']; "\n notes:\n . '4' and 4 are the same key\n . it is possible that the translator mistakes a javascript-object for a dict and inlines this function,\n that is why below we return the key in self if __dict is undefined.\n "; __dict = self["$wrapped"]; - if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - if (__test_if_true__(key.__uid__ && key.__uid__ in __dict)) { - return __dict[key.__uid__]; + if (__test_if_true__(key instanceof Array)) { + return __dict[key]; + } else { + if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { + if (__test_if_true__(key.__uid__ && key.__uid__ in __dict)) { + return __dict[key.__uid__]; + } + throw new KeyError(key); } - throw new KeyError(key); } if (__test_if_true__(__dict && key in __dict)) { return __dict[key]; @@ -2954,7 +2958,7 @@ __dict___getitem__ = function(args, kwargs) { } ;__dict___getitem__.is_wrapper = true; __dict_attrs.__getitem__ = __dict___getitem__; -__dict___setitem__ = function(args, kwargs) { +var __dict___setitem__ = function(args, kwargs) { var __dict; var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "key", "value"] }; @@ -2969,18 +2973,22 @@ __dict___setitem__ = function(args, kwargs) { var key = __args__['key']; var value = __args__['value']; __dict = self["$wrapped"]; - if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - if (__test_if_true__(key.__uid__ === undefined)) { - key.__uid__ = '' + _PythonJS_UID++; - } - __dict[key.__uid__] = value; - } else { + if (__test_if_true__(key instanceof Array)) { __dict[key] = value; + } else { + if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { + if (__test_if_true__(key.__uid__ === undefined)) { + key.__uid__ = '' + _PythonJS_UID++; + } + __dict[key.__uid__] = value; + } else { + __dict[key] = value; + } } } ;__dict___setitem__.is_wrapper = true; __dict_attrs.__setitem__ = __dict___setitem__; -__dict_keys = function(args, kwargs) { +var __dict_keys = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -2996,7 +3004,7 @@ __dict_keys = function(args, kwargs) { } ;__dict_keys.is_wrapper = true; __dict_attrs.keys = __dict_keys; -__dict_pop = function(args, kwargs) { +var __dict_pop = function(args, kwargs) { var js_object,v; var __sig__,__args__; __sig__ = { kwargs:{"d": null},args:["self", "key", "d"] }; @@ -3021,7 +3029,7 @@ __dict_pop = function(args, kwargs) { } ;__dict_pop.is_wrapper = true; __dict_attrs.pop = __dict_pop; -__dict_values = function(args, kwargs) { +var __dict_values = function(args, kwargs) { var keys,out; var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3045,7 +3053,7 @@ __dict_values = function(args, kwargs) { } ;__dict_values.is_wrapper = true; __dict_attrs.values = __dict_values; -__dict___contains__ = function(args, kwargs) { +var __dict___contains__ = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "value"] }; @@ -3068,7 +3076,7 @@ return false; } ;__dict___contains__.is_wrapper = true; __dict_attrs.__contains__ = __dict___contains__; -__dict___iter__ = function(args, kwargs) { +var __dict___iter__ = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3085,7 +3093,7 @@ __dict___iter__ = function(args, kwargs) { ;__dict___iter__.is_wrapper = true; __dict_attrs.__iter__ = __dict___iter__; dict = __create_class__("dict", __dict_parents, __dict_attrs, __dict_properties); -set = function(args, kwargs) { +var set = function(args, kwargs) { var keys,mask,s,hashtable,key,fallback; var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; @@ -3160,7 +3168,7 @@ set = function(args, kwargs) { return s; } ;set.is_wrapper = true; -frozenset = function(args, kwargs) { +var frozenset = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["a"] }; @@ -3183,7 +3191,7 @@ __array_typecodes = __jsdict([["c", 1], ["b", 1], ["B", 1], ["u", 2], ["h", 2], __array_attrs.typecodes = __array_typecodes; __array_typecode_names = __jsdict([["c", "Int8"], ["b", "Int8"], ["B", "Uint8"], ["u", "Uint16"], ["h", "Int16"], ["H", "Uint16"], ["i", "Int32"], ["I", "Uint32"], ["f", "Float32"], ["d", "Float64"], ["float32", "Float32"], ["float16", "Int16"], ["float8", "Int8"], ["int32", "Int32"], ["uint32", "Uint32"], ["int16", "Int16"], ["uint16", "Uint16"], ["int8", "Int8"], ["uint8", "Uint8"]]); __array_attrs.typecode_names = __array_typecode_names; -__array___init__ = function(args, kwargs) { +var __array___init__ = function(args, kwargs) { var size,buff; var __sig__,__args__; __sig__ = { kwargs:{"initializer": null, "little_endian": false},args:["self", "typecode", "initializer", "little_endian"] }; @@ -3199,7 +3207,7 @@ __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1376: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1376: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1380: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1380: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3223,11 +3231,11 @@ __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1397: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1401: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; -__array___len__ = function(args, kwargs) { +var __array___len__ = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3243,7 +3251,7 @@ __array___len__ = function(args, kwargs) { } ;__array___len__.is_wrapper = true; __array_attrs.__len__ = __array___len__; -__array___contains__ = function(args, kwargs) { +var __array___contains__ = function(args, kwargs) { var arr; var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "value"] }; @@ -3256,7 +3264,7 @@ __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1403: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1407: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3265,7 +3273,7 @@ __array___contains__ = function(args, kwargs) { } ;__array___contains__.is_wrapper = true; __array_attrs.__contains__ = __array___contains__; -__array___getitem__ = function(args, kwargs) { +var __array___getitem__ = function(args, kwargs) { var func_name,dataview,value,step,func,offset; var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "index"] }; @@ -3281,7 +3289,7 @@ __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1411: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1411: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1415: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1415: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3299,7 +3307,7 @@ __array___getitem__ = function(args, kwargs) { } ;__array___getitem__.is_wrapper = true; __array_attrs.__getitem__ = __array___getitem__; -__array___setitem__ = function(args, kwargs) { +var __array___setitem__ = function(args, kwargs) { var func_name,dataview,step,func,offset; var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "index", "value"] }; @@ -3319,7 +3327,7 @@ __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1427: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1427: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1431: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1431: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3336,7 +3344,7 @@ __array___setitem__ = function(args, kwargs) { } ;__array___setitem__.is_wrapper = true; __array_attrs.__setitem__ = __array___setitem__; -__array___iter__ = function(args, kwargs) { +var __array___iter__ = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3352,7 +3360,7 @@ __array___iter__ = function(args, kwargs) { } ;__array___iter__.is_wrapper = true; __array_attrs.__iter__ = __array___iter__; -__array_get = function(args, kwargs) { +var __array_get = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "index"] }; @@ -3369,7 +3377,7 @@ __array_get = function(args, kwargs) { } ;__array_get.is_wrapper = true; __array_attrs.get = __array_get; -__array_fromlist = function(args, kwargs) { +var __array_fromlist = function(args, kwargs) { var typecode,i,func_name,dataview,length,item,step,func,offset,size; var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "lst"] }; @@ -3387,13 +3395,13 @@ __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1447: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1447: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1451: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1451: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1452: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1456: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3411,7 +3419,7 @@ __array_fromlist = function(args, kwargs) { } ;__array_fromlist.is_wrapper = true; __array_attrs.fromlist = __array_fromlist; -__array_resize = function(args, kwargs) { +var __array_resize = function(args, kwargs) { var source,new_buff,target,new_size,buff; var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "length"] }; @@ -3437,7 +3445,7 @@ __array_resize = function(args, kwargs) { } ;__array_resize.is_wrapper = true; __array_attrs.resize = __array_resize; -__array_append = function(args, kwargs) { +var __array_append = function(args, kwargs) { var length; var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "value"] }; @@ -3451,12 +3459,12 @@ __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1475: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1479: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; __array_attrs.append = __array_append; -__array_extend = function(args, kwargs) { +var __array_extend = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "lst"] }; @@ -3470,17 +3478,17 @@ __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1478: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1482: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1479: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1483: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; __array_attrs.extend = __array_extend; -__array_to_array = function(args, kwargs) { +var __array_to_array = function(args, kwargs) { var i,item,arr; var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3503,7 +3511,7 @@ __array_to_array = function(args, kwargs) { } ;__array_to_array.is_wrapper = true; __array_attrs.to_array = __array_to_array; -__array_to_list = function(args, kwargs) { +var __array_to_list = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3515,11 +3523,11 @@ __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1489: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1493: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; -__array_to_ascii = function(args, kwargs) { +var __array_to_ascii = function(args, kwargs) { var i,length,arr,string; var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3532,9 +3540,9 @@ __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1492: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1496: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1493: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1497: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3550,7 +3558,7 @@ var file,__file_attrs,__file_parents; __file_attrs = {}; __file_parents = []; __file_properties = {}; -__file___init__ = function(args, kwargs) { +var __file___init__ = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "path", "flags"] }; @@ -3581,7 +3589,7 @@ __file___init__ = function(args, kwargs) { } ;__file___init__.is_wrapper = true; __file_attrs.__init__ = __file___init__; -__file_read = function(args, kwargs) { +var __file_read = function(args, kwargs) { var _fs,path; var __sig__,__args__; __sig__ = { kwargs:{"binary": false},args:["self", "binary"] }; @@ -3604,7 +3612,7 @@ __file_read = function(args, kwargs) { } ;__file_read.is_wrapper = true; __file_attrs.read = __file_read; -__file_write = function(args, kwargs) { +var __file_write = function(args, kwargs) { var _fs,path; var __sig__,__args__; __sig__ = { kwargs:{"binary": false},args:["self", "data", "binary"] }; @@ -3628,7 +3636,7 @@ __file_write = function(args, kwargs) { } ;__file_write.is_wrapper = true; __file_attrs.write = __file_write; -__file_close = function(args, kwargs) { +var __file_close = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{},args:["self"] }; @@ -3645,7 +3653,7 @@ __file_close = function(args, kwargs) { ;__file_close.is_wrapper = true; __file_attrs.close = __file_close; file = __create_class__("file", __file_parents, __file_attrs, __file_properties); -__open__ = function(args, kwargs) { +var __open__ = function(args, kwargs) { var __sig__,__args__; __sig__ = { kwargs:{"mode": null},args:["path", "mode"] }; @@ -3662,7 +3670,7 @@ __open__ = function(args, kwargs) { } ;__open__.is_wrapper = true; json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (function (o) {return JSON.stringify(o);})]]); -__get_other_workers_with_shared_arg = function(worker, ob) { +var __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; var __iter38 = threading.workers; @@ -3688,7 +3696,7 @@ __get_other_workers_with_shared_arg = function(worker, ob) { } threading = __jsdict([["workers", []], ["_blocking_callback", null]]); -__start_new_thread = function(f, args) { +var __start_new_thread = function(f, args) { var jsargs,worker; worker = new Worker(f); worker.__uid__ = len(threading.workers); @@ -3758,7 +3766,7 @@ __start_new_thread = function(f, args) { return worker; } -__gen_worker_append = function(worker, ob, index) { +var __gen_worker_append = function(worker, ob, index) { var append = function(item) { @@ -3769,7 +3777,7 @@ __gen_worker_append = function(worker, ob, index) { Object.defineProperty(ob, "append", __jsdict([["enumerable", false], ["value", append], ["writeable", true], ["configurable", true]])); } -__webworker_wrap = function(ob, argindex) { +var __webworker_wrap = function(ob, argindex) { if (__test_if_true__(ob instanceof Array)) { var func = function(index, item) { @@ -3800,7 +3808,7 @@ __webworker_wrap = function(ob, argindex) { return ob; } -__rpc__ = function(url, func, args) { +var __rpc__ = function(url, func, args) { var req; req = new XMLHttpRequest(); req.open("POST", url, false); @@ -3809,7 +3817,7 @@ __rpc__ = function(url, func, args) { return JSON.parse(req.responseText); } -__rpc_iter__ = function(url, attr) { +var __rpc_iter__ = function(url, attr) { var req; req = new XMLHttpRequest(); req.open("POST", url, false); @@ -3818,7 +3826,7 @@ __rpc_iter__ = function(url, attr) { return JSON.parse(req.responseText); } -__rpc_set__ = function(url, attr, value) { +var __rpc_set__ = function(url, attr, value) { var req; req = new XMLHttpRequest(); req.open("POST", url, false); @@ -3826,7 +3834,7 @@ __rpc_set__ = function(url, attr, value) { req.send(JSON.stringify(__jsdict([["set", attr], ["value", value]]))); } -__rpc_get__ = function(url, attr) { +var __rpc_get__ = function(url, attr) { var req; req = new XMLHttpRequest(); req.open("POST", url, false); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 60a4980..68f356f 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -9,11 +9,11 @@ _PythonJS_UID = 0 -JS('IndexError = function(msg) {this.message = msg || "";}; IndexError.prototype = Object.create(Error.prototype); IndexError.prototype.name = "IndexError";') -JS('KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Object.create(Error.prototype); KeyError.prototype.name = "KeyError";') -JS('ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError";') -JS('AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError";') -JS('RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError";') +inline('IndexError = function(msg) {this.message = msg || "";}; IndexError.prototype = Object.create(Error.prototype); IndexError.prototype.name = "IndexError";') +inline('KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Object.create(Error.prototype); KeyError.prototype.name = "KeyError";') +inline('ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError";') +inline('AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError";') +inline('RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError";') with javascript: def __gpu_object(cls, struct_name, data_name): @@ -1451,7 +1451,9 @@ def __getitem__(self, key): that is why below we return the key in self if __dict is undefined. ''' __dict = self[...] - if JS("typeof(key) === 'object' || typeof(key) === 'function'"): + if instanceof(key, Array): + return inline('__dict[key]') + elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): # Test undefined because it can be in the dict if JS("key.__uid__ && key.__uid__ in __dict"): return JS('__dict[key.__uid__]') @@ -1466,7 +1468,9 @@ def __getitem__(self, key): def __setitem__(self, key, value): __dict = self[...] - if JS("typeof(key) === 'object' || typeof(key) === 'function'"): + if instanceof(key, Array): ## using an Array as key converts it to a string + inline( '__dict[key] = value') + elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): if JS("key.__uid__ === undefined"): # "" is needed so that integers can also be # used as keys diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index b885edd..a2d42df 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -51,14 +51,23 @@ def transform_source( source, strip=False ): a.append( char ) else: a.append( char ) + if not a: continue + + if a[-1]==';': a.pop() c = ''.join(a) cs = c.strip() + if cs.startswith('//'): continue + elif cs.startswith('inline('): + output.append(c) + continue + + if cs.startswith('var '): c = c.replace('var ', '') From c14718ae8cb5b03c194b93980f2012157ca68f09 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 23 Jul 2014 20:53:36 -0700 Subject: [PATCH 158/222] tuple dict keys: fixed string vs numeric tuple elements in normal mode. --- README.md | 22 +++++++++++++++++++++- pythonjs/pythonjs.js | 32 +++++++++++++++++++------------- pythonjs/runtime/builtins.py | 9 ++++++++- regtests/dict/tuple_keys.py | 6 +++++- 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index ee42959..d841b1c 100644 --- a/README.md +++ b/README.md @@ -440,4 +440,24 @@ d = "HI" * 2 ## FAILS 3. The syntax `from mymodule import *` allows you to import another python script from the same folder, but both mymodule and the parent will share the same namespace, mymodule can use global variables defined in the parent. - +4. Using tuples as keys in a dict in javascript mode breaks with strings that are numbers +``` +pythonjs.configure( javascript=True ) +a = (1,2,3) +b = ("1","2","3") +D = { a: 'hello', b: 'world' } +D[ a ] == 'hello' ## FAILS +D[ b ] == 'world' ## OK +``` +The example above works in the default Python mode, because when using a tuple as a key, its first item will be checked if it is a string, and if so then generate a key that is +different from a tuple of numeric elements. This logic assumes that all following keys +are also strings, so the following breaks even in the default Python mode, because all +the items in `b` are treated as strings and `a` contains the same values as strings. + +``` +a = ("1", "2", "3") +b = ("1", 2, 3) +D = {a:100, b:200} +D[ a ] == 100 ## FAILS - value is 200 +D[ b ] == 200 ## OK +``` \ No newline at end of file diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 2a4317a..4ead326 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -2942,6 +2942,9 @@ var __dict___getitem__ = function(args, kwargs) { "\n notes:\n . '4' and 4 are the same key\n . it is possible that the translator mistakes a javascript-object for a dict and inlines this function,\n that is why below we return the key in self if __dict is undefined.\n "; __dict = self["$wrapped"]; if (__test_if_true__(key instanceof Array)) { + if (__test_if_true__(( __get__(key, "length", "missing attribute `length` - line 1221: if key.length > 0 and typeof( key[0] ) == 'string':") ) > 0 && ( typeof(((key instanceof Array) ? key[0] : __get__(key, "__getitem__", "line 1221: if key.length > 0 and typeof( key[0] ) == 'string':")([0], __NULL_OBJECT__))) ) == "string")) { + key = (("'" + __get__(__get__(key, "join", "missing attribute `join` - line 1222: key = \"'\" + key.join(\"'\") + \"'\""), "__call__")(["'"], __NULL_OBJECT__)) + "'"); + } return __dict[key]; } else { if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { @@ -2974,6 +2977,9 @@ var __dict___setitem__ = function(args, kwargs) { var value = __args__['value']; __dict = self["$wrapped"]; if (__test_if_true__(key instanceof Array)) { + if (__test_if_true__(( __get__(key, "length", "missing attribute `length` - line 1240: if key.length > 0 and typeof( key[0] ) == 'string':") ) > 0 && ( typeof(((key instanceof Array) ? key[0] : __get__(key, "__getitem__", "line 1240: if key.length > 0 and typeof( key[0] ) == 'string':")([0], __NULL_OBJECT__))) ) == "string")) { + key = (("'" + __get__(__get__(key, "join", "missing attribute `join` - line 1241: key = \"'\" + key.join(\"'\") + \"'\""), "__call__")(["'"], __NULL_OBJECT__)) + "'"); + } __dict[key] = value; } else { if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { @@ -3207,7 +3213,7 @@ var __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1380: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1380: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1387: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1387: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3231,7 +3237,7 @@ var __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1401: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1408: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; @@ -3264,7 +3270,7 @@ var __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1407: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1414: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3289,7 +3295,7 @@ var __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1415: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1415: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1422: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1422: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3327,7 +3333,7 @@ var __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1431: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1431: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1438: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1438: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3395,13 +3401,13 @@ var __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1451: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1451: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1458: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1458: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1456: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1463: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3459,7 +3465,7 @@ var __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1479: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1486: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; @@ -3478,12 +3484,12 @@ var __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1482: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1489: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1483: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1490: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; @@ -3523,7 +3529,7 @@ var __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1493: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1500: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; @@ -3540,9 +3546,9 @@ var __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1496: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1503: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1497: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1504: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 68f356f..94b7175 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -1452,6 +1452,8 @@ def __getitem__(self, key): ''' __dict = self[...] if instanceof(key, Array): + if key.length > 0 and typeof( key[0] ) == 'string': + key = "'" + key.join("'") + "'" return inline('__dict[key]') elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): # Test undefined because it can be in the dict @@ -1468,7 +1470,12 @@ def __getitem__(self, key): def __setitem__(self, key, value): __dict = self[...] - if instanceof(key, Array): ## using an Array as key converts it to a string + if instanceof(key, Array): + ## using an Array as key converts it to a string + ## check first item of array, if it is a string, the items must be quoted + ## so that numeric and string items are different. + if key.length > 0 and typeof( key[0] ) == 'string': + key = "'" + key.join("'") + "'" inline( '__dict[key] = value') elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): if JS("key.__uid__ === undefined"): diff --git a/regtests/dict/tuple_keys.py b/regtests/dict/tuple_keys.py index 6767983..02a734a 100644 --- a/regtests/dict/tuple_keys.py +++ b/regtests/dict/tuple_keys.py @@ -2,11 +2,15 @@ def main(): + s = ("1", "2", "3") a = (1,2,3) b = (1,2,3) c = ( a, b, 'XXX' ) + d = ('1', 2, 3) - D = { a: 22, c:44 } + D = { d:100, s: 11, a: 22, c:44 } + TestError( D[ d ] == 100) ## this fails in both python and javascript mode + TestError( D[ s ] == 11) ## this fails in javascript mode TestError( D[ a ] == 22) TestError( D[ b ] == 22) TestError( D[ c ] == 44) From c1d8306fc5d61a65b2432c130ffa4f0e92b43f98 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 23 Jul 2014 22:54:21 -0700 Subject: [PATCH 159/222] fixed tuple key in dict where tuple has mixed strings and numbers of the same value (JSON.stringify trick) --- pythonjs/pythonjs.js | 87 ++++++++++++++++++------------------ pythonjs/runtime/builtins.py | 22 +++++++-- 2 files changed, 62 insertions(+), 47 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 4ead326..c7c1c5e 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -918,6 +918,11 @@ GLSLJITRuntime.prototype.unpack_mat4 = function(arr) { GLSLJITRuntime.unpack_mat4 = function () { return GLSLJITRuntime.prototype.unpack_mat4.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.__properties__ = { }; GLSLJITRuntime.prototype.__unbound_methods__ = { }; +var __tuple_key__ = function(arr) { + + return JSON.stringify(arr); +} +;__tuple_key__.is_wrapper = true; var __getattr__ = function(ob, a) { if (ob.__getattr__) { @@ -1567,8 +1572,8 @@ var issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 636: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 637: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 648: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 649: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2321,7 +2326,7 @@ var sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__40; - __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1045: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1057: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2379,7 +2384,7 @@ var next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1063: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1075: return obj.next()"), "__call__")(); } ;next.is_wrapper = true; var map = function(args, kwargs) { @@ -2397,7 +2402,7 @@ var map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__41; - __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1066: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1078: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { @@ -2423,7 +2428,7 @@ var filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__42; - __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1073: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1085: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { @@ -2449,7 +2454,7 @@ var min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__43; - __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1080: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1092: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { @@ -2479,7 +2484,7 @@ var max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__44; - __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1086: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1098: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { @@ -2589,7 +2594,7 @@ var __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1114: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1126: self.obj_get = obj.get ## cache this for speed"); } ;__Iterator___init__.is_wrapper = true; __Iterator_attrs.__init__ = __Iterator___init__; @@ -2696,27 +2701,27 @@ var __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__45; - __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1157: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1169: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { o = __next__45(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1159: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1159: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1159: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1171: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1171: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1171: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1161: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1161: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1161: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1173: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1173: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1173: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__46; - __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1163: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1175: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1164: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1165: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1176: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1177: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2742,15 +2747,15 @@ var __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__47; - __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1172: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1184: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - value = __get__(self["$wrapped"], "__getitem__", "line 1173: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1185: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1176: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1188: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2809,7 +2814,7 @@ var __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1189: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1201: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2833,12 +2838,12 @@ var __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__48; - __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1195: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1207: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1196: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1196: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1208: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1208: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } ;__dict_update.is_wrapper = true; @@ -2857,12 +2862,12 @@ var __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__49; - __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1199: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1211: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__49; __next__49 = __get__(__iterator__49, "next"); while (( __iterator__49.index ) < __iterator__49.length) { key = __next__49(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1200: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1212: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2905,7 +2910,7 @@ var __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1208: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1220: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } ;__dict_set.is_wrapper = true; __dict_attrs.set = __dict_set; @@ -2942,9 +2947,7 @@ var __dict___getitem__ = function(args, kwargs) { "\n notes:\n . '4' and 4 are the same key\n . it is possible that the translator mistakes a javascript-object for a dict and inlines this function,\n that is why below we return the key in self if __dict is undefined.\n "; __dict = self["$wrapped"]; if (__test_if_true__(key instanceof Array)) { - if (__test_if_true__(( __get__(key, "length", "missing attribute `length` - line 1221: if key.length > 0 and typeof( key[0] ) == 'string':") ) > 0 && ( typeof(((key instanceof Array) ? key[0] : __get__(key, "__getitem__", "line 1221: if key.length > 0 and typeof( key[0] ) == 'string':")([0], __NULL_OBJECT__))) ) == "string")) { - key = (("'" + __get__(__get__(key, "join", "missing attribute `join` - line 1222: key = \"'\" + key.join(\"'\") + \"'\""), "__call__")(["'"], __NULL_OBJECT__)) + "'"); - } + key = __get__(__get__(JSON, "stringify", "missing attribute `stringify` - line 1235: key = JSON.stringify( key )"), "__call__")([key], __NULL_OBJECT__); return __dict[key]; } else { if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { @@ -2977,9 +2980,7 @@ var __dict___setitem__ = function(args, kwargs) { var value = __args__['value']; __dict = self["$wrapped"]; if (__test_if_true__(key instanceof Array)) { - if (__test_if_true__(( __get__(key, "length", "missing attribute `length` - line 1240: if key.length > 0 and typeof( key[0] ) == 'string':") ) > 0 && ( typeof(((key instanceof Array) ? key[0] : __get__(key, "__getitem__", "line 1240: if key.length > 0 and typeof( key[0] ) == 'string':")([0], __NULL_OBJECT__))) ) == "string")) { - key = (("'" + __get__(__get__(key, "join", "missing attribute `join` - line 1241: key = \"'\" + key.join(\"'\") + \"'\""), "__call__")(["'"], __NULL_OBJECT__)) + "'"); - } + key = __get__(__get__(JSON, "stringify", "missing attribute `stringify` - line 1255: key = JSON.stringify( key )"), "__call__")([key], __NULL_OBJECT__); __dict[key] = value; } else { if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { @@ -3213,7 +3214,7 @@ var __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1387: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1387: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1401: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1401: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3237,7 +3238,7 @@ var __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1408: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1422: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; @@ -3270,7 +3271,7 @@ var __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1414: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1428: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3295,7 +3296,7 @@ var __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1422: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1422: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1436: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1436: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3333,7 +3334,7 @@ var __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1438: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1438: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1452: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1452: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3401,13 +3402,13 @@ var __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1458: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1458: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1472: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1472: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1463: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1477: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3465,7 +3466,7 @@ var __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1486: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1500: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; @@ -3484,12 +3485,12 @@ var __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1489: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1503: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1490: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1504: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; @@ -3529,7 +3530,7 @@ var __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1500: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1514: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; @@ -3546,9 +3547,9 @@ var __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1503: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1517: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1504: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1518: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 94b7175..087fb51 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -319,6 +319,18 @@ def unpack_mat4(self, arr): return self.matrices with lowlevel: + def __tuple_key__(arr): + return JSON.stringify( arr ) ## this quotes strings, and should be fast + #r = [] + #i = 0 + #while i < arr.length: + # item = arr[i] + # t = typeof(item) + # if t=='string': + # r.append( "'"+item+"'") + # else: + # r.append( item ) + # i += 1 def __getattr__(ob, a ): if ob.__getattr__: @@ -1452,8 +1464,9 @@ def __getitem__(self, key): ''' __dict = self[...] if instanceof(key, Array): - if key.length > 0 and typeof( key[0] ) == 'string': - key = "'" + key.join("'") + "'" + #if key.length > 0 and typeof( key[0] ) == 'string': + # key = "'" + key.join("'") + "'" + key = JSON.stringify( key ) return inline('__dict[key]') elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): # Test undefined because it can be in the dict @@ -1474,8 +1487,9 @@ def __setitem__(self, key, value): ## using an Array as key converts it to a string ## check first item of array, if it is a string, the items must be quoted ## so that numeric and string items are different. - if key.length > 0 and typeof( key[0] ) == 'string': - key = "'" + key.join("'") + "'" + #if key.length > 0 and typeof( key[0] ) == 'string': + # key = "'" + key.join("'") + "'" + key = JSON.stringify( key ) inline( '__dict[key] = value') elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): if JS("key.__uid__ === undefined"): From 7b9341515838ff19e2e812f9dcafc27c166cd43e Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 23 Jul 2014 23:37:25 -0700 Subject: [PATCH 160/222] fixed tuple dict keys that mix numbers and strings in javascript mode. --- README.md | 20 ++----- pythonjs/python_to_pythonjs.py | 4 +- pythonjs/pythonjs.js | 95 +++++++++++++++++++--------------- pythonjs/runtime/builtins.py | 31 +++++------ 4 files changed, 73 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index d841b1c..e0fd80c 100644 --- a/README.md +++ b/README.md @@ -440,24 +440,12 @@ d = "HI" * 2 ## FAILS 3. The syntax `from mymodule import *` allows you to import another python script from the same folder, but both mymodule and the parent will share the same namespace, mymodule can use global variables defined in the parent. -4. Using tuples as keys in a dict in javascript mode breaks with strings that are numbers +4. Using tuples as keys in a dict is allowed, the tuple may contain other tuples, objects, and a mix of numbers or strings. +Note that tuples in PythonJS are actually JavaScript arrays, so if you modify the contents of the tuple, it would no +longer be the same key in a dict. ``` -pythonjs.configure( javascript=True ) a = (1,2,3) b = ("1","2","3") D = { a: 'hello', b: 'world' } -D[ a ] == 'hello' ## FAILS +D[ a ] == 'hello' ## OK D[ b ] == 'world' ## OK -``` -The example above works in the default Python mode, because when using a tuple as a key, its first item will be checked if it is a string, and if so then generate a key that is -different from a tuple of numeric elements. This logic assumes that all following keys -are also strings, so the following breaks even in the default Python mode, because all -the items in `b` are treated as strings and `a` contains the same values as strings. - -``` -a = ("1", "2", "3") -b = ("1", 2, 3) -D = {a:100, b:200} -D[ a ] == 100 ## FAILS - value is 200 -D[ b ] == 200 ## OK -``` \ No newline at end of file diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 619602d..5ac5d3a 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1633,7 +1633,9 @@ def visit_Subscript(self, node): else: ## ------------------ javascript mode ------------------------ s = self.visit(node.slice) - return '%s[ __ternary_operator__(%s.__uid__, %s) ]' %(name, s, s) + #return '%s[ __ternary_operator__(%s.__uid__, %s) ]' %(name, s, s) + check_array = '__ternary_operator__( instanceof(%s,Array), JSON.stringify(%s), %s )' %(s, s, s) + return '%s[ __ternary_operator__(%s.__uid__, %s) ]' %(name, s, check_array) elif isinstance(node.slice, ast.Slice): return '__get__(%s, "__getslice__")([%s], __NULL_OBJECT__)' % ( diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index c7c1c5e..f790a5d 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -1159,8 +1159,12 @@ var __jsdict = function(items) { for (var __idx16=0; __idx16 < __iter16.length; __idx16++) { var item = __iter16[ __idx16 ]; key = item[0]; - if (__test_if_true__(key.__uid__)) { - key = key.__uid__; + if (__test_if_true__(key instanceof Array)) { + key = JSON.stringify(key); + } else { + if (__test_if_true__(key.__uid__)) { + key = key.__uid__; + } } d[key] = item[1]; } @@ -1170,6 +1174,9 @@ var __jsdict = function(items) { var __jsdict_get = function(ob, key, default_value) { if (__test_if_true__(ob instanceof Object)) { + if (__test_if_true__(key instanceof Array)) { + key = JSON.stringify(key); + } if (__test_if_true__(key in ob)) { return ob[key]; } @@ -1186,6 +1193,9 @@ var __jsdict_get = function(ob, key, default_value) { var __jsdict_set = function(ob, key, value) { if (__test_if_true__(ob instanceof Object)) { + if (__test_if_true__(key instanceof Array)) { + key = JSON.stringify(key); + } ob[key] = value; } else { ob.set(key,value); @@ -1572,8 +1582,8 @@ var issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 648: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 649: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 657: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 658: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2326,7 +2336,7 @@ var sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__40; - __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1057: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1066: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2384,7 +2394,7 @@ var next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1075: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1084: return obj.next()"), "__call__")(); } ;next.is_wrapper = true; var map = function(args, kwargs) { @@ -2402,7 +2412,7 @@ var map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__41; - __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1078: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1087: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { @@ -2428,7 +2438,7 @@ var filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__42; - __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1085: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1094: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { @@ -2454,7 +2464,7 @@ var min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__43; - __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1092: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1101: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { @@ -2484,7 +2494,7 @@ var max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__44; - __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1098: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1107: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { @@ -2594,7 +2604,7 @@ var __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1126: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1135: self.obj_get = obj.get ## cache this for speed"); } ;__Iterator___init__.is_wrapper = true; __Iterator_attrs.__init__ = __Iterator___init__; @@ -2701,27 +2711,27 @@ var __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__45; - __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1169: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1178: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { o = __next__45(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1171: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1171: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1171: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1180: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1180: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1180: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1173: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1173: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1173: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1182: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1182: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1182: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__46; - __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1175: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1184: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1176: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1177: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1185: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1186: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2747,15 +2757,15 @@ var __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__47; - __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1184: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1193: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - value = __get__(self["$wrapped"], "__getitem__", "line 1185: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1194: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1188: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1197: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2814,7 +2824,7 @@ var __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1201: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1210: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2838,12 +2848,12 @@ var __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__48; - __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1207: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1216: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1208: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1208: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1217: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1217: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } ;__dict_update.is_wrapper = true; @@ -2862,12 +2872,12 @@ var __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__49; - __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1211: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1220: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__49; __next__49 = __get__(__iterator__49, "next"); while (( __iterator__49.index ) < __iterator__49.length) { key = __next__49(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1212: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1221: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2910,7 +2920,7 @@ var __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1220: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1229: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } ;__dict_set.is_wrapper = true; __dict_attrs.set = __dict_set; @@ -2944,11 +2954,10 @@ var __dict___getitem__ = function(args, kwargs) { __args__ = __getargs__("__dict___getitem__", __sig__, args, kwargs); var self = __args__['self']; var key = __args__['key']; - "\n notes:\n . '4' and 4 are the same key\n . it is possible that the translator mistakes a javascript-object for a dict and inlines this function,\n that is why below we return the key in self if __dict is undefined.\n "; + "\n note: `\"4\"` and `4` are the same key in javascript, is there a sane way to workaround this,\n that can remain compatible with external javascript?\n "; __dict = self["$wrapped"]; if (__test_if_true__(key instanceof Array)) { - key = __get__(__get__(JSON, "stringify", "missing attribute `stringify` - line 1235: key = JSON.stringify( key )"), "__call__")([key], __NULL_OBJECT__); - return __dict[key]; + key = __get__(__get__(JSON, "stringify", "missing attribute `stringify` - line 1240: key = JSON.stringify( key )"), "__call__")([key], __NULL_OBJECT__); } else { if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { if (__test_if_true__(key.__uid__ && key.__uid__ in __dict)) { @@ -2980,7 +2989,7 @@ var __dict___setitem__ = function(args, kwargs) { var value = __args__['value']; __dict = self["$wrapped"]; if (__test_if_true__(key instanceof Array)) { - key = __get__(__get__(JSON, "stringify", "missing attribute `stringify` - line 1255: key = JSON.stringify( key )"), "__call__")([key], __NULL_OBJECT__); + key = __get__(__get__(JSON, "stringify", "missing attribute `stringify` - line 1253: key = JSON.stringify( key )"), "__call__")([key], __NULL_OBJECT__); __dict[key] = value; } else { if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { @@ -3214,7 +3223,7 @@ var __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1401: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1401: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1398: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1398: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3238,7 +3247,7 @@ var __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1422: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1419: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; @@ -3271,7 +3280,7 @@ var __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1428: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1425: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3296,7 +3305,7 @@ var __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1436: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1436: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1433: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1433: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3334,7 +3343,7 @@ var __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1452: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1452: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1449: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1449: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3402,13 +3411,13 @@ var __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1472: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1472: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1469: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1469: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1477: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1474: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3466,7 +3475,7 @@ var __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1500: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1497: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; @@ -3485,12 +3494,12 @@ var __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1503: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1500: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1504: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1501: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; @@ -3530,7 +3539,7 @@ var __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1514: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1511: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; @@ -3547,9 +3556,9 @@ var __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1517: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1514: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1518: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1515: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 087fb51..42cadc8 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -482,13 +482,17 @@ def __jsdict( items ): d = JS("{}") for item in items: key = item[0] - if key.__uid__: + if instanceof(key, Array): + key = JSON.stringify(key) + elif key.__uid__: key = key.__uid__ d[ key ] = item[1] return d def __jsdict_get(ob, key, default_value): if instanceof(ob, Object): + if instanceof(key, Array): + key = JSON.stringify(key) if JS("key in ob"): return ob[key] return default_value else: ## PythonJS object instance ## @@ -500,6 +504,8 @@ def __jsdict_get(ob, key, default_value): def __jsdict_set(ob, key, value): if instanceof(ob, Object): + if instanceof(key, Array): + key = JSON.stringify(key) ob[ key ] = value else: ## PythonJS object instance ## ## this works because instances from PythonJS are created using Object.create(null) ## @@ -507,6 +513,9 @@ def __jsdict_set(ob, key, value): def __jsdict_keys(ob): if instanceof(ob, Object): + ## in the case of tuple keys this would return stringified JSON instead of the original arrays, + ## TODO, should this loop over the keys and convert the json strings back to objects? + ## but then how would we know if a given string was json... special prefix character? return JS("Object.keys( ob )") else: ## PythonJS object instance ## ## this works because instances from PythonJS are created using Object.create(null) ## @@ -1457,25 +1466,18 @@ def __len__(self): def __getitem__(self, key): ''' - notes: - . '4' and 4 are the same key - . it is possible that the translator mistakes a javascript-object for a dict and inlines this function, - that is why below we return the key in self if __dict is undefined. + note: `"4"` and `4` are the same key in javascript, is there a sane way to workaround this, + that can remain compatible with external javascript? ''' __dict = self[...] if instanceof(key, Array): - #if key.length > 0 and typeof( key[0] ) == 'string': - # key = "'" + key.join("'") + "'" key = JSON.stringify( key ) - return inline('__dict[key]') elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): # Test undefined because it can be in the dict if JS("key.__uid__ && key.__uid__ in __dict"): return JS('__dict[key.__uid__]') raise KeyError(key) - # Tested after in order to not convert functions to strings. - # The slow down is negligible if __dict and JS("key in __dict"): return JS('__dict[key]') @@ -1484,17 +1486,12 @@ def __getitem__(self, key): def __setitem__(self, key, value): __dict = self[...] if instanceof(key, Array): - ## using an Array as key converts it to a string - ## check first item of array, if it is a string, the items must be quoted - ## so that numeric and string items are different. - #if key.length > 0 and typeof( key[0] ) == 'string': - # key = "'" + key.join("'") + "'" + ## JSON.stringify will properly quote string elements ## key = JSON.stringify( key ) inline( '__dict[key] = value') elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): if JS("key.__uid__ === undefined"): - # "" is needed so that integers can also be - # used as keys + # "" is needed so that integers can also be used as keys # JS(u"key.__uid__ = '' + _PythonJS_UID++") JS('__dict[key.__uid__] = value') else: From e315fa514dbd0d87172b2b91e5a5f007ab3e9043 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 24 Jul 2014 04:11:37 -0700 Subject: [PATCH 161/222] fixed tuple key in dict with object instances in tuple. --- README.md | 2 + pythonjs/pythonjs.js | 108 +++++++++++++++++++++-------------- pythonjs/runtime/builtins.py | 79 +++++++++++++------------ regtests/dict/tuple_keys.py | 16 +++++- 4 files changed, 123 insertions(+), 82 deletions(-) diff --git a/README.md b/README.md index e0fd80c..01b7e73 100644 --- a/README.md +++ b/README.md @@ -449,3 +449,5 @@ b = ("1","2","3") D = { a: 'hello', b: 'world' } D[ a ] == 'hello' ## OK D[ b ] == 'world' ## OK + +5. AttributeError and KeyError are only raised in default python mode. \ No newline at end of file diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index f790a5d..255271e 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -918,11 +918,6 @@ GLSLJITRuntime.prototype.unpack_mat4 = function(arr) { GLSLJITRuntime.unpack_mat4 = function () { return GLSLJITRuntime.prototype.unpack_mat4.apply(arguments[0], Array.prototype.slice.call(arguments,1)) }; GLSLJITRuntime.prototype.__properties__ = { }; GLSLJITRuntime.prototype.__unbound_methods__ = { }; -var __tuple_key__ = function(arr) { - - return JSON.stringify(arr); -} -;__tuple_key__.is_wrapper = true; var __getattr__ = function(ob, a) { if (ob.__getattr__) { @@ -1582,8 +1577,8 @@ var issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 657: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 658: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 645: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 646: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2336,7 +2331,7 @@ var sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__40; - __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1066: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1054: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2394,7 +2389,7 @@ var next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1084: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1072: return obj.next()"), "__call__")(); } ;next.is_wrapper = true; var map = function(args, kwargs) { @@ -2412,7 +2407,7 @@ var map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__41; - __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1087: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1075: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { @@ -2438,7 +2433,7 @@ var filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__42; - __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1094: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1082: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { @@ -2464,7 +2459,7 @@ var min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__43; - __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1101: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1089: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { @@ -2494,7 +2489,7 @@ var max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__44; - __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1107: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1095: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { @@ -2604,7 +2599,7 @@ var __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1135: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1123: self.obj_get = obj.get ## cache this for speed"); } ;__Iterator___init__.is_wrapper = true; __Iterator_attrs.__init__ = __Iterator___init__; @@ -2685,6 +2680,31 @@ var list = function(args, kwargs) { } } ;list.is_wrapper = true; +var __tuple_key__ = function(arr) { + var i,item,r,t; + r = []; + i = 0; + while (( i ) < arr.length) { + item = arr[i]; + t = typeof(item); + if (( t ) == "string") { + r.append((("'" + item) + "'")); + } else { + if (__test_if_true__(item instanceof Array)) { + r.append(__tuple_key__(item)); + } else { + if (( t ) == "object") { + r.append(item.__uid__); + } else { + r.append(item); + } + } + } + i += 1; + } + return r.join(","); +} + var dict,__dict_attrs,__dict_parents; __dict_attrs = {}; __dict_parents = []; @@ -2711,27 +2731,27 @@ var __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__45; - __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1178: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1183: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { o = __next__45(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1180: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1180: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1180: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1185: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1185: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1185: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1182: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1182: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1182: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1187: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1187: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1187: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__46; - __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1184: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1189: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1185: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1186: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1190: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1191: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2757,15 +2777,15 @@ var __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__47; - __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1193: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1198: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - value = __get__(self["$wrapped"], "__getitem__", "line 1194: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1199: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1197: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1202: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2824,7 +2844,7 @@ var __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1210: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1215: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2848,12 +2868,12 @@ var __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__48; - __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1216: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1221: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1217: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1217: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1222: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1222: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } ;__dict_update.is_wrapper = true; @@ -2872,12 +2892,12 @@ var __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__49; - __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1220: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1225: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__49; __next__49 = __get__(__iterator__49, "next"); while (( __iterator__49.index ) < __iterator__49.length) { key = __next__49(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1221: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1226: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2920,7 +2940,7 @@ var __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1229: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1234: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } ;__dict_set.is_wrapper = true; __dict_attrs.set = __dict_set; @@ -2957,7 +2977,7 @@ var __dict___getitem__ = function(args, kwargs) { "\n note: `\"4\"` and `4` are the same key in javascript, is there a sane way to workaround this,\n that can remain compatible with external javascript?\n "; __dict = self["$wrapped"]; if (__test_if_true__(key instanceof Array)) { - key = __get__(__get__(JSON, "stringify", "missing attribute `stringify` - line 1240: key = JSON.stringify( key )"), "__call__")([key], __NULL_OBJECT__); + key = __tuple_key__(key); } else { if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { if (__test_if_true__(key.__uid__ && key.__uid__ in __dict)) { @@ -2989,7 +3009,7 @@ var __dict___setitem__ = function(args, kwargs) { var value = __args__['value']; __dict = self["$wrapped"]; if (__test_if_true__(key instanceof Array)) { - key = __get__(__get__(JSON, "stringify", "missing attribute `stringify` - line 1253: key = JSON.stringify( key )"), "__call__")([key], __NULL_OBJECT__); + key = __tuple_key__(key); __dict[key] = value; } else { if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { @@ -3223,7 +3243,7 @@ var __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1398: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1398: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1406: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1406: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3247,7 +3267,7 @@ var __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1419: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1427: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; @@ -3280,7 +3300,7 @@ var __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1425: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1433: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3305,7 +3325,7 @@ var __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1433: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1433: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1441: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1441: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3343,7 +3363,7 @@ var __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1449: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1449: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1457: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1457: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3411,13 +3431,13 @@ var __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1469: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1469: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1477: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1477: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1474: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1482: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3475,7 +3495,7 @@ var __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1497: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1505: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; @@ -3494,12 +3514,12 @@ var __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1500: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1508: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1501: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1509: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; @@ -3539,7 +3559,7 @@ var __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1511: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1519: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; @@ -3556,9 +3576,9 @@ var __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1514: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1522: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1515: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1523: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 42cadc8..5b1e53e 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -319,18 +319,6 @@ def unpack_mat4(self, arr): return self.matrices with lowlevel: - def __tuple_key__(arr): - return JSON.stringify( arr ) ## this quotes strings, and should be fast - #r = [] - #i = 0 - #while i < arr.length: - # item = arr[i] - # t = typeof(item) - # if t=='string': - # r.append( "'"+item+"'") - # else: - # r.append( item ) - # i += 1 def __getattr__(ob, a ): if ob.__getattr__: @@ -1382,7 +1370,23 @@ def list(a): raise TypeError - +with javascript: + def __tuple_key__(arr): + r = [] + i = 0 + while i < arr.length: + item = arr[i] + t = typeof(item) + if t=='string': + r.append( "'"+item+"'") + elif instanceof(item, Array): + r.append( __tuple_key__(item) ) + elif t=='object': + r.append( item.__uid__ ) + else: + r.append( item ) + i += 1 + return r.join(',') class dict: # http://stackoverflow.com/questions/10892322/javascript-hashtable-use-object-key @@ -1469,33 +1473,36 @@ def __getitem__(self, key): note: `"4"` and `4` are the same key in javascript, is there a sane way to workaround this, that can remain compatible with external javascript? ''' - __dict = self[...] - if instanceof(key, Array): - key = JSON.stringify( key ) - elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): - # Test undefined because it can be in the dict - if JS("key.__uid__ && key.__uid__ in __dict"): - return JS('__dict[key.__uid__]') - raise KeyError(key) + with javascript: + __dict = self[...] + if instanceof(key, Array): + #key = JSON.stringify( key ) ## fails on objects with circular references ## + key = __tuple_key__(key) + elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): + # Test undefined because it can be in the dict + if JS("key.__uid__ && key.__uid__ in __dict"): + return JS('__dict[key.__uid__]') + raise KeyError(key) - if __dict and JS("key in __dict"): - return JS('__dict[key]') + if __dict and JS("key in __dict"): + return JS('__dict[key]') - raise KeyError(key) + raise KeyError(key) def __setitem__(self, key, value): - __dict = self[...] - if instanceof(key, Array): - ## JSON.stringify will properly quote string elements ## - key = JSON.stringify( key ) - inline( '__dict[key] = value') - elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): - if JS("key.__uid__ === undefined"): - # "" is needed so that integers can also be used as keys # - JS(u"key.__uid__ = '' + _PythonJS_UID++") - JS('__dict[key.__uid__] = value') - else: - JS('__dict[key] = value') + with javascript: + __dict = self[...] + if instanceof(key, Array): + #key = JSON.stringify( key ) ## fails on objects with circular references ## + key = __tuple_key__(key) + inline( '__dict[key] = value') + elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): + if JS("key.__uid__ === undefined"): + # "" is needed so that integers can also be used as keys # + JS(u"key.__uid__ = '' + _PythonJS_UID++") + JS('__dict[key.__uid__] = value') + else: + JS('__dict[key] = value') def keys(self): with javascript: diff --git a/regtests/dict/tuple_keys.py b/regtests/dict/tuple_keys.py index 02a734a..667a9c8 100644 --- a/regtests/dict/tuple_keys.py +++ b/regtests/dict/tuple_keys.py @@ -1,5 +1,9 @@ """dict tuple key""" +class A: pass +class B: + def __init__(self): + pass def main(): s = ("1", "2", "3") @@ -9,8 +13,16 @@ def main(): d = ('1', 2, 3) D = { d:100, s: 11, a: 22, c:44 } - TestError( D[ d ] == 100) ## this fails in both python and javascript mode - TestError( D[ s ] == 11) ## this fails in javascript mode + TestError( D[ d ] == 100) + TestError( D[ s ] == 11) TestError( D[ a ] == 22) TestError( D[ b ] == 22) TestError( D[ c ] == 44) + + aa = A() + bb = B() + ab = ( A(), B() ) + D2 = { aa: 'hello', bb: 'world', ab:'XXX' } + TestError( D2[aa]=='hello' ) + TestError( D2[bb]=='world' ) + TestError( D2[ab]=='XXX') From 3432a53ec93ae133ce18c6d8723e99ae86aa96ea Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 24 Jul 2014 21:03:36 -0700 Subject: [PATCH 162/222] KeyError is raised when value is `undefined` on a raw javascript object, and in javascript mode when inside a try/except KeyError block. --- pythonjs/python_to_pythonjs.py | 44 ++++++++++++++++++++++-------- pythonjs/pythonjs.js | 5 +++- pythonjs/runtime/pythonpythonjs.py | 9 +++++- regtests/exceptions/KeyError.py | 11 ++++++++ 4 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 regtests/exceptions/KeyError.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 5ac5d3a..9f02cdc 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -165,6 +165,8 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self.setup_inliner( writer ) + self._in_catch_exception = False + self._line = None self._line_number = 0 self._stack = [] ## current path to the root @@ -194,8 +196,11 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._class_attributes = dict() self._catch_attributes = None self._typedef_vars = dict() + #self._names = set() ## not used? + ## inferred class instances, TODO regtests to confirm that this never breaks ## self._instances = dict() ## instance name : class name + self._decorator_properties = dict() self._decorator_class_props = dict() self._function_return_types = dict() @@ -1183,13 +1188,21 @@ def visit_If(self, node): writer.pull() def visit_TryExcept(self, node): + if len(node.handlers)==0: + raise SyntaxError(self.format_error('no except handlers')) + + ## by default in js-mode some expections will not be raised, + ## this allows those cases to throw proper errors. + if node.handlers[0].type: + self._in_catch_exception = self.visit(node.handlers[0].type) + else: + self._in_catch_exception = None + writer.write('try:') writer.push() map(self.visit, node.body) writer.pull() map(self.visit, node.handlers) - if len(node.handlers)==0: - raise SyntaxError(self.format_error('no except handlers')) def visit_Raise(self, node): #if self._with_js or self._with_dart: @@ -1625,17 +1638,26 @@ def visit_Subscript(self, node): return '%s[ %s ]' %(name, self.visit(node.slice)) - elif isinstance(node.slice, ast.Index) and isinstance(node.slice.value, ast.BinOp): - return '%s[ %s ]' %(name, self.visit(node.slice)) + else: ## ------------------ javascript mode ------------------------ + if self._in_catch_exception == 'KeyError': + value = self.visit(node.value) + slice = self.visit(node.slice) + return '__get__(%s, "__getitem__")([%s], __NULL_OBJECT__)' % (value, slice) + + elif isinstance(node.slice, ast.Index) and isinstance(node.slice.value, ast.BinOp): + ## TODO keep this optimization? in js mode `a[x+y]` is assumed to a direct key, + ## it would be safer to check if one of the operands is a number literal, + ## in that case it is safe to assume that this is a direct key. + return '%s[ %s ]' %(name, self.visit(node.slice)) - elif self._with_direct_keys: - return '%s[ %s ]' %(name, self.visit(node.slice)) + elif self._with_direct_keys: + return '%s[ %s ]' %(name, self.visit(node.slice)) - else: ## ------------------ javascript mode ------------------------ - s = self.visit(node.slice) - #return '%s[ __ternary_operator__(%s.__uid__, %s) ]' %(name, s, s) - check_array = '__ternary_operator__( instanceof(%s,Array), JSON.stringify(%s), %s )' %(s, s, s) - return '%s[ __ternary_operator__(%s.__uid__, %s) ]' %(name, s, check_array) + else: + s = self.visit(node.slice) + #return '%s[ __ternary_operator__(%s.__uid__, %s) ]' %(name, s, s) + check_array = '__ternary_operator__( instanceof(%s,Array), JSON.stringify(%s), %s )' %(s, s, s) + return '%s[ __ternary_operator__(%s.__uid__, %s) ]' %(name, s, check_array) elif isinstance(node.slice, ast.Slice): return '__get__(%s, "__getslice__")([%s], __NULL_OBJECT__)' % ( diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 255271e..6cb112f 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -355,7 +355,10 @@ var __get__ = function(object, attribute, error_message) { } if (( attribute ) == "__getitem__") { var wrapper = function(args, kwargs) { - return object[args[0]]; + v = object[args[0]]; + if (( v ) === undefined) { + throw new KeyError(args[0]); + } } wrapper.is_wrapper = true; diff --git a/pythonjs/runtime/pythonpythonjs.py b/pythonjs/runtime/pythonpythonjs.py index 438bbad..70bbf09 100644 --- a/pythonjs/runtime/pythonpythonjs.py +++ b/pythonjs/runtime/pythonpythonjs.py @@ -333,7 +333,14 @@ def method(args,kwargs): ## getting/setting from a normal JavaScript Object ## if attribute == '__getitem__': - def wrapper(args,kwargs): return object[ args[0] ] + ## TODO, should object be checked if it really is an object here? + ## new rule: if value to return is `undefined` throw KeyError, + ## this could be a problem with some external js libraries but should be rare, + ## because most libraries will initalize keys to `null` + def wrapper(args,kwargs): + v = object[ args[0] ] + if v is undefined: + raise KeyError( args[0] ) wrapper.is_wrapper = True return wrapper elif attribute == '__setitem__': diff --git a/regtests/exceptions/KeyError.py b/regtests/exceptions/KeyError.py new file mode 100644 index 0000000..f48ec0d --- /dev/null +++ b/regtests/exceptions/KeyError.py @@ -0,0 +1,11 @@ +"""catch KeyError""" + +def main(): + D = {} + a = False + try: + a = D['XXX'] + except KeyError: + a = True + + TestError( a == True ) From 25096535297321fa200e5142bb389a9a7ea22766 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 24 Jul 2014 23:40:23 -0700 Subject: [PATCH 163/222] fixed raise AttributeError in javascript mode. updated README. --- README.md | 14 +++++- pythonjs/python_to_pythonjs.py | 11 ++--- pythonjs/pythonjs.js | 84 +++++++++++++++++++--------------- pythonjs/runtime/builtins.py | 8 ++++ 4 files changed, 73 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 01b7e73..8b5411d 100644 --- a/README.md +++ b/README.md @@ -450,4 +450,16 @@ D = { a: 'hello', b: 'world' } D[ a ] == 'hello' ## OK D[ b ] == 'world' ## OK -5. AttributeError and KeyError are only raised in default python mode. \ No newline at end of file +5. AttributeError and KeyError are only raised in javascript mode when inside a block that catches those errors. +In the default python mode these errors will always be thrown, and halt the program. +``` +pythonjs.configure(javascript=True) +a = {} + +# this will not throw any error +b = a['xxx'] + +# this will throw KeyError, and when caught `b` is set to "my-default" +b = a['xxx'] except KeyError: 'my-default' + +``` \ No newline at end of file diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 9f02cdc..5e61c8c 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1579,13 +1579,12 @@ def visit_Attribute(self, node): return '%s.%s' %(node_value, node.attr) elif self._with_dart or self._with_ll: return '%s.%s' %(node_value, node.attr) + elif self._with_js: - return '%s.%s' %(node_value, node.attr) - ## TODO pythonjs.configure to allow this - #if self._in_assign_target or not isinstance(node.attr, str): - # return '%s.%s' %(node_value, node.attr) - #else: - # return '__ternary_operator__(%s.%s is not undefined, %s.%s, __getattr__(%s, "%s"))' %(node_value, node.attr, node_value, node.attr, node_value, node.attr) + if self._in_catch_exception == 'AttributeError': + return '__getfast__(%s, "%s")' % (node_value, node.attr) + else: + return '%s.%s' %(node_value, node.attr) elif self._with_lua and self._in_assign_target: ## this is required because lua has no support for inplace assignment ops like "+=" return '%s.%s' %(node_value, node.attr) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 6cb112f..81d222f 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -499,6 +499,16 @@ KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Obj ValueError = function(msg) {this.message = msg || "";}; ValueError.prototype = Object.create(Error.prototype); ValueError.prototype.name = "ValueError"; AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError"; RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError"; +var __getfast__ = function(ob, attr) { + var v; + v = ob[attr]; + if (( v ) === undefined) { + throw new AttributeError(attr); + } else { + return v; + } +} +;__getfast__.is_wrapper = true; var __gpu_object = function(cls, struct_name, data_name) { cls.prototype.__struct_name__ = struct_name; @@ -1580,8 +1590,8 @@ var issubclass = function(args, kwargs) { } bases = C.__bases__; i = 0; - while (( i ) < __get__(bases, "length", "missing attribute `length` - line 645: while i < bases.length:")) { - if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 646: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { + while (( i ) < __get__(bases, "length", "missing attribute `length` - line 652: while i < bases.length:")) { + if (__test_if_true__(issubclass([((bases instanceof Array) ? bases[i] : __get__(bases, "__getitem__", "line 653: if issubclass( bases[i], B ):")([i], __NULL_OBJECT__)), B], __NULL_OBJECT__))) { return true; } i += 1; @@ -2334,7 +2344,7 @@ var sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__40; - __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1054: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1061: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2392,7 +2402,7 @@ var next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1072: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1079: return obj.next()"), "__call__")(); } ;next.is_wrapper = true; var map = function(args, kwargs) { @@ -2410,7 +2420,7 @@ var map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__41; - __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1075: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1082: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { @@ -2436,7 +2446,7 @@ var filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__42; - __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1082: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1089: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { @@ -2462,7 +2472,7 @@ var min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__43; - __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1089: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1096: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { @@ -2492,7 +2502,7 @@ var max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__44; - __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1095: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1102: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { @@ -2602,7 +2612,7 @@ var __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1123: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1130: self.obj_get = obj.get ## cache this for speed"); } ;__Iterator___init__.is_wrapper = true; __Iterator_attrs.__init__ = __Iterator___init__; @@ -2734,27 +2744,27 @@ var __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__45; - __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1183: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1190: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { o = __next__45(); if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1185: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1185: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1185: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1192: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1192: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1192: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1187: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1187: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1187: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1194: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1194: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1194: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__46; - __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1189: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1196: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1190: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1191: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1197: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1198: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2780,15 +2790,15 @@ var __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__47; - __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1198: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1205: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - value = __get__(self["$wrapped"], "__getitem__", "line 1199: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1206: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1202: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1209: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2847,7 +2857,7 @@ var __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1215: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1222: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2871,12 +2881,12 @@ var __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__48; - __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1221: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1228: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1222: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1222: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1229: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1229: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } ;__dict_update.is_wrapper = true; @@ -2895,12 +2905,12 @@ var __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__49; - __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1225: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1232: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__49; __next__49 = __get__(__iterator__49, "next"); while (( __iterator__49.index ) < __iterator__49.length) { key = __next__49(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1226: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1233: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2943,7 +2953,7 @@ var __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1234: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1241: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } ;__dict_set.is_wrapper = true; __dict_attrs.set = __dict_set; @@ -3246,7 +3256,7 @@ var __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1406: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1406: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1413: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1413: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3270,7 +3280,7 @@ var __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1427: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1434: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; @@ -3303,7 +3313,7 @@ var __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1433: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1440: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3328,7 +3338,7 @@ var __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1441: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1441: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1448: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1448: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3366,7 +3376,7 @@ var __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1457: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1457: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1464: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1464: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3434,13 +3444,13 @@ var __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1477: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1477: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1484: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1484: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1482: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1489: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3498,7 +3508,7 @@ var __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1505: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1512: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; @@ -3517,12 +3527,12 @@ var __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1508: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1515: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1509: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1516: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; @@ -3562,7 +3572,7 @@ var __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1519: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1526: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; @@ -3579,9 +3589,9 @@ var __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1522: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1529: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1523: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1530: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 5b1e53e..f574586 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -15,6 +15,14 @@ inline('AttributeError = function(msg) {this.message = msg || "";}; AttributeError.prototype = Object.create(Error.prototype);AttributeError.prototype.name = "AttributeError";') inline('RuntimeError = function(msg) {this.message = msg || "";}; RuntimeError.prototype = Object.create(Error.prototype);RuntimeError.prototype.name = "RuntimeError";') +with lowlevel: + def __getfast__(ob, attr): + v = ob[ attr ] + if v is undefined: + raise AttributeError(attr) + else: + return v + with javascript: def __gpu_object(cls, struct_name, data_name): cls.prototype.__struct_name__ = struct_name From d7c3753f90d73542cb76666aa1f720ac5426fdc3 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 24 Jul 2014 23:51:39 -0700 Subject: [PATCH 164/222] updated README --- README.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 8b5411d..97736c5 100644 --- a/README.md +++ b/README.md @@ -455,11 +455,6 @@ In the default python mode these errors will always be thrown, and halt the prog ``` pythonjs.configure(javascript=True) a = {} - -# this will not throw any error -b = a['xxx'] - -# this will throw KeyError, and when caught `b` is set to "my-default" +b = a['xxx'] # this will not throw any error b = a['xxx'] except KeyError: 'my-default' - -``` \ No newline at end of file +``` From fe3fd33f9c561b0589f569bd0f492f5025542cde Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 24 Jul 2014 23:53:49 -0700 Subject: [PATCH 165/222] fixed README --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 97736c5..77d04b3 100644 --- a/README.md +++ b/README.md @@ -449,12 +449,15 @@ b = ("1","2","3") D = { a: 'hello', b: 'world' } D[ a ] == 'hello' ## OK D[ b ] == 'world' ## OK +``` 5. AttributeError and KeyError are only raised in javascript mode when inside a block that catches those errors. In the default python mode these errors will always be thrown, and halt the program. ``` pythonjs.configure(javascript=True) a = {} -b = a['xxx'] # this will not throw any error +# this will not throw any error +b = a['xxx'] +# this works as expected, "b" will be set to "my-default" b = a['xxx'] except KeyError: 'my-default' ``` From 8f812c5eec0a4618043954ca897e258505437266 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 26 Jul 2014 16:56:19 -0700 Subject: [PATCH 166/222] fixed dict. --- README.md | 7 ++ pythonjs/python_to_pythonjs.py | 6 +- pythonjs/pythonjs.js | 138 ++++++++++++++++----------------- pythonjs/runtime/builtins.py | 11 +-- 4 files changed, 86 insertions(+), 76 deletions(-) diff --git a/README.md b/README.md index 77d04b3..defe55b 100644 --- a/README.md +++ b/README.md @@ -394,6 +394,13 @@ pythonjs.configure( Gotchas --------- +0. in a dictionary number keys will be converted to strings. +In the example below the key `100` and `"100"` are the same key. +``` +a = {"100": 'X'} +a[ 100 ] = 'Y' +``` + 1. The calling context of `this` must be taken into account when using fast javascript mode, code that comes after: `pythonjs.configure(javascript=True)` or is inside a `with javascript:` block. When in javascript mode, passing a method as a callback, or setting it as an attribute on another object, requires you call `f.bind(self)` to ensure that `self` within the method points to the class instance. This is not required when using classes defined normal mode, because the `this` calling context is automatically managed. Note: you can use the special `->` syntax in place of the attribute operator `.` to call `bind` automatically. diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 5e61c8c..198d9c7 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2373,7 +2373,11 @@ def visit_Call(self, node): a = ( self.visit(node.func),self.visit(node.func), self.visit(node.starargs), ','.join(kwargs) ) return '%s.apply(%s, [].extend(%s).append({%s}) )' %a else: - return '%s({%s})' %( self.visit(node.func), ','.join(kwargs) ) + func_name = self.visit(node.func) + if func_name == 'dict': + return '{%s}' %','.join(kwargs) + else: + return '%s({%s})' %( func_name, ','.join(kwargs) ) else: if node.starargs: diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 81d222f..9cd417e 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -2743,28 +2743,26 @@ var __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var o,__iterator__45; - __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1190: for o in ob:"), "__call__")([], __NULL_OBJECT__); - var __next__45; - __next__45 = __get__(__iterator__45, "next"); - while (( __iterator__45.index ) < __iterator__45.length) { - o = __next__45(); - if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1192: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1192: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1192: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + var __iter34 = ob; + if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34) || __is_some_array(__iter34) )) { __iter34 = __object_keys__(__iter34) } + for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { + var o = __iter34[ __idx34 ]; + if (o instanceof Array) { + self.__setitem__(o[0], o[1]); } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1194: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1194: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1194: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + self.__setitem__(o["key"], o["value"]); } } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__46; - __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1196: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1197: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1197: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1198: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1198: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1199: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2790,15 +2788,15 @@ var __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__47; - __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1205: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1206: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - value = __get__(self["$wrapped"], "__getitem__", "line 1206: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1207: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1209: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1210: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2857,7 +2855,7 @@ var __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1222: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1223: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2881,12 +2879,12 @@ var __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__48; - __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1228: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1229: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1229: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1229: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1230: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1230: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } ;__dict_update.is_wrapper = true; @@ -2905,12 +2903,12 @@ var __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__49; - __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1232: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1233: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__49; __next__49 = __get__(__iterator__49, "next"); while (( __iterator__49.index ) < __iterator__49.length) { key = __next__49(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1233: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1234: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2953,7 +2951,7 @@ var __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1241: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1242: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } ;__dict_set.is_wrapper = true; __dict_attrs.set = __dict_set; @@ -3092,10 +3090,10 @@ var __dict_values = function(args, kwargs) { var self = __args__['self']; keys = Object.keys(self["$wrapped"]); out = []; - var __iter34 = keys; - if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34) || __is_some_array(__iter34) )) { __iter34 = __object_keys__(__iter34) } - for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { - var key = __iter34[ __idx34 ]; + var __iter35 = keys; + if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35) || __is_some_array(__iter35) )) { __iter35 = __object_keys__(__iter35) } + for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { + var key = __iter35[ __idx35 ]; out.push(self["$wrapped"][key]); } return out; @@ -3179,10 +3177,10 @@ var set = function(args, kwargs) { } fallback = false; if (__test_if_true__(hashtable)) { - var __iter35 = a; - if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35) || __is_some_array(__iter35) )) { __iter35 = __object_keys__(__iter35) } - for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { - var b = __iter35[ __idx35 ]; + var __iter36 = a; + if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36) || __is_some_array(__iter36) )) { __iter36 = __object_keys__(__iter36) } + for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { + var b = __iter36[ __idx36 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[key] = b; @@ -3197,20 +3195,20 @@ var set = function(args, kwargs) { } s = []; if (__test_if_true__(fallback)) { - var __iter36 = a; - if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36) || __is_some_array(__iter36) )) { __iter36 = __object_keys__(__iter36) } - for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { - var item = __iter36[ __idx36 ]; + var __iter37 = a; + if (! (__iter37 instanceof Array || typeof __iter37 == "string" || __is_typed_array(__iter37) || __is_some_array(__iter37) )) { __iter37 = __object_keys__(__iter37) } + for (var __idx37=0; __idx37 < __iter37.length; __idx37++) { + var item = __iter37[ __idx37 ]; if (( s.indexOf(item) ) == -1) { s.push(item); } } } else { __sort_method(keys); - var __iter37 = keys; - if (! (__iter37 instanceof Array || typeof __iter37 == "string" || __is_typed_array(__iter37) || __is_some_array(__iter37) )) { __iter37 = __object_keys__(__iter37) } - for (var __idx37=0; __idx37 < __iter37.length; __idx37++) { - var key = __iter37[ __idx37 ]; + var __iter38 = keys; + if (! (__iter38 instanceof Array || typeof __iter38 == "string" || __is_typed_array(__iter38) || __is_some_array(__iter38) )) { __iter38 = __object_keys__(__iter38) } + for (var __idx38=0; __idx38 < __iter38.length; __idx38++) { + var key = __iter38[ __idx38 ]; s.push(hashtable[key]); } } @@ -3256,7 +3254,7 @@ var __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1413: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1413: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1414: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1414: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3280,7 +3278,7 @@ var __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1434: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1435: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; @@ -3313,7 +3311,7 @@ var __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1440: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1441: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3338,7 +3336,7 @@ var __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1448: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1448: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1449: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1449: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3376,7 +3374,7 @@ var __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1464: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1464: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1465: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1465: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3444,13 +3442,13 @@ var __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1484: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1484: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1485: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1485: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1489: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1490: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3508,7 +3506,7 @@ var __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1512: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1513: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; @@ -3527,12 +3525,12 @@ var __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1515: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1516: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1516: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1517: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; @@ -3572,7 +3570,7 @@ var __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1526: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1527: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; @@ -3589,9 +3587,9 @@ var __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1529: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1530: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1530: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1531: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3722,17 +3720,17 @@ json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (f var __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; - var __iter38 = threading.workers; - if (! (__iter38 instanceof Array || typeof __iter38 == "string" || __is_typed_array(__iter38) || __is_some_array(__iter38) )) { __iter38 = __object_keys__(__iter38) } - for (var __idx38=0; __idx38 < __iter38.length; __idx38++) { - var b = __iter38[ __idx38 ]; + var __iter39 = threading.workers; + if (! (__iter39 instanceof Array || typeof __iter39 == "string" || __is_typed_array(__iter39) || __is_some_array(__iter39) )) { __iter39 = __object_keys__(__iter39) } + for (var __idx39=0; __idx39 < __iter39.length; __idx39++) { + var b = __iter39[ __idx39 ]; other = b["worker"]; args = b["args"]; if (( other ) !== worker) { - var __iter39 = args; - if (! (__iter39 instanceof Array || typeof __iter39 == "string" || __is_typed_array(__iter39) || __is_some_array(__iter39) )) { __iter39 = __object_keys__(__iter39) } - for (var __idx39=0; __idx39 < __iter39.length; __idx39++) { - var arg = __iter39[ __idx39 ]; + var __iter40 = args; + if (! (__iter40 instanceof Array || typeof __iter40 == "string" || __is_typed_array(__iter40) || __is_some_array(__iter40) )) { __iter40 = __object_keys__(__iter40) } + for (var __idx40=0; __idx40 < __iter40.length; __idx40++) { + var arg = __iter40[ __idx40 ]; if (( arg ) === ob) { if (! (__contains__(a, other))) { a.append(other); @@ -3764,10 +3762,10 @@ var __start_new_thread = function(f, args) { if (( event.data.type ) == "append") { a = args[event.data.argindex]; a.push(event.data.value); - var __iter40 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter40 instanceof Array || typeof __iter40 == "string" || __is_typed_array(__iter40) || __is_some_array(__iter40) )) { __iter40 = __object_keys__(__iter40) } - for (var __idx40=0; __idx40 < __iter40.length; __idx40++) { - var other = __iter40[ __idx40 ]; + var __iter41 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter41 instanceof Array || typeof __iter41 == "string" || __is_typed_array(__iter41) || __is_some_array(__iter41) )) { __iter41 = __object_keys__(__iter41) } + for (var __idx41=0; __idx41 < __iter41.length; __idx41++) { + var other = __iter41[ __idx41 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); } } else { @@ -3779,10 +3777,10 @@ var __start_new_thread = function(f, args) { } else { a[event.data.index] = value; } - var __iter41 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter41 instanceof Array || typeof __iter41 == "string" || __is_typed_array(__iter41) || __is_some_array(__iter41) )) { __iter41 = __object_keys__(__iter41) } - for (var __idx41=0; __idx41 < __iter41.length; __idx41++) { - var other = __iter41[ __idx41 ]; + var __iter42 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter42 instanceof Array || typeof __iter42 == "string" || __is_typed_array(__iter42) || __is_some_array(__iter42) )) { __iter42 = __object_keys__(__iter42) } + for (var __idx42=0; __idx42 < __iter42.length; __idx42++) { + var other = __iter42[ __idx42 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); } } else { @@ -3797,10 +3795,10 @@ var __start_new_thread = function(f, args) { jsargs = []; var i; i = 0; - var __iter42 = args; - if (! (__iter42 instanceof Array || typeof __iter42 == "string" || __is_typed_array(__iter42) || __is_some_array(__iter42) )) { __iter42 = __object_keys__(__iter42) } - for (var __idx42=0; __idx42 < __iter42.length; __idx42++) { - var arg = __iter42[ __idx42 ]; + var __iter43 = args; + if (! (__iter43 instanceof Array || typeof __iter43 == "string" || __is_typed_array(__iter43) || __is_some_array(__iter43) )) { __iter43 = __object_keys__(__iter43) } + for (var __idx43=0; __idx43 < __iter43.length; __idx43++) { + var arg = __iter43[ __idx43 ]; if (__test_if_true__(arg.jsify)) { jsargs.append(arg.jsify()); } else { diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index f574586..f04ff4b 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -1410,11 +1410,12 @@ def __init__(self, js_object=None, pointer=None): elif js_object: ob = js_object if instanceof(ob, Array): - for o in ob: - if instanceof(o, Array): - self.__setitem__( o[0], o[1] ) - else: - self.__setitem__( o['key'], o['value'] ) + with lowlevel: + for o in ob: + if instanceof(o, Array): + self.__setitem__( o[0], o[1] ) + else: + self.__setitem__( o['key'], o['value'] ) elif isinstance(ob, dict): for key in ob.keys(): value = ob[ key ] From 7381f36f7205d3ad633164a1a9f39709df1e7f44 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 27 Jul 2014 15:53:33 -0700 Subject: [PATCH 167/222] starting on Go backend. --- pythonjs/python_to_pythonjs.py | 10 ++-- pythonjs/pythonjs_to_go.py | 96 ++++++++++++++++++++++++++++++++++ pythonjs/translator.py | 8 ++- pythonjs/typedpython.py | 2 +- regtests/lang/inline.py | 5 ++ regtests/run.py | 29 +++++++++- 6 files changed, 142 insertions(+), 8 deletions(-) create mode 100644 pythonjs/pythonjs_to_go.py create mode 100644 regtests/lang/inline.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 198d9c7..72daabc 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -132,12 +132,13 @@ def format_error(self, node): msg += '%s%s line:%s col:%s\n' % (' '*(l+1)*2, n.__class__.__name__, n.lineno, n.col_offset) return msg - def __init__(self, source=None, module=None, module_path=None, dart=False, coffee=False, lua=False): + def __init__(self, source=None, module=None, module_path=None, dart=False, coffee=False, lua=False, go=False): super(PythonToPythonJS, self).__init__() self._module_path = module_path ## used for user `from xxx import *` to load .py files in the same directory. self._with_lua = lua self._with_coffee = coffee self._with_dart = dart + self._with_go = go self._html_tail = []; script = False if source.strip().startswith(' 1: + for arg in sys.argv[1:]: + if arg.endswith('.py'): + scripts.append( arg ) + + if len(scripts): + a = [] + for script in scripts: + a.append( open(script, 'rb').read() ) + data = '\n'.join( a ) + else: + data = sys.stdin.read() + + out = main( data ) + print( out ) + + +if __name__ == '__main__': + command() diff --git a/pythonjs/translator.py b/pythonjs/translator.py index 46fd4b9..0d12938 100755 --- a/pythonjs/translator.py +++ b/pythonjs/translator.py @@ -7,9 +7,10 @@ from pythonjs_to_coffee import main as pythonjs_to_coffee from pythonjs_to_lua import main as pythonjs_to_lua from pythonjs_to_luajs import main as pythonjs_to_luajs +from pythonjs_to_go import main as pythonjs_to_go cmdhelp = """\ -usage: translator.py [--dart|--coffee|--lua|--visjs|--no-wrapper|--analyze] file.py +usage: translator.py [--dart|--coffee|--lua|--go|--visjs|--no-wrapper|--analyze] file.py example: translator.py --no-wrapper myscript.py > myscript.js @@ -23,7 +24,10 @@ def main(script, module_path=None): else: code = '' res = None - if '--dart' in sys.argv: + if '--go' in sys.argv: + a = python_to_pythonjs(script, go=True, module_path=module_path) + code = pythonjs_to_go( a ) + elif '--dart' in sys.argv: a = python_to_pythonjs(script, dart=True, module_path=module_path) code = pythonjs_to_dart( a ) elif '--coffee' in sys.argv: diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index a2d42df..00c01a5 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -63,7 +63,7 @@ def transform_source( source, strip=False ): if cs.startswith('//'): continue - elif cs.startswith('inline('): + elif cs.startswith('inline(') or cs.startswith('JS('): output.append(c) continue diff --git a/regtests/lang/inline.py b/regtests/lang/inline.py new file mode 100644 index 0000000..7a8e3e4 --- /dev/null +++ b/regtests/lang/inline.py @@ -0,0 +1,5 @@ +"""inline""" + +def main(): + JS("now = new Date()") + inline("now = new Date()") diff --git a/regtests/run.py b/regtests/run.py index f122999..fc6e013 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -189,6 +189,8 @@ def run_old_pypy_test_on(filename): lua2js = os.path.abspath( '../external/lua.js/lua2js' ) luajs_runnable = os.path.isfile( lua2js ) and '--lua2js' in sys.argv +go_runnable = runnable( 'go version') + assert rhino_runnable or node_runnable if show_details: @@ -458,7 +460,7 @@ def run_python3_test_on(filename): -def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False, luajs=False, multioutput=False, requirejs=True): +def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False, luajs=False, go=False, multioutput=False, requirejs=True): global tmpname tmpname = os.path.join( tempfile.gettempdir(), @@ -490,6 +492,9 @@ def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False ] content = '\n'.join( source ) + elif go: + content = patch_python(filename, backend='GO') + else: content = patch_python(filename) @@ -514,6 +519,8 @@ def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False cmd.append( '--lua') elif luajs: cmd.append( '--luajs') + elif go: + cmd.append( '--go' ) if not requirejs: cmd.append( '--no-wrapper' ) @@ -763,6 +770,17 @@ def run_luajs_node(content): return run_command("node %s.js" % tmpname) +def run_pythonjs_go_test(dummy_filename): + """PythonJS (Go backend)""" + return run_if_no_error(run_go) + +def run_go(content): + """compile and run go program""" + #builtins = read(os.path.join("../external/lua.js", "lua.js")) + write("%s.go" % tmpname, content) + return run_command("go build %s.go" % tmpname) + + def run_html_test( filename, sum_errors ): lines = open(filename, 'rb').read().decode('utf-8').splitlines() filename = os.path.split(filename)[-1] @@ -926,6 +944,11 @@ def display(function): js = translate_js(filename, lua=True) display(run_pythonjs_lua_test_on_luajit) + if go_runnable: + js = translate_js(filename, go=True) + display(run_pythonjs_go_test) + + print() return sum_errors @@ -976,6 +999,10 @@ def run(): if luajit_runnable: headers.append("Lua\nJIT") + if go_runnable: + headers.append("Go\n-") + + print(table_header % ("", "Regtest run on") + ''.join(table_cell % i.split('\n')[0] for i in headers) From 45e101dcd58a21823b07661ac7adfd25eb534487 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Tue, 29 Jul 2014 17:23:48 -0700 Subject: [PATCH 168/222] fixed tuple keys `a[i]=b[i]` in javascript mode. --- pythonjs/python_to_pythonjs.py | 9 ++- pythonjs/pythonjs.js | 134 ++++++++++++++++++--------------- pythonjs/runtime/builtins.py | 23 ++++-- regtests/dict/tuple_keys.py | 6 ++ 4 files changed, 100 insertions(+), 72 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 72daabc..52b7133 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1797,7 +1797,8 @@ def _visit_assign_helper(self, node, target): elif self._with_direct_keys: code = '%s[ %s ] = %s' % (self.visit(target.value), s, self.visit(node.value)) else: - code = '%s[ __ternary_operator__(%s.__uid__, %s) ] = %s' % (self.visit(target.value), s, s, self.visit(node.value)) + check_array = '__ternary_operator__( instanceof(%s,Array), JSON.stringify(%s), %s )' %(s, s, s) + code = '%s[ __ternary_operator__(%s.__uid__, %s) ] = %s' %(self.visit(target.value), s, check_array, self.visit(node.value)) elif name in self._func_typedefs and self._func_typedefs[name] == 'list': code = '%s[%s] = %s'%(name, self.visit(target.slice.value), self.visit(node.value)) @@ -2893,7 +2894,11 @@ def visit_FunctionDef(self, node): writer.write( 'def %s( %s ):' % (node.name, ','.join(args)) ) else: - writer.write('def %s(args, kwargs):' % node.name) + if len(node.args.defaults) or node.args.kwarg or len(node.args.args) or node.args.vararg: + writer.write('def %s(args, kwargs):' % node.name) + else: + writer.write('def %s():' % node.name) + writer.push() ## write local typedefs and var scope ## diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 9cd417e..d5b7378 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -1724,7 +1724,7 @@ var str = function(args, kwargs) { return ("" + s); } ;str.is_wrapper = true; -var _setup_str_prototype = function(args, kwargs) { +var _setup_str_prototype = function() { "\n Extend JavaScript String.prototype with methods that implement the Python str API.\n The decorator @String.prototype.[name] assigns the function to the prototype,\n and ensures that the special 'this' variable will work.\n "; var func = function(a) { @@ -1951,7 +1951,7 @@ var __sort_method = function(ob) { } } -var _setup_array_prototype = function(args, kwargs) { +var _setup_array_prototype = function() { var func = function() { var i,item; @@ -2204,7 +2204,7 @@ var _setup_array_prototype = function(args, kwargs) { } ;_setup_array_prototype.is_wrapper = true; _setup_array_prototype(); -var _setup_nodelist_prototype = function(args, kwargs) { +var _setup_nodelist_prototype = function() { var func = function(a) { @@ -2743,14 +2743,16 @@ var __dict___init__ = function(args, kwargs) { if (__test_if_true__(js_object)) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { - var __iter34 = ob; - if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34) || __is_some_array(__iter34) )) { __iter34 = __object_keys__(__iter34) } - for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { - var o = __iter34[ __idx34 ]; - if (o instanceof Array) { - self.__setitem__(o[0], o[1]); + var o,__iterator__45; + __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1191: for o in ob:"), "__call__")([], __NULL_OBJECT__); + var __next__45; + __next__45 = __get__(__iterator__45, "next"); + while (( __iterator__45.index ) < __iterator__45.length) { + o = __next__45(); + if (__test_if_true__(o instanceof Array)) { + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1193: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1193: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1193: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); } else { - self.__setitem__(o["key"], o["value"]); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1195: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1195: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1195: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); } } } else { @@ -2973,7 +2975,7 @@ var __dict___len__ = function(args, kwargs) { ;__dict___len__.is_wrapper = true; __dict_attrs.__len__ = __dict___len__; var __dict___getitem__ = function(args, kwargs) { - var __dict; + var __dict,msg,err; var __sig__,__args__; __sig__ = { kwargs:{},args:["self", "key"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2987,20 +2989,28 @@ var __dict___getitem__ = function(args, kwargs) { var key = __args__['key']; "\n note: `\"4\"` and `4` are the same key in javascript, is there a sane way to workaround this,\n that can remain compatible with external javascript?\n "; __dict = self["$wrapped"]; + err = false; if (__test_if_true__(key instanceof Array)) { key = __tuple_key__(key); } else { if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { if (__test_if_true__(key.__uid__ && key.__uid__ in __dict)) { return __dict[key.__uid__]; + } else { + err = true; } - throw new KeyError(key); } } if (__test_if_true__(__dict && key in __dict)) { return __dict[key]; + } else { + err = true; + } + if (__test_if_true__(err)) { + msg = __sprintf("missing key: %s", key); + msg += __sprintf("\n - dict keys: %s", Object.keys(__dict)); + throw new KeyError(msg); } - throw new KeyError(key); } ;__dict___getitem__.is_wrapper = true; __dict_attrs.__getitem__ = __dict___getitem__; @@ -3090,10 +3100,10 @@ var __dict_values = function(args, kwargs) { var self = __args__['self']; keys = Object.keys(self["$wrapped"]); out = []; - var __iter35 = keys; - if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35) || __is_some_array(__iter35) )) { __iter35 = __object_keys__(__iter35) } - for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { - var key = __iter35[ __idx35 ]; + var __iter34 = keys; + if (! (__iter34 instanceof Array || typeof __iter34 == "string" || __is_typed_array(__iter34) || __is_some_array(__iter34) )) { __iter34 = __object_keys__(__iter34) } + for (var __idx34=0; __idx34 < __iter34.length; __idx34++) { + var key = __iter34[ __idx34 ]; out.push(self["$wrapped"][key]); } return out; @@ -3177,10 +3187,10 @@ var set = function(args, kwargs) { } fallback = false; if (__test_if_true__(hashtable)) { - var __iter36 = a; - if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36) || __is_some_array(__iter36) )) { __iter36 = __object_keys__(__iter36) } - for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { - var b = __iter36[ __idx36 ]; + var __iter35 = a; + if (! (__iter35 instanceof Array || typeof __iter35 == "string" || __is_typed_array(__iter35) || __is_some_array(__iter35) )) { __iter35 = __object_keys__(__iter35) } + for (var __idx35=0; __idx35 < __iter35.length; __idx35++) { + var b = __iter35[ __idx35 ]; if (__test_if_true__(( typeof(b) ) == "number" && ( b ) === ( (b | 0) ))) { key = (b & mask); hashtable[key] = b; @@ -3195,20 +3205,20 @@ var set = function(args, kwargs) { } s = []; if (__test_if_true__(fallback)) { - var __iter37 = a; - if (! (__iter37 instanceof Array || typeof __iter37 == "string" || __is_typed_array(__iter37) || __is_some_array(__iter37) )) { __iter37 = __object_keys__(__iter37) } - for (var __idx37=0; __idx37 < __iter37.length; __idx37++) { - var item = __iter37[ __idx37 ]; + var __iter36 = a; + if (! (__iter36 instanceof Array || typeof __iter36 == "string" || __is_typed_array(__iter36) || __is_some_array(__iter36) )) { __iter36 = __object_keys__(__iter36) } + for (var __idx36=0; __idx36 < __iter36.length; __idx36++) { + var item = __iter36[ __idx36 ]; if (( s.indexOf(item) ) == -1) { s.push(item); } } } else { __sort_method(keys); - var __iter38 = keys; - if (! (__iter38 instanceof Array || typeof __iter38 == "string" || __is_typed_array(__iter38) || __is_some_array(__iter38) )) { __iter38 = __object_keys__(__iter38) } - for (var __idx38=0; __idx38 < __iter38.length; __idx38++) { - var key = __iter38[ __idx38 ]; + var __iter37 = keys; + if (! (__iter37 instanceof Array || typeof __iter37 == "string" || __is_typed_array(__iter37) || __is_some_array(__iter37) )) { __iter37 = __object_keys__(__iter37) } + for (var __idx37=0; __idx37 < __iter37.length; __idx37++) { + var key = __iter37[ __idx37 ]; s.push(hashtable[key]); } } @@ -3254,7 +3264,7 @@ var __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1414: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1414: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1421: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1421: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3278,7 +3288,7 @@ var __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1435: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1442: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; @@ -3311,7 +3321,7 @@ var __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1441: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1448: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3336,7 +3346,7 @@ var __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1449: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1449: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1456: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1456: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3374,7 +3384,7 @@ var __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1465: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1465: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1472: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1472: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3442,13 +3452,13 @@ var __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1485: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1485: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1492: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1492: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1490: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1497: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3506,7 +3516,7 @@ var __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1513: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1520: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; @@ -3525,12 +3535,12 @@ var __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1516: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1523: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1517: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1524: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; @@ -3570,7 +3580,7 @@ var __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1527: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1534: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; @@ -3587,9 +3597,9 @@ var __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1530: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1537: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1531: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1538: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3720,17 +3730,17 @@ json = __jsdict([["loads", (function (s) {return JSON.parse(s);})], ["dumps", (f var __get_other_workers_with_shared_arg = function(worker, ob) { var a,other,args; a = []; - var __iter39 = threading.workers; - if (! (__iter39 instanceof Array || typeof __iter39 == "string" || __is_typed_array(__iter39) || __is_some_array(__iter39) )) { __iter39 = __object_keys__(__iter39) } - for (var __idx39=0; __idx39 < __iter39.length; __idx39++) { - var b = __iter39[ __idx39 ]; + var __iter38 = threading.workers; + if (! (__iter38 instanceof Array || typeof __iter38 == "string" || __is_typed_array(__iter38) || __is_some_array(__iter38) )) { __iter38 = __object_keys__(__iter38) } + for (var __idx38=0; __idx38 < __iter38.length; __idx38++) { + var b = __iter38[ __idx38 ]; other = b["worker"]; args = b["args"]; if (( other ) !== worker) { - var __iter40 = args; - if (! (__iter40 instanceof Array || typeof __iter40 == "string" || __is_typed_array(__iter40) || __is_some_array(__iter40) )) { __iter40 = __object_keys__(__iter40) } - for (var __idx40=0; __idx40 < __iter40.length; __idx40++) { - var arg = __iter40[ __idx40 ]; + var __iter39 = args; + if (! (__iter39 instanceof Array || typeof __iter39 == "string" || __is_typed_array(__iter39) || __is_some_array(__iter39) )) { __iter39 = __object_keys__(__iter39) } + for (var __idx39=0; __idx39 < __iter39.length; __idx39++) { + var arg = __iter39[ __idx39 ]; if (( arg ) === ob) { if (! (__contains__(a, other))) { a.append(other); @@ -3762,10 +3772,10 @@ var __start_new_thread = function(f, args) { if (( event.data.type ) == "append") { a = args[event.data.argindex]; a.push(event.data.value); - var __iter41 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter41 instanceof Array || typeof __iter41 == "string" || __is_typed_array(__iter41) || __is_some_array(__iter41) )) { __iter41 = __object_keys__(__iter41) } - for (var __idx41=0; __idx41 < __iter41.length; __idx41++) { - var other = __iter41[ __idx41 ]; + var __iter40 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter40 instanceof Array || typeof __iter40 == "string" || __is_typed_array(__iter40) || __is_some_array(__iter40) )) { __iter40 = __object_keys__(__iter40) } + for (var __idx40=0; __idx40 < __iter40.length; __idx40++) { + var other = __iter40[ __idx40 ]; other.postMessage(__jsdict([["type", "append"], ["argindex", event.data.argindex], ["value", event.data.value]])); } } else { @@ -3777,10 +3787,10 @@ var __start_new_thread = function(f, args) { } else { a[event.data.index] = value; } - var __iter42 = __get_other_workers_with_shared_arg(worker, a); - if (! (__iter42 instanceof Array || typeof __iter42 == "string" || __is_typed_array(__iter42) || __is_some_array(__iter42) )) { __iter42 = __object_keys__(__iter42) } - for (var __idx42=0; __idx42 < __iter42.length; __idx42++) { - var other = __iter42[ __idx42 ]; + var __iter41 = __get_other_workers_with_shared_arg(worker, a); + if (! (__iter41 instanceof Array || typeof __iter41 == "string" || __is_typed_array(__iter41) || __is_some_array(__iter41) )) { __iter41 = __object_keys__(__iter41) } + for (var __idx41=0; __idx41 < __iter41.length; __idx41++) { + var other = __iter41[ __idx41 ]; other.postMessage(__jsdict([["type", "__setitem__"], ["argindex", event.data.argindex], ["key", event.data.index], ["value", event.data.value]])); } } else { @@ -3795,10 +3805,10 @@ var __start_new_thread = function(f, args) { jsargs = []; var i; i = 0; - var __iter43 = args; - if (! (__iter43 instanceof Array || typeof __iter43 == "string" || __is_typed_array(__iter43) || __is_some_array(__iter43) )) { __iter43 = __object_keys__(__iter43) } - for (var __idx43=0; __idx43 < __iter43.length; __idx43++) { - var arg = __iter43[ __idx43 ]; + var __iter42 = args; + if (! (__iter42 instanceof Array || typeof __iter42 == "string" || __is_typed_array(__iter42) || __is_some_array(__iter42) )) { __iter42 = __object_keys__(__iter42) } + for (var __idx42=0; __idx42 < __iter42.length; __idx42++) { + var arg = __iter42[ __idx42 ]; if (__test_if_true__(arg.jsify)) { jsargs.append(arg.jsify()); } else { diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index f04ff4b..63c0567 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -1410,12 +1410,12 @@ def __init__(self, js_object=None, pointer=None): elif js_object: ob = js_object if instanceof(ob, Array): - with lowlevel: - for o in ob: - if instanceof(o, Array): - self.__setitem__( o[0], o[1] ) - else: - self.__setitem__( o['key'], o['value'] ) + #with lowlevel: + for o in ob: + if instanceof(o, Array): + self.__setitem__( o[0], o[1] ) + else: + self.__setitem__( o['key'], o['value'] ) elif isinstance(ob, dict): for key in ob.keys(): value = ob[ key ] @@ -1484,6 +1484,7 @@ def __getitem__(self, key): ''' with javascript: __dict = self[...] + err = False if instanceof(key, Array): #key = JSON.stringify( key ) ## fails on objects with circular references ## key = __tuple_key__(key) @@ -1491,12 +1492,18 @@ def __getitem__(self, key): # Test undefined because it can be in the dict if JS("key.__uid__ && key.__uid__ in __dict"): return JS('__dict[key.__uid__]') - raise KeyError(key) + else: + err = True if __dict and JS("key in __dict"): return JS('__dict[key]') + else: + err = True - raise KeyError(key) + if err: + msg = "missing key: %s" %key + msg += "\n - dict keys: %s" %inline('Object.keys(__dict)') + raise KeyError(msg) def __setitem__(self, key, value): with javascript: diff --git a/regtests/dict/tuple_keys.py b/regtests/dict/tuple_keys.py index 667a9c8..7d3dea0 100644 --- a/regtests/dict/tuple_keys.py +++ b/regtests/dict/tuple_keys.py @@ -26,3 +26,9 @@ def main(): TestError( D2[aa]=='hello' ) TestError( D2[bb]=='world' ) TestError( D2[ab]=='XXX') + + r = { s:1, a:aa } + r2 = {} + for x in [ s, a ]: + r2[ x ] = r[ x ] + TestError( r[s] is r2[s] ) \ No newline at end of file From 8d1680d644947ca1bfaf4788d158d80c843dc8c3 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 30 Jul 2014 07:26:33 -0700 Subject: [PATCH 169/222] fixed string keys in normal mode. --- pythonjs/pythonjs.js | 80 +++++++++++++++++++++--------------- pythonjs/runtime/builtins.py | 29 +++++++++---- 2 files changed, 67 insertions(+), 42 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index d5b7378..19a4a8f 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -2707,6 +2707,9 @@ var __tuple_key__ = function(arr) { r.append(__tuple_key__(item)); } else { if (( t ) == "object") { + if (( item.__uid__ ) === undefined) { + throw new KeyError(item); + } r.append(item.__uid__); } else { r.append(item); @@ -2723,7 +2726,7 @@ __dict_attrs = {}; __dict_parents = []; __dict_properties = {}; var __dict___init__ = function(args, kwargs) { - var ob,value; + var k,ob,value,v; var __sig__,__args__; __sig__ = { kwargs:{"js_object": null, "pointer": null},args:["self", "js_object", "pointer"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { @@ -2744,27 +2747,30 @@ var __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__45; - __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1191: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1192: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { o = __next__45(); - if (__test_if_true__(o instanceof Array)) { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1193: self.__setitem__( o[0], o[1] )"), "__call__")([((o instanceof Array) ? o[0] : __get__(o, "__getitem__", "line 1193: self.__setitem__( o[0], o[1] )")([0], __NULL_OBJECT__)), ((o instanceof Array) ? o[1] : __get__(o, "__getitem__", "line 1193: self.__setitem__( o[0], o[1] )")([1], __NULL_OBJECT__))], __NULL_OBJECT__); + if (o instanceof Array) { + k = o[0]; + v = o[1]; } else { - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1195: self.__setitem__( o['key'], o['value'] )"), "__call__")([((o instanceof Array) ? o["key"] : __get__(o, "__getitem__", "line 1195: self.__setitem__( o['key'], o['value'] )")(["key"], __NULL_OBJECT__)), ((o instanceof Array) ? o["value"] : __get__(o, "__getitem__", "line 1195: self.__setitem__( o['key'], o['value'] )")(["value"], __NULL_OBJECT__))], __NULL_OBJECT__); + k = o["key"]; + v = o["value"]; } + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1198: self.__setitem__( k,v )"), "__call__")([k, v], __NULL_OBJECT__); } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__46; - __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1197: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1200: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1198: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1199: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1201: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1202: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2790,15 +2796,15 @@ var __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__47; - __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1206: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1209: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - value = __get__(self["$wrapped"], "__getitem__", "line 1207: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1210: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1210: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1213: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2857,7 +2863,7 @@ var __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1223: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1226: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2881,12 +2887,12 @@ var __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__48; - __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1229: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1232: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1230: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1230: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1233: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1233: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } ;__dict_update.is_wrapper = true; @@ -2905,12 +2911,12 @@ var __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__49; - __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1233: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1236: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__49; __next__49 = __get__(__iterator__49, "next"); while (( __iterator__49.index ) < __iterator__49.length) { key = __next__49(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1234: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1237: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2953,7 +2959,7 @@ var __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1242: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1245: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } ;__dict_set.is_wrapper = true; __dict_attrs.set = __dict_set; @@ -3007,9 +3013,8 @@ var __dict___getitem__ = function(args, kwargs) { err = true; } if (__test_if_true__(err)) { - msg = __sprintf("missing key: %s", key); - msg += __sprintf("\n - dict keys: %s", Object.keys(__dict)); - throw new KeyError(msg); + msg = __sprintf("missing key: %s -\n", key); + throw new KeyError(__jsdict_keys(__dict)); } } ;__dict___getitem__.is_wrapper = true; @@ -3028,9 +3033,18 @@ var __dict___setitem__ = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; + if (( key ) === undefined) { + throw new KeyError("undefined is invalid key type"); + } + if (( key ) === null) { + throw new KeyError("null is invalid key type"); + } __dict = self["$wrapped"]; if (__test_if_true__(key instanceof Array)) { key = __tuple_key__(key); + if (( key ) === undefined) { + throw new KeyError("undefined is invalid key type (tuple)"); + } __dict[key] = value; } else { if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { @@ -3264,7 +3278,7 @@ var __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1421: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1421: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1429: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1429: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3288,7 +3302,7 @@ var __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1442: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1450: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; @@ -3321,7 +3335,7 @@ var __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1448: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1456: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3346,7 +3360,7 @@ var __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1456: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1456: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1464: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1464: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3384,7 +3398,7 @@ var __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1472: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1472: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1480: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1480: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3452,13 +3466,13 @@ var __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1492: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1492: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1500: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1500: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1497: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1505: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3516,7 +3530,7 @@ var __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1520: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1528: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; @@ -3535,12 +3549,12 @@ var __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1523: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1531: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1524: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1532: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; @@ -3580,7 +3594,7 @@ var __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1534: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1542: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; @@ -3597,9 +3611,9 @@ var __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1537: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1545: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1538: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1546: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index 63c0567..dd8db3a 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -1390,6 +1390,8 @@ def __tuple_key__(arr): elif instanceof(item, Array): r.append( __tuple_key__(item) ) elif t=='object': + if item.__uid__ is undefined: + raise KeyError(item) r.append( item.__uid__ ) else: r.append( item ) @@ -1410,12 +1412,15 @@ def __init__(self, js_object=None, pointer=None): elif js_object: ob = js_object if instanceof(ob, Array): - #with lowlevel: for o in ob: - if instanceof(o, Array): - self.__setitem__( o[0], o[1] ) - else: - self.__setitem__( o['key'], o['value'] ) + with lowlevel: + if instanceof(o, Array): + k= o[0]; v= o[1] + else: + k= o['key']; v= o['value'] + + self.__setitem__( k,v ) + elif isinstance(ob, dict): for key in ob.keys(): value = ob[ key ] @@ -1501,16 +1506,22 @@ def __getitem__(self, key): err = True if err: - msg = "missing key: %s" %key - msg += "\n - dict keys: %s" %inline('Object.keys(__dict)') - raise KeyError(msg) + msg = "missing key: %s -\n" %key + raise KeyError(__dict.keys()) def __setitem__(self, key, value): with javascript: + if key is undefined: + raise KeyError('undefined is invalid key type') + if key is null: + raise KeyError('null is invalid key type') + __dict = self[...] if instanceof(key, Array): #key = JSON.stringify( key ) ## fails on objects with circular references ## key = __tuple_key__(key) + if key is undefined: + raise KeyError('undefined is invalid key type (tuple)') inline( '__dict[key] = value') elif JS("typeof(key) === 'object' || typeof(key) === 'function'"): if JS("key.__uid__ === undefined"): @@ -1521,7 +1532,7 @@ def __setitem__(self, key, value): JS('__dict[key] = value') def keys(self): - with javascript: + with lowlevel: return Object.keys( self[...] ) def pop(self, key, d=None): From ac85478965bcfe26a36aa3867016f21981bc06c6 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 30 Jul 2014 20:58:49 -0700 Subject: [PATCH 170/222] regtest for builtin `round` --- regtests/lang/builtins.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/regtests/lang/builtins.py b/regtests/lang/builtins.py index df562bb..29ba91a 100644 --- a/regtests/lang/builtins.py +++ b/regtests/lang/builtins.py @@ -10,4 +10,8 @@ def main(): n = float('NaN') TestError( isNaN(n)==True ) + r = round( 1.1234, 2) + #print(r) + TestError( str(r) == '1.12' ) + From 5c00d750eed6f93fe802d002824b714bf87da529 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 30 Jul 2014 21:06:01 -0700 Subject: [PATCH 171/222] updated builtins regtest --- regtests/lang/builtins.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/regtests/lang/builtins.py b/regtests/lang/builtins.py index 29ba91a..7d2c9f3 100644 --- a/regtests/lang/builtins.py +++ b/regtests/lang/builtins.py @@ -14,4 +14,9 @@ def main(): #print(r) TestError( str(r) == '1.12' ) + r = round( 100.001, 2) + TestError( r == 100 ) + + i = int( 100.1 ) + TestError( i == 100 ) From 2a03ea83c301a84526fd3a5398766f19d64a245e Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 31 Jul 2014 16:59:41 -0700 Subject: [PATCH 172/222] fixed builtin round --- pythonjs/pythonjs.js | 69 +++++++++++++++++++----------------- pythonjs/pythonjs.py | 14 +++++++- pythonjs/runtime/builtins.py | 16 +++++---- regtests/lang/builtins.py | 6 ++++ 4 files changed, 65 insertions(+), 40 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 19a4a8f..50c0664 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -1686,9 +1686,9 @@ var float = function(args, kwargs) { } ;float.is_wrapper = true; var round = function(args, kwargs) { - var y,x,c,b; + var p,b; var __sig__,__args__; - __sig__ = { kwargs:{},args:["a", "places"] }; + __sig__ = { kwargs:{"places": 0},args:["a", "places"] }; if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) { /*pass*/ } else { @@ -1702,10 +1702,8 @@ var round = function(args, kwargs) { if (( b.indexOf(".") ) == -1) { return a; } else { - c = b.split("."); - x = c[0]; - y = c[1].substring(0, places); - return parseFloat(((x + ".") + y)); + p = Math.pow(10, places); + return (Math.round((a * p)) / p); } } ;round.is_wrapper = true; @@ -2759,18 +2757,25 @@ var __dict___init__ = function(args, kwargs) { k = o["key"]; v = o["value"]; } - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1198: self.__setitem__( k,v )"), "__call__")([k, v], __NULL_OBJECT__); + try { +__get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1199: self.__setitem__( k,v )"), "__call__")([k, v], __NULL_OBJECT__); + } catch(__exception__) { +if (__exception__ == KeyError || __exception__ instanceof KeyError) { +throw new KeyError("error in dict init, bad key"); +} + +} } } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__46; - __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1200: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1203: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1201: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1202: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1204: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1205: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { console.log("ERROR init dict from:", js_object); @@ -2796,15 +2801,15 @@ var __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__47; - __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1209: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1212: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - value = __get__(self["$wrapped"], "__getitem__", "line 1210: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1213: value = self[...][key]")([key], __NULL_OBJECT__); if (( typeof(value) ) == "object") { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1213: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1216: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if (( typeof(value) ) == "function") { @@ -2863,7 +2868,7 @@ var __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1226: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1229: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2887,12 +2892,12 @@ var __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__48; - __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1232: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1235: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1233: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1233: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1236: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1236: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } } ;__dict_update.is_wrapper = true; @@ -2911,12 +2916,12 @@ var __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__49; - __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1236: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1239: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__49; __next__49 = __get__(__iterator__49, "next"); while (( __iterator__49.index ) < __iterator__49.length) { key = __next__49(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1237: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1240: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; } @@ -2959,7 +2964,7 @@ var __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1245: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1248: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); } ;__dict_set.is_wrapper = true; __dict_attrs.set = __dict_set; @@ -3278,7 +3283,7 @@ var __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1429: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1429: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1432: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1432: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3302,7 +3307,7 @@ var __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1450: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1453: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); } ;__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; @@ -3335,7 +3340,7 @@ var __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1456: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1459: arr = self.to_array()"), "__call__")(); if (( arr.indexOf(value) ) == -1) { return false; } else { @@ -3360,7 +3365,7 @@ var __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1464: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1464: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1467: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1467: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3398,7 +3403,7 @@ var __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1480: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1480: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1483: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1483: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if (( self.typecode ) == "float8") { @@ -3466,13 +3471,13 @@ var __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1500: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1500: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1503: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1503: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1505: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1508: item = lst[i]")([i], __NULL_OBJECT__)); if (( typecode ) == "float8") { item *= self._norm_set; } else { @@ -3530,7 +3535,7 @@ var __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1528: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1531: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); } ;__array_append.is_wrapper = true; @@ -3549,12 +3554,12 @@ var __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1531: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1534: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1532: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1535: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } } ;__array_extend.is_wrapper = true; @@ -3594,7 +3599,7 @@ var __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1542: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1545: return self.to_array()"), "__call__")(); } ;__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; @@ -3611,9 +3616,9 @@ var __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1545: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1548: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1546: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1549: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 3910e7c..fc61459 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -338,9 +338,14 @@ def _visit_function(self, node): raise RuntimeError(chunks) sub = [] for ci,chk in enumerate(chunks): + #if not chk.startswith('@'): ## special inline javascript. + # chk = '```'+chk+'```' + #chk = chk.replace('$', '```') + if not ci%2: if '@' in chk: raise SyntaxError(chunks) + if ci==0: if chk: sub.append('"%s"'%chk) @@ -363,6 +368,7 @@ def _visit_function(self, node): lines.append( 'glsljit.push(%s);' %''.join(sub)) else: + sub = sub.replace('$', '```') lines.append( 'glsljit.push("%s");' %(self.indent()+sub) ) @@ -400,9 +406,11 @@ def _visit_function(self, node): lines.append(' var __webclgl = new WebCLGL()') lines.append(' var header = glsljit.compile_header()') lines.append(' var shader = glsljit.compile_main()') - lines.append(' console.log(header)') + + #lines.append(' console.log(header)') lines.append(' console.log("-----------")') lines.append(' console.log(shader)') + ## create the webCLGL kernel, compiles GLSL source lines.append(' var __kernel = __webclgl.createKernel( shader, header );') @@ -1072,6 +1080,8 @@ def visit_For(self, node): '`@var %s = %s[0];`' %(target, iter) ## capture first item with target name so that for loops can get the length of member arrays ] + ##TODO## lines.append('$') ## optimizes webclgl parser + lines.append('for (int _iter=0; _iter < `__length__`; _iter++) {' ) ## declare struct variable ## @@ -1082,6 +1092,8 @@ def visit_For(self, node): lines.append( '`@glsljit.push("if (_iter==" +__j+ ") { %s=%s_" +__j+ ";}");`' %(target, iter)) lines.append( '`@}`') + ##TODO## lines.append('$') ## optimizes webclgl parser + elif isinstance(node.iter, ast.Call): ## `for i in range(n):` iter = self.visit(node.iter.args[0]) diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index dd8db3a..767f274 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -812,17 +812,16 @@ def float(a): raise ValueError('can not convert to float: '+a) return b -def round(a, places): +def round(a, places=0): with javascript: b = '' + a if b.indexOf('.') == -1: return a else: - c = b.split('.') - x = c[0] - y = c[1].substring(0, places) - return parseFloat( x+'.'+y ) - + ## this could return NaN with large numbers and large places, + ## TODO check for NaN and instead fallback to `a.toFixed(places)` + p = Math.pow(10, places) + return Math.round(a * p) / p def str(s): return ''+s @@ -1419,7 +1418,10 @@ def __init__(self, js_object=None, pointer=None): else: k= o['key']; v= o['value'] - self.__setitem__( k,v ) + try: + self.__setitem__( k,v ) + except KeyError: + raise KeyError('error in dict init, bad key') elif isinstance(ob, dict): for key in ob.keys(): diff --git a/regtests/lang/builtins.py b/regtests/lang/builtins.py index 7d2c9f3..61cbd2a 100644 --- a/regtests/lang/builtins.py +++ b/regtests/lang/builtins.py @@ -20,3 +20,9 @@ def main(): i = int( 100.1 ) TestError( i == 100 ) + r = round( 5.49 ) + TestError( r == 5 ) + + r = round( 5.49, 1 ) + TestError( r == 5.5 ) + From a4f9f527fd64fb47f1c56cb5aa1223c8016c59f6 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 31 Jul 2014 17:56:23 -0700 Subject: [PATCH 173/222] Golang backend: hello world. --- pythonjs/pythonjs_to_go.py | 22 +++++++++++++++++++--- regtests/exceptions/AttributeError.py | 13 +++++++++++++ regtests/go/print.py | 4 ++++ regtests/run.py | 27 ++++++++++++++++++--------- 4 files changed, 54 insertions(+), 12 deletions(-) create mode 100644 regtests/exceptions/AttributeError.py create mode 100644 regtests/go/print.py diff --git a/pythonjs/pythonjs_to_go.py b/pythonjs/pythonjs_to_go.py index 6b3c46e..060c7a4 100644 --- a/pythonjs/pythonjs_to_go.py +++ b/pythonjs/pythonjs_to_go.py @@ -15,6 +15,11 @@ def __init__(self, requirejs=False, insert_runtime=False): #self._classes = dict() #self._class_props = dict() + def visit_Print(self, node): + r = [ 'fmt.Print(%s);' %self.visit(e) for e in node.values] + return ''.join(r) + + def visit_Module(self, node): header = [ 'package main', @@ -63,9 +68,20 @@ def _visit_call_helper_var(self, node): out = [] for v in args: - out.append( self.indent() + 'var ' + v) - - return '\n'.join(out) + out.append( self.indent() + 'var ' + v + ' int') + + #return '\n'.join(out) + return '' + + def visit_Assign(self, node): + target = node.targets[0] + if isinstance(target, ast.Tuple): + raise NotImplementedError('target tuple assignment should have been transformed to flat assignment by python_to_pythonjs.py') + else: + target = self.visit(target) + value = self.visit(node.value) + code = 'var %s = %s;' % (target, value) + return code def main(script): diff --git a/regtests/exceptions/AttributeError.py b/regtests/exceptions/AttributeError.py new file mode 100644 index 0000000..bb302ae --- /dev/null +++ b/regtests/exceptions/AttributeError.py @@ -0,0 +1,13 @@ +"""catch AttributeError""" + +class A: pass + +def main(): + a = A() + b = False + try: + b = a.xxx + except AttributeError: + b = True + + TestError( b == True ) diff --git a/regtests/go/print.py b/regtests/go/print.py new file mode 100644 index 0000000..363f081 --- /dev/null +++ b/regtests/go/print.py @@ -0,0 +1,4 @@ +"""hello world""" + +def main(): + print "hi" diff --git a/regtests/run.py b/regtests/run.py index fc6e013..e826ab2 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -142,9 +142,13 @@ def run_old_pypy_test_on(filename): old_pypy_runnable = True old_pypy_exe = os.path.expanduser('~/pypy-1.9/bin/pypy') -webclgl = None -if os.path.isfile( os.path.expanduser('~/webclgl/WebCLGL_2.0.Min.class.js') ): - webclgl = open( os.path.expanduser('~/webclgl/WebCLGL_2.0.Min.class.js'), 'rb').read().decode('utf-8') +webclgl = [] +if os.path.isdir( os.path.expanduser('~/webclgl') ): + #webclgl.append( open( os.path.expanduser('~/webclgl/WebCLGL_2.0.Min.class.js'), 'rb').read().decode('utf-8') ) + webclgl.append( open( os.path.expanduser('~/webclgl/WebCLGLUtils.class.js'), 'rb').read().decode('utf-8') ) + webclgl.append( open( os.path.expanduser('~/webclgl/WebCLGLBuffer.class.js'), 'rb').read().decode('utf-8') ) + webclgl.append( open( os.path.expanduser('~/webclgl/WebCLGLKernel.class.js'), 'rb').read().decode('utf-8') ) + webclgl.append( open( os.path.expanduser('~/webclgl/WebCLGL.class.js'), 'rb').read().decode('utf-8') ) ## rhino is not run by default because it simply freezes up on maximum callstack errors rhino_runnable = '--rhino' in sys.argv and runnable("rhino -e 'quit()'") @@ -432,10 +436,11 @@ def patch_python(filename, dart=False, python='PYTHONJS', backend=None): # out.append( line ) # code = '\n'.join( out ) a = [ - _patch_header, 'PYTHON="%s"'%python, 'BACKEND="%s"'%backend, ] + if backend != 'GO': + a.append(_patch_header) if python != 'PYTHONJS': code = typedpython.transform_source( code, strip=True ) @@ -693,9 +698,10 @@ def run_js_nodewebkit(content): html = [''] if webclgl: - html.append('') + for data in webclgl: + html.append('') html.append('') + if script is True: + self._html_tail.extend( o ) + else: + for y in o: + writer.write(y) + + else: + writer.write(line) + elif line.strip() == '': - if script: + if type(script) is list and len(script): source = '\n'.join(script) - script = True - self._html_tail.append( '') + script = True + self._html_tail.append( '') + else: + writer.write( line ) elif isinstance( script, list ): script.append( line ) @@ -174,7 +201,7 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._direct_operators = set() ## optimize "+" and "*" operator self._with_ll = False ## lowlevel - self._with_js = False + self._with_js = True self._in_lambda = False self._in_while_test = False self._use_threading = False @@ -272,8 +299,14 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._source = source.splitlines() + if '--debug' in sys.argv: + try: + tree = ast.parse( source ) + except: + raise SyntaxError(source) + else: + tree = ast.parse( source ) - tree = parse( source ) ## ast.parse self._generator_function_nodes = collect_generator_functions( tree ) for node in tree.body: diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index d9db207..41a234f 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -1265,6 +1265,7 @@ def main(source, requirejs=True, insert_runtime=True, webworker=False, function_ head = [] tail = [] script = False + osource = source if source.strip().startswith('') script = list() elif line.strip() == '': - if script: + if type(script) is list: source = '\n'.join(script) - script = True - tail.append( '') + script = True + tail.append( '') + elif script is True: + tail.append( '') + else: + head.append( '') elif isinstance( script, list ): script.append( line ) @@ -1315,6 +1320,10 @@ def main(source, requirejs=True, insert_runtime=True, webworker=False, function_ sys.stderr.write( lines[lineno] ) sys.stderr.write( '\n' ) + if '--debug' in sys.argv: + sys.stderr.write( osource ) + sys.stderr.write( '\n' ) + sys.exit(1) gen = JSGenerator( requirejs=requirejs, insert_runtime=insert_runtime, webworker=webworker, function_expressions=function_expressions ) diff --git a/pythonjs/translator.py b/pythonjs/translator.py index 0d12938..b133f66 100755 --- a/pythonjs/translator.py +++ b/pythonjs/translator.py @@ -51,6 +51,7 @@ def main(script, module_path=None): code = pythonjs_to_luajs( a ) else: a = python_to_pythonjs(script, module_path=module_path) + if isinstance(a, dict): res = {} for jsfile in a: From 1dc78a8c9b59b12f053ea3e25fafc8128e113457 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 30 Aug 2014 08:21:08 -0700 Subject: [PATCH 207/222] improved `new` syntax keyword. --- pythonjs/pythonjs.py | 5 ++++- pythonjs/typedpython.py | 5 +++-- regtests/html/date.html | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 regtests/html/date.html diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 41a234f..b56c759 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -950,7 +950,10 @@ def visit_BinOp(self, node): op = self.visit(node.op) right = self.visit(node.right) - if op == '<<': + if op == '>>' and left == '__new__': + return ' new %s' %right + + elif op == '<<': if left in ('__go__receive__', '__go__send__'): return '<- %s' %right elif isinstance(node.left, ast.Call) and isinstance(node.left.func, ast.Name) and node.left.func.id in ('__go__array__', '__go__arrayfixed__', '__go__map__'): diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index d4d813c..5f9ff3e 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -155,8 +155,9 @@ def transform_source( source, strip=False ): elif c.startswith('import ') and '-' in c: c = c.replace('-', '__DASH__') elif ' new ' in c: - c += ')' * c.count(' new ') - c = c.replace(' new ', ' new(') + #c += ')' * c.count(' new ') + #c = c.replace(' new ', ' new(') + c = c.replace(' new ', ' __new__>>') diff --git a/regtests/html/date.html b/regtests/html/date.html new file mode 100644 index 0000000..97b3f50 --- /dev/null +++ b/regtests/html/date.html @@ -0,0 +1,18 @@ + + + + + + + + + + \ No newline at end of file From db92530aec387684ae811f0c48fa7db3eb1ecf21 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sat, 30 Aug 2014 09:40:53 -0700 Subject: [PATCH 208/222] fixed `JS(" new XXX")` --- pythonjs/pythonjs.py | 4 +++- regtests/lang/new.py | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 regtests/lang/new.py diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index b56c759..8dd2704 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -919,7 +919,9 @@ def _inline_code_helper(self, s): ## TODO, should newline be changed here? s = s.replace('\n', '\\n').replace('\0', '\\0') ## AttributeError: 'BinOp' object has no attribute 's' - this is caused by bad quotes if s.strip().startswith('#'): s = '/*%s*/'%s - if '"' in s or "'" in s: ## can not trust direct-replace hacks + if '__new__>>' in s: ## fixes inline `JS("new XXX")` + s = s.replace('__new__>>', ' new ') + elif '"' in s or "'" in s: ## can not trust direct-replace hacks pass else: if ' or ' in s: diff --git a/regtests/lang/new.py b/regtests/lang/new.py new file mode 100644 index 0000000..b65296b --- /dev/null +++ b/regtests/lang/new.py @@ -0,0 +1,8 @@ +''' +js new keyword +''' + +def main(): + #a = new Date() ## this also works + a = JS(' new Date()') + TestError( a.getFullYear()==2014 ) From 628d2a8e664d34822b71fb6a0785767c5f9a9b1d Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 1 Sep 2014 07:21:49 -0700 Subject: [PATCH 209/222] fixed ` new XXX` tab space before new. --- pythonjs/typedpython.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 5f9ff3e..c2ebf3e 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -154,11 +154,11 @@ def transform_source( source, strip=False ): output.append( indent + '@returns(%s)' %rtype) elif c.startswith('import ') and '-' in c: c = c.replace('-', '__DASH__') - elif ' new ' in c: - #c += ')' * c.count(' new ') - #c = c.replace(' new ', ' new(') - c = c.replace(' new ', ' __new__>>') + if ' new ' in c: + c = c.replace(' new ', ' __new__>>') + if '\tnew ' in c: + c = c.replace('\tnew ', ' __new__>>') ## golang From c7a77447d4a95edef50bd4ee064c93e7c14f8d78 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 3 Sep 2014 02:18:45 -0700 Subject: [PATCH 210/222] new backend Gopherjs --- pythonjs/translator.py | 13 +++++++++++++ regtests/run.py | 19 +++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/pythonjs/translator.py b/pythonjs/translator.py index b133f66..0b772f9 100755 --- a/pythonjs/translator.py +++ b/pythonjs/translator.py @@ -27,6 +27,19 @@ def main(script, module_path=None): if '--go' in sys.argv: a = python_to_pythonjs(script, go=True, module_path=module_path) code = pythonjs_to_go( a ) + elif '--gopherjs' in sys.argv: + a = python_to_pythonjs(script, go=True, module_path=module_path) + code = pythonjs_to_go( a ) + + exe = os.path.expanduser('~/go/bin/gopherjs') + if not os.path.isfile(exe): + raise RuntimeError('gopherjs not installed to ~/go/bin/gopherjs') + import subprocess + path = '/tmp/gopherjs-input.go' + open(path, 'wb').write(code) + subprocess.check_call([exe, 'build', path], cwd='/tmp') + code = open('/tmp/gopherjs-input.js', 'rb').read() + elif '--dart' in sys.argv: a = python_to_pythonjs(script, dart=True, module_path=module_path) code = pythonjs_to_dart( a ) diff --git a/regtests/run.py b/regtests/run.py index 9a8702a..cf5ff34 100755 --- a/regtests/run.py +++ b/regtests/run.py @@ -194,6 +194,7 @@ def run_old_pypy_test_on(filename): luajs_runnable = os.path.isfile( lua2js ) and '--lua2js' in sys.argv go_runnable = runnable( 'go version') +gopherjs_runnable = runnable( 'gopherjs') assert rhino_runnable or node_runnable @@ -474,7 +475,7 @@ def run_python3_test_on(filename): -def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False, luajs=False, go=False, multioutput=False, requirejs=True): +def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False, luajs=False, go=False, gopherjs=False, multioutput=False, requirejs=True): global tmpname tmpname = os.path.join( tempfile.gettempdir(), @@ -506,7 +507,7 @@ def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False ] content = '\n'.join( source ) - elif go: + elif go or gopherjs: content = patch_python(filename, backend='GO') else: @@ -535,6 +536,8 @@ def translate_js(filename, javascript=False, dart=False, coffee=False, lua=False cmd.append( '--luajs') elif go: cmd.append( '--go' ) + elif gopherjs: + cmd.append( '--gopherjs' ) if not requirejs: cmd.append( '--no-wrapper' ) @@ -799,6 +802,15 @@ def run_go(content): return run_command( '/tmp/regtest-go' ) +def run_pythonjs_gopherjs_test(dummy_filename): + """PythonJS (Gopherjs)""" + return run_if_no_error(run_gopherjs_node) + +def run_gopherjs_node(content): + """Run Gopherjs using Node""" + write("%s.js" % tmpname, content) + return run_command("node %s.js" % tmpname) + def run_html_test( filename, sum_errors ): lines = open(filename, 'rb').read().decode('utf-8').splitlines() filename = os.path.split(filename)[-1] @@ -967,6 +979,9 @@ def display(function): js = translate_js(filename, go=True) display(run_pythonjs_go_test) + if gopherjs_runnable: + js = translate_js(filename, gopherjs=True) + display(run_pythonjs_gopherjs_test) print() return sum_errors From 276b5f79b64b38de676c01384bd4460ba822f829 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 3 Sep 2014 09:18:07 -0700 Subject: [PATCH 211/222] Go backend: fixed chan test, and sending data over a channel. --- pythonjs/python_to_pythonjs.py | 1 + pythonjs/pythonjs_to_go.py | 21 ++++++++++++++++----- pythonjs/typedpython.py | 9 +++++---- regtests/go/chan.py | 15 +++++++-------- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 4bbba7a..d3fa084 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2780,6 +2780,7 @@ def visit_FunctionDef(self, node): local_typedefs.append( '%s=%s' %(kw.arg, kwval)) if decorator.func.id=='typedef_chan': typedef_chans.append( kw.arg ) + writer.write('@__typedef_chan__(%s=%s)' %(kw.arg, kwval)) else: writer.write('@__typedef__(%s=%s)' %(kw.arg, kwval)) diff --git a/pythonjs/pythonjs_to_go.py b/pythonjs/pythonjs_to_go.py index 9eecbe4..4bccfe4 100644 --- a/pythonjs/pythonjs_to_go.py +++ b/pythonjs/pythonjs_to_go.py @@ -217,20 +217,26 @@ def _visit_call_helper_go(self, node): return 'go %s' %self.visit(node.args[0]) elif name == '__gomake__': return 'make(%s)' %self.visit(node.args[0]) + elif name == '__go_make_chan__': + return 'make(chan %s)' %self.visit(node.args[0]) else: - return SyntaxError('invalid special go call') + raise SyntaxError('invalid special go call') def _visit_function(self, node): if self._function_stack[0] is node: self._vars = set() args_typedefs = {} + chan_args_typedefs = {} return_type = None for decor in node.decorator_list: if isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == '__typedef__': for key in decor.keywords: #args_typedefs[ key.arg ] = key.value.id args_typedefs[ key.arg ] = self.visit(key.value) + elif isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == '__typedef_chan__': + for key in decor.keywords: + chan_args_typedefs[ key.arg ] = self.visit(key.value) elif isinstance(decor, ast.Call) and isinstance(decor.func, ast.Name) and decor.func.id == 'returns': if decor.keywords: raise SyntaxError('invalid go return type') @@ -248,7 +254,7 @@ def _visit_function(self, node): for i, arg in enumerate(node.args.args): arg_name = arg.id - if arg_name not in args_typedefs: + if arg_name not in args_typedefs.keys()+chan_args_typedefs.keys(): if arg_name=='self': assert i==0 is_method = True @@ -258,8 +264,13 @@ def _visit_function(self, node): err += '\n missing typedef: %s' %arg.id raise SyntaxError(err) - arg_type = args_typedefs[arg_name] - a = '%s %s' %(arg_name, arg_type) + if arg_name in args_typedefs: + arg_type = args_typedefs[arg_name] + a = '%s %s' %(arg_name, arg_type) + else: + arg_type = chan_args_typedefs[arg_name] + a = '%s chan %s' %(arg_name, arg_type) + dindex = i - offset if a.startswith('__variable_args__'): ## TODO support go `...` varargs @@ -347,7 +358,7 @@ def visit_Assign(self, node): elif isinstance(node.value, ast.BinOp) and self.visit(node.value.op)=='<<' and isinstance(node.value.left, ast.Name) and node.value.left.id=='__go__send__': target = self.visit(target) value = self.visit(node.value.right) - return 'var %s <- %s;' % (target, value) + return '%s <- %s;' % (target, value) elif not self._function_stack: target = self.visit(target) diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index c2ebf3e..7f31496 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -23,7 +23,7 @@ GO_SPECIAL_CALLS = { 'go' : '__go__', - 'go.channel' : '__gomake__', + 'go.channel' : '__go_make_chan__', } def transform_source( source, strip=False ): @@ -267,8 +267,9 @@ def transform_source( source, strip=False ): y, kw = y.split('=') arg, typedef = y.split(':') chan = False - if len(arg.split()) == 2: - chan, arg = arg.split() + if len(typedef.strip().split()) == 2: + chan = True + typedef = typedef.strip().split()[-1] if '*' in arg: arg_name = arg.split('*')[-1] else: @@ -385,7 +386,7 @@ def xxx(): def call_method( cb:func(int)(int) ) ->int: return cb(3) -def wrapper(a:int, chan c:int): +def wrapper(a:int, c:chan int): result = longCalculation(a) c <- result diff --git a/regtests/go/chan.py b/regtests/go/chan.py index 1ddbcf1..fdf6e02 100644 --- a/regtests/go/chan.py +++ b/regtests/go/chan.py @@ -1,17 +1,16 @@ -"""a <- """ +"""send int over channel""" + +def wrapper(a:int, c: chan int): + result = 100 + c <- result def main(): c = go.channel(int) - - def wrapper(a:int, chan c:int): - result = 100 - c <- result - go( - wrapper(17, c) - ) + go( wrapper(17, c) ) # Do other work in the current goroutine until the channel has a result. x = <-c print(x) + TestError(x==100) From c1a088b9cd45b1a37b1945290fec9326188ef11c Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 3 Sep 2014 13:40:18 -0700 Subject: [PATCH 212/222] Go backend: fixed select on channel --- pythonjs/python_to_pythonjs.py | 2 +- pythonjs/pythonjs_to_go.py | 61 ++++++++++++++++++++++++++++++++-- regtests/go/select.py | 44 +++++++++++++++++++----- 3 files changed, 95 insertions(+), 12 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index d3fa084..802ec1a 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -2107,7 +2107,7 @@ def _visit_assign_helper(self, node, target): writer.write("%s = __ternary_operator__(instanceof(%s,Array), %s[%s], %s)" % (self.visit(target), r, r,i, fallback )) def visit_Print(self, node): - writer.write('print %s' % ', '.join(map(self.visit, node.values))) + writer.write('print(%s)' % ', '.join(map(self.visit, node.values))) def visit_Str(self, node): s = node.s.replace('\\','\\\\').replace('\n', '\\n').replace('\r', '\\r').replace('\0', '\\0') diff --git a/pythonjs/pythonjs_to_go.py b/pythonjs/pythonjs_to_go.py index 4bccfe4..73e4864 100644 --- a/pythonjs/pythonjs_to_go.py +++ b/pythonjs/pythonjs_to_go.py @@ -18,6 +18,7 @@ def __init__(self, requirejs=False, insert_runtime=False): self._class_props = dict() self._vars = set() + self._known_vars = set() self._kwargs_type_ = dict() def visit_ClassDef(self, node): @@ -89,7 +90,13 @@ def visit_Slice(self, node): def visit_Print(self, node): - r = [ 'fmt.Println(%s);' %self.visit(e) for e in node.values] + r = [] + for e in node.values: + s = self.visit(e) + if isinstance(e, ast.List): + r.append('fmt.Println(%s);' %s[1:-1]) + else: + r.append('fmt.Println(%s);' %s) return ''.join(r) def visit_Expr(self, node): @@ -225,6 +232,7 @@ def _visit_call_helper_go(self, node): def _visit_function(self, node): if self._function_stack[0] is node: self._vars = set() + self._known_vars = set() args_typedefs = {} chan_args_typedefs = {} @@ -350,6 +358,47 @@ def _visit_call_helper_var(self, node): #return '\n'.join(out) return '' + def visit_With(self, node): + r = [] + is_switch = False + if isinstance( node.context_expr, ast.Name ) and node.context_expr.id == '__default__': + r.append('default:') + elif isinstance( node.context_expr, ast.Name ) and node.context_expr.id == '__select__': + r.append('select {') + is_switch = True + elif isinstance( node.context_expr, ast.Call ): + if not isinstance(node.context_expr.func, ast.Name): + raise SyntaxError( self.visit(node.context_expr)) + + if len(node.context_expr.args): + a = self.visit(node.context_expr.args[0]) + else: + assert len(node.context_expr.keywords) + ## need to catch if this is a new variable ## + name = node.context_expr.keywords[0].arg + if name not in self._known_vars: + a = '%s := %s' %(name, self.visit(node.context_expr.keywords[0].value)) + else: + a = '%s = %s' %(name, self.visit(node.context_expr.keywords[0].value)) + + if node.context_expr.func.id == '__case__': + r.append('case %s:' %a) + elif node.context_expr.func.id == '__switch__': + r.append('switch (%s) {' %self.visit(node.context_expr.args[0])) + is_switch = True + else: + raise SyntaxError( 'invalid use of with') + + + for b in node.body: + a = self.visit(b) + if a: r.append(a) + + if is_switch: + r.append('}') + + return '\n'.join(r) + def visit_Assign(self, node): target = node.targets[0] if isinstance(target, ast.Tuple): @@ -369,15 +418,22 @@ def visit_Assign(self, node): target = self.visit(target) value = self.visit(node.value) self._vars.remove( target ) + self._known_vars.add( target ) return '%s := %s;' % (target, value) else: target = self.visit(target) value = self.visit(node.value) + + #if '<-' in value: + # raise RuntimeError(target+value) + return '%s = %s;' % (target, value) def visit_While(self, node): - body = [ 'for %s {' %self.visit(node.test)] + cond = self.visit(node.test) + if cond == 'true' or cond == '1': cond = '' + body = [ 'for %s {' %cond] self.push() for line in list( map(self.visit, node.body) ): body.append( self.indent()+line ) @@ -393,6 +449,7 @@ def _inline_code_helper(self, s): def main(script, insert_runtime=True): + if insert_runtime: dirname = os.path.dirname(os.path.abspath(__file__)) dirname = os.path.join(dirname, 'runtime') diff --git a/regtests/go/select.py b/regtests/go/select.py index f0cb7f0..6bcb8fe 100644 --- a/regtests/go/select.py +++ b/regtests/go/select.py @@ -1,17 +1,43 @@ """go select""" +def send_data( A:chan int, B:chan int, X:int, Y:int): + while True: + print('sending data..') + A <- X + B <- Y + +def select_loop(A:chan int, B:chan int, W:chan int) -> int: + print('starting select loop') + y = 0 + while True: + print('select loop:',y) + select: + case x = <- A: + y += x + W <- y + case x = <- B: + y += x + W <- y + print('end select loop', y) + return y + def main(): a = go.channel(int) b = go.channel(int) + w = go.channel(int) - a <- 1 - b <- 2 - y = 0 + go( + select_loop(a,b, w) + ) + + + go( + send_data(a,b, 5, 10) + ) - select: - case x = <- a: - y += x - case x = <- b: - y += x + z = 0 + while z < 100: + z = <- w + print('main loop', z) - print(y) + print('end test') \ No newline at end of file From 284180b42f104a024b127b97e7b4e3f48230b831 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 4 Sep 2014 10:44:25 -0700 Subject: [PATCH 213/222] function expressions are now the default function type (hoisted functions are not default anymore) this breaks some of the regtests that were prototypes for auto async transform using functions like `sleep`. --- pythonjs/pythonjs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 8dd2704..8eb22bd 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -25,7 +25,7 @@ def __init__(self, node): RuntimeError.__init__(self) class JSGenerator(NodeVisitor): #, inline_function.Inliner): - def __init__(self, requirejs=True, insert_runtime=True, webworker=False, function_expressions=False): + def __init__(self, requirejs=True, insert_runtime=True, webworker=False, function_expressions=True): #writer = code_writer.Writer() #self.setup_inliner( writer ) self._func_expressions = function_expressions @@ -1266,7 +1266,7 @@ def generate_runtime(): ] return '\n'.join( lines ) -def main(source, requirejs=True, insert_runtime=True, webworker=False, function_expressions=False): +def main(source, requirejs=True, insert_runtime=True, webworker=False, function_expressions=True): head = [] tail = [] script = False From de044f4785c9806c92c04708e6d6f54853db147c Mon Sep 17 00:00:00 2001 From: hartsantler Date: Fri, 5 Sep 2014 08:55:02 -0700 Subject: [PATCH 214/222] fixed array slice `a[:0]` --- pythonjs/pythonjs.js | 108 +++++++++++++++++------------------ pythonjs/runtime/builtins.py | 19 ++++-- 2 files changed, 69 insertions(+), 58 deletions(-) diff --git a/pythonjs/pythonjs.js b/pythonjs/pythonjs.js index 8feb509..fa6a00b 100644 --- a/pythonjs/pythonjs.js +++ b/pythonjs/pythonjs.js @@ -484,15 +484,6 @@ var __getargs__ = function(func_name, signature, args, kwargs) { return out; } -try { -/*pass*/ -} catch(__exception__) { -console.trace(); -console.error(__exception__, __exception__.message); -console.error("line 4: pythonjs.configure( runtime_exceptions=False )"); -throw new RuntimeError("line 4: pythonjs.configure( runtime_exceptions=False )"); - -} _PythonJS_UID = 0; IndexError = function(msg) {this.message = msg || "";}; IndexError.prototype = Object.create(Error.prototype); IndexError.prototype.name = "IndexError"; KeyError = function(msg) {this.message = msg || "";}; KeyError.prototype = Object.create(Error.prototype); KeyError.prototype.name = "KeyError"; @@ -507,7 +498,8 @@ var __getfast__ = function(ob, attr) { } else { return v; } -};__getfast__.is_wrapper = true; +} + var __wrap_function__ = function(f) { f.is_wrapper = true; @@ -1459,7 +1451,7 @@ var __create_class__ = function(class_name, parents, attrs, props) { } else { wrapper = __get__(object, name); if (__test_if_true__(! (wrapper.is_wrapper))) { - console.log("RUNTIME ERROR: failed to get wrapper for:", name); + console.log(["RUNTIME ERROR: failed to get wrapper for:", name]); } } } @@ -1496,7 +1488,7 @@ var type = function(args, kwargs) { var ob_or_class_name = __args__['ob_or_class_name']; var bases = __args__['bases']; var class_dict = __args__['class_dict']; - "\n type(object) -> the object's type\n type(name, bases, dict) -> a new(type ## broken? - TODO test)\n "; + "\n type(object) -> the object's type\n type(name, bases, dict) -> a __new__>>type ## broken? - TODO test\n "; if (__test_if_true__((( bases ) === null && ( class_dict ) === null))) { return ob_or_class_name.__class__; } else { @@ -1537,7 +1529,7 @@ var getattr = function(args, kwargs) { if (__test_if_true__((prop && prop["get"]))) { return prop["get"]([ob], __jsdict([])); } else { - console.log("ERROR: getattr property error", prop); + console.log(["ERROR: getattr property error", prop]); } } else { return __get__(ob, attr); @@ -1563,7 +1555,7 @@ var setattr = function(args, kwargs) { if (__test_if_true__((prop && prop["set"]))) { prop["set"]([ob, value], __jsdict([])); } else { - console.log("ERROR: setattr property error", prop); + console.log(["ERROR: setattr property error", prop]); } } else { __set__(ob, attr, value); @@ -2007,7 +1999,9 @@ var _setup_array_prototype = function() { var i,arr,n; arr = []; start = (start | 0); - stop = (stop | this.length); + if (( stop ) === undefined) { + stop = this.length; + } if (( start ) < 0) { start = (this.length + start); } @@ -2327,7 +2321,7 @@ var sum = function(args, kwargs) { var arr = __args__['arr']; a = 0; var b,__iterator__40; - __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1064: for b in arr:"), "__call__")([], __NULL_OBJECT__); + __iterator__40 = __get__(__get__(arr, "__iter__", "no iterator - line 1065: for b in arr:"), "__call__")([], __NULL_OBJECT__); var __next__40; __next__40 = __get__(__iterator__40, "next"); while (( __iterator__40.index ) < __iterator__40.length) { @@ -2383,7 +2377,7 @@ var next = function(args, kwargs) { } __args__ = __getargs__("next", __sig__, args, kwargs); var obj = __args__['obj']; - return __get__(__get__(obj, "next", "missing attribute `next` - line 1082: return obj.next()"), "__call__")(); + return __get__(__get__(obj, "next", "missing attribute `next` - line 1083: return obj.next()"), "__call__")(); };next.is_wrapper = true; var map = function(args, kwargs) { var arr,v; @@ -2400,7 +2394,7 @@ var map = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__41; - __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1085: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__41 = __get__(__get__(objs, "__iter__", "no iterator - line 1086: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__41; __next__41 = __get__(__iterator__41, "next"); while (( __iterator__41.index ) < __iterator__41.length) { @@ -2425,7 +2419,7 @@ var filter = function(args, kwargs) { var objs = __args__['objs']; arr = []; var ob,__iterator__42; - __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1092: for ob in objs:"), "__call__")([], __NULL_OBJECT__); + __iterator__42 = __get__(__get__(objs, "__iter__", "no iterator - line 1093: for ob in objs:"), "__call__")([], __NULL_OBJECT__); var __next__42; __next__42 = __get__(__iterator__42, "next"); while (( __iterator__42.index ) < __iterator__42.length) { @@ -2450,7 +2444,7 @@ var min = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__43; - __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1099: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__43 = __get__(__get__(lst, "__iter__", "no iterator - line 1100: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__43; __next__43 = __get__(__iterator__43, "next"); while (( __iterator__43.index ) < __iterator__43.length) { @@ -2479,7 +2473,7 @@ var max = function(args, kwargs) { var lst = __args__['lst']; a = null; var value,__iterator__44; - __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1105: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__44 = __get__(__get__(lst, "__iter__", "no iterator - line 1106: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__44; __next__44 = __get__(__iterator__44, "next"); while (( __iterator__44.index ) < __iterator__44.length) { @@ -2585,7 +2579,7 @@ var __Iterator___init__ = function(args, kwargs) { self.obj = obj; self.index = index; self.length = len([obj], __NULL_OBJECT__); - self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1133: self.obj_get = obj.get ## cache this for speed"); + self.obj_get = __get__(obj, "get", "missing attribute `get` - line 1134: self.obj_get = obj.get ## cache this for speed"); };__Iterator___init__.is_wrapper = true; __Iterator_attrs.__init__ = __Iterator___init__; var __Iterator_next = function(args, kwargs) { @@ -2716,7 +2710,7 @@ var __dict___init__ = function(args, kwargs) { ob = js_object; if (__test_if_true__(ob instanceof Array)) { var o,__iterator__45; - __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1195: for o in ob:"), "__call__")([], __NULL_OBJECT__); + __iterator__45 = __get__(__get__(ob, "__iter__", "no iterator - line 1196: for o in ob:"), "__call__")([], __NULL_OBJECT__); var __next__45; __next__45 = __get__(__iterator__45, "next"); while (( __iterator__45.index ) < __iterator__45.length) { @@ -2729,7 +2723,7 @@ var __dict___init__ = function(args, kwargs) { v = o["value"]; } try { -__get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1202: self.__setitem__( k,v )"), "__call__")([k, v], __NULL_OBJECT__); +__get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1203: self.__setitem__( k,v )"), "__call__")([k, v], __NULL_OBJECT__); } catch(__exception__) { if (__exception__ == KeyError || __exception__ instanceof KeyError) { throw new KeyError("error in dict init, bad key"); @@ -2740,16 +2734,16 @@ throw new KeyError("error in dict init, bad key"); } else { if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) { var key,__iterator__46; - __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1206: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1207: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__); var __next__46; __next__46 = __get__(__iterator__46, "next"); while (( __iterator__46.index ) < __iterator__46.length) { key = __next__46(); - value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1207: value = ob[ key ]")([key], __NULL_OBJECT__)); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1208: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); + value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1208: value = ob[ key ]")([key], __NULL_OBJECT__)); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1209: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__); } } else { - console.log("ERROR init dict from:", js_object); + console.log(["ERROR init dict from:", js_object]); throw new TypeError; } } @@ -2771,15 +2765,15 @@ var __dict_jsify = function(args, kwargs) { var self = __args__['self']; keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__); var key,__iterator__47; - __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1215: for key in keys:"), "__call__")([], __NULL_OBJECT__); + __iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1216: for key in keys:"), "__call__")([], __NULL_OBJECT__); var __next__47; __next__47 = __get__(__iterator__47, "next"); while (( __iterator__47.index ) < __iterator__47.length) { key = __next__47(); - value = __get__(self["$wrapped"], "__getitem__", "line 1216: value = self[...][key]")([key], __NULL_OBJECT__); + value = __get__(self["$wrapped"], "__getitem__", "line 1217: value = self[...][key]")([key], __NULL_OBJECT__); if ((typeof(value) instanceof Array ? JSON.stringify(typeof(value))==JSON.stringify("object") : typeof(value)==="object")) { if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) { - __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1219: self[...][key] = value.jsify()"), "__call__")()], {}); + __get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1220: self[...][key] = value.jsify()"), "__call__")()], {}); } } else { if ((typeof(value) instanceof Array ? JSON.stringify(typeof(value))==JSON.stringify("function") : typeof(value)==="function")) { @@ -2835,7 +2829,7 @@ var __dict_has_key = function(args, kwargs) { var key = __args__['key']; __dict = self["$wrapped"]; if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) { - key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1232: key = key.__uid__"); + key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1233: key = key.__uid__"); } if (__test_if_true__(key in __dict)) { return true; @@ -2858,12 +2852,12 @@ var __dict_update = function(args, kwargs) { var self = __args__['self']; var other = __args__['other']; var key,__iterator__48; - __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1238: for key in other:"), "__call__")([], __NULL_OBJECT__); + __iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1239: for key in other:"), "__call__")([], __NULL_OBJECT__); var __next__48; __next__48 = __get__(__iterator__48, "next"); while (( __iterator__48.index ) < __iterator__48.length) { key = __next__48(); - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1239: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1239: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1240: self.__setitem__( key, other[key] )"), "__call__")([key, ((other instanceof Array) ? other[key] : __get__(other, "__getitem__", "line 1240: self.__setitem__( key, other[key] )")([key], __NULL_OBJECT__))], __NULL_OBJECT__); } };__dict_update.is_wrapper = true; __dict_attrs.update = __dict_update; @@ -2881,12 +2875,12 @@ var __dict_items = function(args, kwargs) { var self = __args__['self']; arr = []; var key,__iterator__49; - __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1242: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); + __iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1243: for key in self.keys():"), "__call__")([], __NULL_OBJECT__); var __next__49; __next__49 = __get__(__iterator__49, "next"); while (( __iterator__49.index ) < __iterator__49.length) { key = __next__49(); - __get__(__get__(arr, "append", "missing attribute `append` - line 1243: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); + __get__(__get__(arr, "append", "missing attribute `append` - line 1244: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__); } return arr; };__dict_items.is_wrapper = true; @@ -2927,7 +2921,7 @@ var __dict_set = function(args, kwargs) { var self = __args__['self']; var key = __args__['key']; var value = __args__['value']; - __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1251: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); + __get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1252: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__); };__dict_set.is_wrapper = true; __dict_attrs.set = __dict_set; var __dict___len__ = function(args, kwargs) { @@ -3135,7 +3129,7 @@ var set = function(args, kwargs) { } __args__ = __getargs__("set", __sig__, args, kwargs); var a = __args__['a']; - "\n This returns an array that is a minimal implementation of set.\n Often sets are used simply to remove duplicate entries from a list, \n and then it get converted back to a list, it is safe to use fastset for this.\n The array prototype is overloaded with basic set functions:\n difference\n intersection\n issubset\n Note: sets in Python are not subscriptable, but can be iterated over.\n Python docs say that set are unordered, some programs may rely on this disorder\n for randomness, for sets of integers we emulate the unorder only uppon initalization \n of the set, by masking the value by bits-1. Python implements sets starting with an \n array of length 8, and mask of 7, if set length grows to 6 (3/4th), then it allocates \n a new(array of length 32 and mask of 31. This is only emulated for arrays of )\n integers up to an array length of 1536.\n "; + "\n This returns an array that is a minimal implementation of set.\n Often sets are used simply to remove duplicate entries from a list, \n and then it get converted back to a list, it is safe to use fastset for this.\n The array prototype is overloaded with basic set functions:\n difference\n intersection\n issubset\n Note: sets in Python are not subscriptable, but can be iterated over.\n Python docs say that set are unordered, some programs may rely on this disorder\n for randomness, for sets of integers we emulate the unorder only uppon initalization \n of the set, by masking the value by bits-1. Python implements sets starting with an \n array of length 8, and mask of 7, if set length grows to 6 (3/4th), then it allocates \n a __new__>>array of length 32 and mask of 31. This is only emulated for arrays of \n integers up to an array length of 1536.\n "; hashtable = null; if (( a.length ) <= 1536) { hashtable = __jsdict([]); @@ -3235,7 +3229,7 @@ var __array___init__ = function(args, kwargs) { var initializer = __args__['initializer']; var little_endian = __args__['little_endian']; self.typecode = typecode; - self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1435: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1435: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); + self.itemsize = __get__(__get__(self, "typecodes", "missing attribute `typecodes` - line 1436: self.itemsize = self.typecodes[ typecode ]"), "__getitem__", "line 1436: self.itemsize = self.typecodes[ typecode ]")([typecode], __NULL_OBJECT__); self.little_endian = little_endian; if (__test_if_true__(initializer)) { self.length = len([initializer], __NULL_OBJECT__); @@ -3259,7 +3253,7 @@ var __array___init__ = function(args, kwargs) { buff = new ArrayBuffer(size); self.dataview = new DataView(buff); self.buffer = buff; - __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1456: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); + __get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1457: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__); };__array___init__.is_wrapper = true; __array_attrs.__init__ = __array___init__; var __array___len__ = function(args, kwargs) { @@ -3290,7 +3284,7 @@ var __array___contains__ = function(args, kwargs) { __args__ = __getargs__("__array___contains__", __sig__, args, kwargs); var self = __args__['self']; var value = __args__['value']; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1462: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1463: arr = self.to_array()"), "__call__")(); if ((arr.indexOf(value) instanceof Array ? JSON.stringify(arr.indexOf(value))==JSON.stringify(-1) : arr.indexOf(value)===-1)) { return false; } else { @@ -3314,7 +3308,7 @@ var __array___getitem__ = function(args, kwargs) { step = self.itemsize; offset = (step * index); dataview = self.dataview; - func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1470: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1470: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("get" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1471: func_name = 'get'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1471: func_name = 'get'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { value = func(offset); @@ -3351,7 +3345,7 @@ var __array___setitem__ = function(args, kwargs) { } offset = (step * index); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1486: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1486: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1487: func_name = 'set'+self.typecode_names[ self.typecode ]"), "__getitem__", "line 1487: func_name = 'set'+self.typecode_names[ self.typecode ]")([self.typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( offset ) < self.bytes) { if ((self.typecode instanceof Array ? JSON.stringify(self.typecode)==JSON.stringify("float8") : self.typecode==="float8")) { @@ -3416,13 +3410,13 @@ var __array_fromlist = function(args, kwargs) { typecode = self.typecode; size = (length * step); dataview = self.dataview; - func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1506: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1506: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); + func_name = ("set" + __get__(__get__(self, "typecode_names", "missing attribute `typecode_names` - line 1507: func_name = 'set'+self.typecode_names[ typecode ]"), "__getitem__", "line 1507: func_name = 'set'+self.typecode_names[ typecode ]")([typecode], __NULL_OBJECT__)); func = dataview[func_name].bind(dataview); if (( size ) <= self.bytes) { i = 0; offset = 0; while (( i ) < length) { - item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1511: item = lst[i]")([i], __NULL_OBJECT__)); + item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1512: item = lst[i]")([i], __NULL_OBJECT__)); if ((typecode instanceof Array ? JSON.stringify(typecode)==JSON.stringify("float8") : typecode==="float8")) { item *= self._norm_set; } else { @@ -3478,7 +3472,7 @@ var __array_append = function(args, kwargs) { var self = __args__['self']; var value = __args__['value']; length = self.length; - __get__(__get__(self, "resize", "missing attribute `resize` - line 1534: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); + __get__(__get__(self, "resize", "missing attribute `resize` - line 1535: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__); __get__(__get__(self, "__setitem__"), "__call__")([length, value], {}); };__array_append.is_wrapper = true; __array_attrs.append = __array_append; @@ -3496,12 +3490,12 @@ var __array_extend = function(args, kwargs) { var self = __args__['self']; var lst = __args__['lst']; var value,__iterator__54; - __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1537: for value in lst:"), "__call__")([], __NULL_OBJECT__); + __iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1538: for value in lst:"), "__call__")([], __NULL_OBJECT__); var __next__54; __next__54 = __get__(__iterator__54, "next"); while (( __iterator__54.index ) < __iterator__54.length) { value = __next__54(); - __get__(__get__(self, "append", "missing attribute `append` - line 1538: self.append( value )"), "__call__")([value], __NULL_OBJECT__); + __get__(__get__(self, "append", "missing attribute `append` - line 1539: self.append( value )"), "__call__")([value], __NULL_OBJECT__); } };__array_extend.is_wrapper = true; __array_attrs.extend = __array_extend; @@ -3539,7 +3533,7 @@ var __array_to_list = function(args, kwargs) { } __args__ = __getargs__("__array_to_list", __sig__, args, kwargs); var self = __args__['self']; - return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1548: return self.to_array()"), "__call__")(); + return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1549: return self.to_array()"), "__call__")(); };__array_to_list.is_wrapper = true; __array_attrs.to_list = __array_to_list; var __array_to_ascii = function(args, kwargs) { @@ -3555,9 +3549,9 @@ var __array_to_ascii = function(args, kwargs) { __args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs); var self = __args__['self']; string = ""; - arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1551: arr = self.to_array()"), "__call__")(); + arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1552: arr = self.to_array()"), "__call__")(); i = 0; - length = __get__(arr, "length", "missing attribute `length` - line 1552: i = 0; length = arr.length"); + length = __get__(arr, "length", "missing attribute `length` - line 1553: i = 0; length = arr.length"); while (( i ) < length) { var num = arr[i]; var char = String.fromCharCode(num); @@ -3618,14 +3612,14 @@ var __file_read = function(args, kwargs) { _fs = __get__(require, "__call__")(["fs"], __NULL_OBJECT__); path = self.path; if (__test_if_true__((binary || self.binary))) { - return _fs.readFileSync(path); + return _fs.readFileSync(path, { encoding:null }); } else { return _fs.readFileSync(path, __jsdict([["encoding", "utf8"]])); } };__file_read.is_wrapper = true; __file_attrs.read = __file_read; var __file_write = function(args, kwargs) { - var _fs,path; + var path,buff,_fs; var __sig__,__args__; __sig__ = { kwargs:{"binary": false},args:["self", "data", "binary"] }; if ((args instanceof Array && (Object.prototype.toString.call(kwargs) instanceof Array ? JSON.stringify(Object.prototype.toString.call(kwargs))==JSON.stringify("[object Object]") : Object.prototype.toString.call(kwargs)==="[object Object]") && (arguments.length instanceof Array ? JSON.stringify(arguments.length)==JSON.stringify(2) : arguments.length===2))) { @@ -3641,7 +3635,13 @@ var __file_write = function(args, kwargs) { _fs = __get__(require, "__call__")(["fs"], __NULL_OBJECT__); path = self.path; if (__test_if_true__((binary || self.binary))) { - _fs.writeFileSync(path, data); + binary = (binary || self.binary); + if ((binary instanceof Array ? JSON.stringify(binary)==JSON.stringify("base64") : binary==="base64")) { + buff = new Buffer(data, "base64"); + _fs.writeFileSync(path, buff, __jsdict([["encoding", null]])); + } else { + _fs.writeFileSync(path, data, __jsdict([["encoding", null]])); + } } else { _fs.writeFileSync(path, data, __jsdict([["encoding", "utf8"]])); } diff --git a/pythonjs/runtime/builtins.py b/pythonjs/runtime/builtins.py index d493cdd..7047472 100644 --- a/pythonjs/runtime/builtins.py +++ b/pythonjs/runtime/builtins.py @@ -1030,10 +1030,11 @@ def func(): @Array.prototype.__getslice__ def func(start, stop, step): - arr = [] #new(Array(this.length)) + arr = [] start = start | 0 - stop = stop | this.length + if stop is undefined: + stop = this.length if start < 0: start = this.length + start @@ -1878,7 +1879,7 @@ def read(self, binary=False): path = self.path with javascript: if binary or self.binary: - return _fs.readFileSync( path ) + return _fs.readFileSync( path, encoding=None ) else: return _fs.readFileSync( path, {'encoding':'utf8'} ) @@ -1887,8 +1888,18 @@ def write(self, data, binary=False): path = self.path with javascript: if binary or self.binary: - _fs.writeFileSync( path, data ) + binary = binary or self.binary + if binary == 'base64': ## TODO: fixme, something bad in this if test + #print('write base64 data') + buff = new Buffer(data, 'base64') + _fs.writeFileSync( path, buff, {'encoding':None}) + + else: + #print('write binary data') + #print(binary) + _fs.writeFileSync( path, data, {'encoding':None}) else: + #print('write utf8 data') _fs.writeFileSync( path, data, {'encoding':'utf8'} ) def close(self): From 027a3a878269499f5f6bc21a20a66ced497a14ae Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 7 Sep 2014 02:50:28 -0700 Subject: [PATCH 215/222] Go backend: subclasses, methods can over-ride the parents, but not extend. --- pythonjs/pythonjs_to_go.py | 42 +++++++++++++++++++++++++++++++++-- regtests/class/mi.py | 8 +++---- regtests/class/mi_override.py | 32 ++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 regtests/class/mi_override.py diff --git a/pythonjs/pythonjs_to_go.py b/pythonjs/pythonjs_to_go.py index 73e4864..c418d84 100644 --- a/pythonjs/pythonjs_to_go.py +++ b/pythonjs/pythonjs_to_go.py @@ -32,6 +32,27 @@ def visit_ClassDef(self, node): self._classes[ node.name ] = node self._class_props[ node.name ] = props + + + for base in node.bases: + n = self.visit(base) + if n == 'object': + continue + node._parents.add( n ) + + bases.add( n ) + if n in self._class_props: + props.update( self._class_props[n] ) + base_classes.add( self._classes[n] ) + #else: ## special case - subclassing a builtin like `list` + # continue + + for p in self._classes[ n ]._parents: + bases.add( p ) + props.update( self._class_props[p] ) + base_classes.add( self._classes[p] ) + + for decor in node.decorator_list: ## class decorators if isinstance(decor, ast.Call): assert decor.func.id=='__struct__' @@ -47,10 +68,11 @@ def visit_ClassDef(self, node): init = None - + method_names = set() for b in node.body: - out.append( self.visit(b) ) assert isinstance(b, ast.FunctionDef) + method_names.add( b.name ) + out.append( self.visit(b) ) if b.name == '__init__': init = b @@ -66,6 +88,21 @@ def visit_ClassDef(self, node): out.append( 'func __new__%s() *%s { return &%s{} }' %(node.name, node.name, node.name)) + if base_classes: + for bnode in base_classes: + for b in bnode.body: + if isinstance(b, ast.FunctionDef): + if b.name == '__init__': continue + if b.name in method_names: continue + out.append( self.visit(b) ) + #args = [self.visit(a) for a in b.args.args][1:] + #args = ','.join(args) + #if args: + # out.append(self.indent()+ '%s(%s) { return %s.__%s(this,%s); }'%(b.name, args, bnode.name, b.name, args) ) + #else: + # out.append(self.indent()+ '%s() { return %s.__%s(this); }'%(b.name, bnode.name, b.name) ) + + self._class_stack.pop() return '\n'.join(out) @@ -443,6 +480,7 @@ def visit_While(self, node): def _inline_code_helper(self, s): return s + #return 'js.Global.Call("eval", "%s")' %s ## TODO inline JS() diff --git a/regtests/class/mi.py b/regtests/class/mi.py index 0b96290..5c1a591 100644 --- a/regtests/class/mi.py +++ b/regtests/class/mi.py @@ -2,21 +2,21 @@ multiple inheritance ''' class A: - def foo(self): + def foo(self) -> int: return 1 class B: - def bar(self): + def bar(self) -> int: return 2 class C( A, B ): - def call_foo_bar(self): + def call_foo_bar(self) -> int: a = self.foo() a += self.bar() return a ## extend foo ## - def foo(self): + def foo(self) -> int: a = A.foo(self) a += 100 return a diff --git a/regtests/class/mi_override.py b/regtests/class/mi_override.py new file mode 100644 index 0000000..d36fb6f --- /dev/null +++ b/regtests/class/mi_override.py @@ -0,0 +1,32 @@ +''' +multiple inheritance +''' +class A: + def foo(self) -> int: + return 1 + +class B: + def bar(self) -> int: + return 2 + +class C( A, B ): + def call_foo_bar(self) -> int: + a = self.foo() + a += self.bar() + return a + + ## override foo ## + def foo(self) -> int: + return 100 + +def main(): + a = A() + TestError( a.foo()==1 ) + b = B() + TestError( b.bar()==2 ) + + c = C() + TestError( c.foo()==100 ) + TestError( c.bar()==2 ) + + TestError( c.call_foo_bar()==102 ) From 4f39bd5b2e55b5170c0e0702dba75db601fd7f1e Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 7 Sep 2014 11:10:15 -0700 Subject: [PATCH 216/222] documentation for the Go backend --- README.md | 11 +++- doc/go_syntax.md | 157 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 doc/go_syntax.md diff --git a/README.md b/README.md index aaed747..db3e43f 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,18 @@ Introduction ------------ PythonJS is a transpiler written in Python that converts a python like language into fast -JavaScript. With a few exceptions, the PythonJS language is a superset of Python that is extended to support new syntax inspired by JavaScript and Go. +JavaScript. It also includes experimental backends that translate to: Dart, Lua, CoffeeScript, and Go. [Syntax Documentation](https://github.com/PythonJS/PythonJS/blob/master/doc/syntax.md) +Go backend +---------- +The Go backend uses a fully typed subset of Python, mixed with extra syntax inspired by Golang to output Go programs that can be compiled to native executeables, or translated to JavaScript using GopherJS. + +[Syntax Documentation](https://github.com/PythonJS/PythonJS/blob/master/doc/go_syntax.md) + + Getting Started =============== PythonJS can be run with regular Python, or fully self-hosted within @@ -59,7 +66,7 @@ will be converted into JavaScript. Usage:: - translator.py [--help|--dart|--coffee|--lua|--no-wrapper|--analyzer] file.py + translator.py [--help|--go|--dart|--coffee|--lua|--no-wrapper|--analyzer] file.py Examples:: diff --git a/doc/go_syntax.md b/doc/go_syntax.md new file mode 100644 index 0000000..698fbc3 --- /dev/null +++ b/doc/go_syntax.md @@ -0,0 +1,157 @@ +PythonJS Go Syntax +=============== + +PythonJS supports a fully typed subset of Python with extra syntax to support the Golang backend. + + +select +------- +Below `A` and `B` are typed as `chan int`. Data is read from a channel with `<-`. +``` + def select_loop(A:chan int, B:chan int): + print('starting select loop') + y = 0 + while True: + select: + case x = <- A: + y += x + case x = <- B: + y += x + +``` + +maps +------- +Go maps store key value pairs. The key type is given first enclosed in brackets, the value type is given after. +The example below shows a map with string keys and integer values + +``` + a = map[string]int{ + 'x': 1, + 'y': 2, + 'z': 3, + } +``` + +map iteration +------------- +The key value pairs can be looped over with a for loop. +``` + def main(): + a = map[string]int{'x':100, 'y':200} + b = '' + c = 0 + for key,value in a: + b += key + c += value +``` + +arrays +------ +Go typed arrays are defined with an optional size followed by the type, and values passed as arguments to the constructor. +Items in an array can be iterated over with a normal `for x in a` loop. Arrays also support index value pair loops using `enumerate` + +``` + a = []int(1,2,3) + b = [2]int(100,200) + +``` + +classes +------- +A Python class is translated into a Go struct with methods. Below a dict is used to type all the attribute variables that `self` will use. +``` + class A: + { + x:int, + y:int, + z:int, + } + def __init__(self, x:int, y:int, z:int=1): + self.x = x + self.y = y + self.z = z + + +``` + +subclasses +---------- +Subclasses can mix multiple classes, and override methods from the parent class. + +``` + class A: + def foo(self) -> int: + return 1 + + class B: + def bar(self) -> int: + return 2 + + class C( A, B ): + def call_foo_bar(self) -> int: + a = self.foo() + a += self.bar() + return a + + ## override foo ## + def foo(self) -> int: + return 100 + + def main(): + a = A() + b = B() + + c = C() + + ## below is all true ## + b.bar()==2 + c.bar()==2 + c.foo()==100 + c.call_foo_bar()==102 + +``` + +callbacks +--------- +Functions and methods can be passed as callbacks to other functions. The function argument type must contain the keyword `func` followed by the type signature of the callback (argument types) and (return type). Below the method is typed as `func(int)(int)` + +``` +class A: + { + x:int, + y:int, + z:int, + } + def __init__(self, x:int, y:int, z:int=1): + self.x = x + self.y = y + self.z = z + + def mymethod(self, m:int) -> int: + return self.x * m + + def call_method( cb:func(int)(int), mx:int ) ->int: + return cb(mx) + + def main(): + a = A( 100, 200, z=9999 ) + c = call_method( a.mymethod, 4 ) + print( c ) + +``` + +goroutines +---------- +The function `go` can be called to spawn a new function call as a goroutine +``` + go( myfunc(x,y,z) ) + +``` + +channels +-------- +To make a new Go channel call `go.channel(type)`, this is the same as in Go calling `make(chan type)`. +``` + c = go.channel(int) +``` From 1bc0b9dea97e557b731559ef475ac49b21024cf5 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 7 Sep 2014 11:34:15 -0700 Subject: [PATCH 217/222] Go backend: fixed subclasses without __init__. --- pythonjs/pythonjs_to_go.py | 42 +++++++++++++++++++++++-------------- regtests/go/subclass.py | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 16 deletions(-) create mode 100644 regtests/go/subclass.py diff --git a/pythonjs/pythonjs_to_go.py b/pythonjs/pythonjs_to_go.py index c418d84..8eb00b7 100644 --- a/pythonjs/pythonjs_to_go.py +++ b/pythonjs/pythonjs_to_go.py @@ -24,6 +24,7 @@ def __init__(self, requirejs=False, insert_runtime=False): def visit_ClassDef(self, node): self._class_stack.append( node ) node._parents = set() + node._struct_def = dict() out = [] sdef = dict() props = set() @@ -61,7 +62,13 @@ def visit_ClassDef(self, node): props.add( kw.arg ) sdef[ kw.arg ] = kw.value.id + node._struct_def.update( sdef ) out.append( 'type %s struct {' %node.name) + if base_classes: + for bnode in base_classes: + ## Go only needs the name of the parent struct and all its items are inserted automatically ## + out.append('%s' %bnode.name) + for name in sdef: out.append('%s %s' %(name, sdef[name])) out.append('}') @@ -76,7 +83,25 @@ def visit_ClassDef(self, node): if b.name == '__init__': init = b - if init: + + parent_init = None + if base_classes: + for bnode in base_classes: + for b in bnode.body: + if isinstance(b, ast.FunctionDef): + if b.name in method_names: + continue + if b.name == '__init__': + parent_init = {'class':bnode, 'init':b} + #continue + out.append( self.visit(b) ) + + if init or parent_init: + if parent_init: + classname = parent_init['class'].name + init = parent_init['init'] + else: + classname = node.name out.append( 'func __new__%s( %s ) *%s {' %(node.name, init._args_signature, node.name)) out.append( ' ob := %s{}' %node.name ) @@ -88,21 +113,6 @@ def visit_ClassDef(self, node): out.append( 'func __new__%s() *%s { return &%s{} }' %(node.name, node.name, node.name)) - if base_classes: - for bnode in base_classes: - for b in bnode.body: - if isinstance(b, ast.FunctionDef): - if b.name == '__init__': continue - if b.name in method_names: continue - out.append( self.visit(b) ) - #args = [self.visit(a) for a in b.args.args][1:] - #args = ','.join(args) - #if args: - # out.append(self.indent()+ '%s(%s) { return %s.__%s(this,%s); }'%(b.name, args, bnode.name, b.name, args) ) - #else: - # out.append(self.indent()+ '%s() { return %s.__%s(this); }'%(b.name, bnode.name, b.name) ) - - self._class_stack.pop() return '\n'.join(out) diff --git a/regtests/go/subclass.py b/regtests/go/subclass.py new file mode 100644 index 0000000..69e87b9 --- /dev/null +++ b/regtests/go/subclass.py @@ -0,0 +1,43 @@ +''' +simple class +''' +class A: + { + x:int, + y:int, + z:int, + } + def __init__(self, x:int, y:int, z:int=1): + self.x = x + self.y = y + self.z = z + + def mymethod(self, m:int) -> int: + return self.x * m + +class B(A): + { + w:string + } + + def method2(self, v:string) ->string: + self.w = v + return self.w + +def call_method( cb:func(int)(int), mx:int ) ->int: + return cb(mx) + +def main(): + a = A( 100, 200, z=9999 ) + print( a.x ) + print( a.y ) + print( a.z ) + + b = a.mymethod(3) + print( b ) + + c = call_method( a.mymethod, 4 ) + print( c ) + + x = B(1,2,z=3) + print( x.method2('hello world') ) \ No newline at end of file From 09c5f685e33a142ed831eedb998436d2fb0c6af9 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Sun, 7 Sep 2014 15:23:38 -0700 Subject: [PATCH 218/222] Go backend: list comprehensions `[]int( x for x in range(n) )` --- doc/go_syntax.md | 7 +++++++ pythonjs/python_to_pythonjs.py | 27 +++++++++++++++++++++++++-- pythonjs/pythonjs_to_go.py | 4 +++- pythonjs/typedpython.py | 3 +++ regtests/go/list_comprehension.py | 11 +++++++++++ 5 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 regtests/go/list_comprehension.py diff --git a/doc/go_syntax.md b/doc/go_syntax.md index 698fbc3..598778a 100644 --- a/doc/go_syntax.md +++ b/doc/go_syntax.md @@ -155,3 +155,10 @@ To make a new Go channel call `go.channel(type)`, this is the same as in Go call ``` c = go.channel(int) ``` + +list comprehensions +------------------- + +``` + a = []int(x for x in range(3)) +``` \ No newline at end of file diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 802ec1a..11f5c4d 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -604,7 +604,11 @@ def visit_ListComp(self, node): a = ['get%s'%i for i in range(length)] writer.write('var( %s )' %','.join(a) ) - writer.write('%s = JSArray()'%cname) + if self._with_go: + assert node.go_listcomp_type + writer.write('%s = __go__array__(%s)' %(cname, node.go_listcomp_type)) + else: + writer.write('%s = JSArray()'%cname) generators = list( node.generators ) generators.reverse() @@ -661,6 +665,8 @@ def _gen_comp(self, generators, node): writer.write('%s.add( %s )' %(cname,self.visit(node.elt)) ) elif self._with_lua: writer.write('table.insert(%s, %s )' %(cname,self.visit(node.elt)) ) + elif self._with_go: + writer.write('%s = append(%s, %s )' %(cname, cname,self.visit(node.elt)) ) else: writer.write('%s.push( %s )' %(cname,self.visit(node.elt)) ) writer.pull() @@ -670,6 +676,8 @@ def _gen_comp(self, generators, node): writer.write('%s.add( %s )' %(cname,self.visit(node.elt)) ) elif self._with_lua: writer.write('table.insert(%s, %s )' %(cname,self.visit(node.elt)) ) + elif self._with_go: + writer.write('%s = append(%s, %s )' %(cname, cname,self.visit(node.elt)) ) else: writer.write('%s.push( %s )' %(cname,self.visit(node.elt)) ) if self._with_lua: @@ -1365,10 +1373,25 @@ def visit_Return(self, node): def visit_BinOp(self, node): left = self.visit(node.left) op = self.visit(node.op) + + is_go_listcomp = False + if self._with_go: + if op == '<<': + if isinstance(node.left, ast.Call) and isinstance(node.left.func, ast.Name) and node.left.func.id=='__go__array__': + if isinstance(node.right, ast.GeneratorExp): + is_go_listcomp = True + node.right.go_listcomp_type = node.left.args[0].id + + right = self.visit(node.right) - if self._with_glsl or self._with_go: + if self._with_glsl: return '(%s %s %s)' % (left, op, right) + elif self._with_go: + if is_go_listcomp: + return right + else: + return '(%s %s %s)' % (left, op, right) elif op == '|': if isinstance(node.right, Str): diff --git a/pythonjs/pythonjs_to_go.py b/pythonjs/pythonjs_to_go.py index 8eb00b7..2c02e63 100644 --- a/pythonjs/pythonjs_to_go.py +++ b/pythonjs/pythonjs_to_go.py @@ -273,8 +273,10 @@ def _visit_call_helper_go(self, node): return 'make(%s)' %self.visit(node.args[0]) elif name == '__go_make_chan__': return 'make(chan %s)' %self.visit(node.args[0]) + elif name == '__go__array__': + return '[]%s{}' %self.visit(node.args[0]) else: - raise SyntaxError('invalid special go call') + raise SyntaxError(name) def _visit_function(self, node): if self._function_stack[0] is node: diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 7f31496..ecc1b86 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -24,6 +24,7 @@ GO_SPECIAL_CALLS = { 'go' : '__go__', 'go.channel' : '__go_make_chan__', + 'go.array' : '__go__array__' } def transform_source( source, strip=False ): @@ -427,6 +428,8 @@ def f(a:int=100, b:int=100) ->int: def f(*args:int, **kwargs:int) ->int: return a+b +a = []int(x for x in range(3)) + ''' if __name__ == '__main__': diff --git a/regtests/go/list_comprehension.py b/regtests/go/list_comprehension.py new file mode 100644 index 0000000..75c7f7a --- /dev/null +++ b/regtests/go/list_comprehension.py @@ -0,0 +1,11 @@ +''' +go list comprehensions +''' + +def main(): + a = []int(x for x in range(3)) + + TestError( len(a)==3 ) + TestError( a[0]==0 ) + TestError( a[1]==1 ) + TestError( a[2]==2 ) From 3b12597f32b13d0875858a497ec1edcb8141b955 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Mon, 8 Sep 2014 19:17:53 -0700 Subject: [PATCH 219/222] fixed `yield` generator functions. --- pythonjs/python_to_pythonjs.py | 35 ++++++---------------------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 11f5c4d..a507fc1 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -3874,38 +3874,15 @@ class GeneratorFunctionTransformer( PythonToPythonJS ): ''' def __init__(self, node, compiler=None): - self._with_ll = False - self._with_js = False - self._with_dart = False - self._with_coffee = False - self._with_lua = False - self._with_rpc = None - self._with_rpc_name = None - self._with_inline = False - self._in_while_test = False - self._in_lambda = False + assert '_stack' in dir(compiler) + #self.__dict___ = compiler.__dict__ ## share all state + for name in dir(compiler): + if name not in dir(self): + setattr(self, name, (getattr(compiler, name))) - if compiler._with_dart: ## TODO - self._with_dart = True - elif compiler._with_coffee: - self._with_coffee = True - elif compiler._with_lua: - self._with_lua = True - else: - self._with_js = True - - self._typedef_vars = compiler._typedef_vars - self._direct_operators = compiler._direct_operators - self._builtin_functions = compiler._builtin_functions - self._js_classes = compiler._js_classes - self._global_functions = compiler._global_functions - self._addop_ids = compiler._addop_ids - self._cache_for_body_calls = False - self._source = compiler._source - self._instances = dict() self._head_yield = False self.visit( node ) - compiler._addop_ids = self._addop_ids + compiler._addop_ids = self._addop_ids ## note: need to keep id index insync def visit_Yield(self, node): if self._in_head: From d9f143f8d2d37ba05a83dba57cfd7f8720367ad4 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Wed, 10 Sep 2014 17:42:14 -0700 Subject: [PATCH 220/222] go backend: multidimensional array `[][]` --- pythonjs/python_to_pythonjs.py | 4 +++- pythonjs/pythonjs_to_go.py | 4 ++-- pythonjs/typedpython.py | 24 ++++++++++++++++++++---- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index a507fc1..6d89ae4 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -424,7 +424,9 @@ def visit_Import(self, node): tornado = ['tornado', 'tornado.web', 'tornado.ioloop'] for alias in node.names: - if alias.name in tornado: + if self._with_go: + writer.write('import %s' %alias.name) + elif alias.name in tornado: pass ## pythonjs/fakelibs/tornado.py elif alias.name == 'tempfile': pass ## pythonjs/fakelibs/tempfile.py diff --git a/pythonjs/pythonjs_to_go.py b/pythonjs/pythonjs_to_go.py index 2c02e63..56c5fcf 100644 --- a/pythonjs/pythonjs_to_go.py +++ b/pythonjs/pythonjs_to_go.py @@ -150,9 +150,9 @@ def visit_Expr(self, node): return self.visit(node.value) def visit_Import(self, node): - r = [alias.name for alias in node.names] + r = [alias.name.replace('__SLASH__', '/') for alias in node.names] if r: - return 'import "%s"' %';'.join(r) + return 'import("%s")' %';'.join(r) else: return '' diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index ecc1b86..9c06d9b 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -44,7 +44,7 @@ def transform_source( source, strip=False ): if nextchar.strip(): break j += 1 - if a and char==']' and j==i+1 and nextchar!=None and nextchar in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ': + if a and char==']' and j==i+1 and nextchar!=None and nextchar in '[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ': assert '[' in a gotype = [] b = a.pop() @@ -54,7 +54,10 @@ def transform_source( source, strip=False ): gotype.reverse() gotype = ''.join(gotype) if not gotype: - a.append('__go__array__(') + if nextchar=='[': + a.append('__go__array__<<') + else: + a.append('__go__array__(') elif gotype.isdigit(): a.append('__go__arrayfixed__(%s,' %gotype) else: @@ -69,6 +72,10 @@ def transform_source( source, strip=False ): elif hit_go_typedef and char=='{': a.append(')<<{') hit_go_typedef = False + elif hit_go_typedef and char==',': + a.append('),') + hit_go_typedef = False + elif a and char in __whitespace: b = ''.join(a) @@ -153,8 +160,15 @@ def transform_source( source, strip=False ): break indent = ''.join(indent) output.append( indent + '@returns(%s)' %rtype) - elif c.startswith('import ') and '-' in c: - c = c.replace('-', '__DASH__') + + if c.startswith('import '): + if '-' in c: + c = c.replace('-', '__DASH__') + if '/' in c: + c = c.replace('/', '__SLASH__') + if '"' in c: + c = c.replace('"', '') + if ' new ' in c: c = c.replace(' new ', ' __new__>>') @@ -430,6 +444,8 @@ def f(*args:int, **kwargs:int) ->int: a = []int(x for x in range(3)) +y = go.make([]float64, 1000) + ''' if __name__ == '__main__': From 2dd323501d3751a7c7ae632d5d9e60782788f447 Mon Sep 17 00:00:00 2001 From: hartsantler Date: Thu, 11 Sep 2014 02:56:27 -0700 Subject: [PATCH 221/222] go backend: support go.make --- pythonjs/python_to_pythonjs.py | 4 ++-- pythonjs/pythonjs.py | 3 +++ pythonjs/pythonjs_to_go.py | 26 ++++++++++++++++++-------- pythonjs/typedpython.py | 14 ++++++++------ 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 6d89ae4..4bf5339 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -299,10 +299,10 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe self._source = source.splitlines() - if '--debug' in sys.argv: + if '--debug--' in sys.argv: try: tree = ast.parse( source ) - except: + except SyntaxError: raise SyntaxError(source) else: tree = ast.parse( source ) diff --git a/pythonjs/pythonjs.py b/pythonjs/pythonjs.py index 8eb22bd..159f25c 100755 --- a/pythonjs/pythonjs.py +++ b/pythonjs/pythonjs.py @@ -962,6 +962,7 @@ def visit_BinOp(self, node): if node.left.func.id == '__go__map__': key_type = self.visit(node.left.args[0]) value_type = self.visit(node.left.args[1]) + if value_type == 'interface': value_type = 'interface{}' return 'map[%s]%s%s' %(key_type, value_type, right) else: if not right.startswith('{') and not right.endswith('}'): @@ -973,6 +974,8 @@ def visit_BinOp(self, node): asize = self.visit(node.left.args[0]) atype = self.visit(node.left.args[1]) return '[%s]%s%s' %(asize, atype, right) + elif isinstance(node.left, ast.Name) and node.left.id=='__go__array__' and op == '<<': + return '[]%s' %self.visit(node.right) if left in self._typed_vars and self._typed_vars[left] == 'numpy.float32': left += '[_id_]' diff --git a/pythonjs/pythonjs_to_go.py b/pythonjs/pythonjs_to_go.py index 56c5fcf..8599819 100644 --- a/pythonjs/pythonjs_to_go.py +++ b/pythonjs/pythonjs_to_go.py @@ -21,6 +21,8 @@ def __init__(self, requirejs=False, insert_runtime=False): self._known_vars = set() self._kwargs_type_ = dict() + self._imports = [] + def visit_ClassDef(self, node): self._class_stack.append( node ) node._parents = set() @@ -152,9 +154,9 @@ def visit_Expr(self, node): def visit_Import(self, node): r = [alias.name.replace('__SLASH__', '/') for alias in node.names] if r: - return 'import("%s")' %';'.join(r) - else: - return '' + for name in r: + self._imports.append('import("%s");' %name) + return '' def visit_Module(self, node): header = [ @@ -173,7 +175,10 @@ def visit_Module(self, node): else: lines.append( sub ) else: - raise SyntaxError(b) + if isinstance(b, ast.Import): + pass + else: + raise SyntaxError(b) lines.append('type _kwargs_type_ struct {') for name in self._kwargs_type_: @@ -182,7 +187,7 @@ def visit_Module(self, node): lines.append( ' __use__%s bool' %name) lines.append('}') - lines = header + lines + lines = header + self._imports + lines return '\n'.join( lines ) @@ -269,12 +274,17 @@ def _visit_call_helper_go(self, node): name = self.visit(node.func) if name == '__go__': return 'go %s' %self.visit(node.args[0]) - elif name == '__gomake__': + elif name == '__go_make__': return 'make(%s)' %self.visit(node.args[0]) elif name == '__go_make_chan__': return 'make(chan %s)' %self.visit(node.args[0]) elif name == '__go__array__': - return '[]%s{}' %self.visit(node.args[0]) + if isinstance(node.args[0], ast.BinOp):# and node.args[0].op == '<<': ## todo assert right is `typedef` + a = self.visit(node.args[0].left) + return '[]%s' %a + else: + a = self.visit(node.args[0]) + return '[]%s{}' %a else: raise SyntaxError(name) @@ -507,7 +517,7 @@ def main(script, insert_runtime=True): script = runtime + '\n' + script tree = ast.parse(script) - #return GoGenerator().visit(tree) + return GoGenerator().visit(tree) try: return GoGenerator().visit(tree) except SyntaxError as err: diff --git a/pythonjs/typedpython.py b/pythonjs/typedpython.py index 9c06d9b..f5bf3f3 100644 --- a/pythonjs/typedpython.py +++ b/pythonjs/typedpython.py @@ -24,7 +24,8 @@ GO_SPECIAL_CALLS = { 'go' : '__go__', 'go.channel' : '__go_make_chan__', - 'go.array' : '__go__array__' + 'go.array' : '__go__array__', + 'go.make' : '__go_make__' } def transform_source( source, strip=False ): @@ -73,7 +74,8 @@ def transform_source( source, strip=False ): a.append(')<<{') hit_go_typedef = False elif hit_go_typedef and char==',': - a.append('),') + #a.append(', type=True),') ## this breaks function annotations that splits on ',' + a.append('< Date: Thu, 11 Sep 2014 06:20:28 -0700 Subject: [PATCH 222/222] go backend: fixed go.make extra arguments. --- pythonjs/python_to_pythonjs.py | 5 +- pythonjs/pythonjs_to_go.py | 29 ++++++-- regtests/go/chan-transfer-speed.py | 107 +++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+), 6 deletions(-) create mode 100644 regtests/go/chan-transfer-speed.py diff --git a/pythonjs/python_to_pythonjs.py b/pythonjs/python_to_pythonjs.py index 4bf5339..f05a92c 100755 --- a/pythonjs/python_to_pythonjs.py +++ b/pythonjs/python_to_pythonjs.py @@ -1923,7 +1923,7 @@ def _visit_assign_helper(self, node, target): elif isinstance(target.slice, ast.Slice): code = '%s.__setslice__(%s, %s)' %(self.visit(target.value), self.visit(target.slice), self.visit(node.value)) - elif self._with_dart or self._with_ll or self._with_glsl: + elif self._with_dart or self._with_ll or self._with_glsl or self._with_go: code = '%s[ %s ] = %s' code = code % (self.visit(target.value), self.visit(target.slice.value), self.visit(node.value)) @@ -2206,7 +2206,8 @@ def visit_Call(self, node): name = self.visit(node.func) if name in typedpython.GO_SPECIAL_CALLS: name = typedpython.GO_SPECIAL_CALLS[ name ] - return '%s( %s )' %(name, self.visit(node.args[0])) + args = [self.visit(e) for e in node.args ] + return '%s( %s )' %(name, ','.join(args)) if self._with_rpc: if not self._with_rpc_name: diff --git a/pythonjs/pythonjs_to_go.py b/pythonjs/pythonjs_to_go.py index 8599819..c0ff87c 100644 --- a/pythonjs/pythonjs_to_go.py +++ b/pythonjs/pythonjs_to_go.py @@ -212,11 +212,20 @@ def visit_For(self, node): target = self.visit(node.target) lines = [] if isinstance(node.iter, ast.Call) and isinstance(node.iter.func, ast.Name): - iter = self.visit(node.iter.args[0]) if node.iter.func.id == 'range': - lines.append('for %s := 0; %s < %s; %s++ {' %(target, target, iter, target)) + if len(node.iter.args)==1: + iter = self.visit(node.iter.args[0]) + lines.append('for %s := 0; %s < %s; %s++ {' %(target, target, iter, target)) + elif len(node.iter.args)==2: + start = self.visit(node.iter.args[0]) + iter = self.visit(node.iter.args[1]) + lines.append('for %s := %s; %s < %s; %s++ {' %(target, start, target, iter, target)) + else: + raise SyntaxError('invalid for range loop') + elif node.iter.func.id == 'enumerate': + iter = self.visit(node.iter.args[0]) idx = self.visit(node.target.elts[0]) tar = self.visit(node.target.elts[1]) lines.append('for %s,%s := range %s {' %(idx,tar, iter)) @@ -275,7 +284,12 @@ def _visit_call_helper_go(self, node): if name == '__go__': return 'go %s' %self.visit(node.args[0]) elif name == '__go_make__': - return 'make(%s)' %self.visit(node.args[0]) + if len(node.args)==2: + return 'make(%s, %s)' %(self.visit(node.args[0]), self.visit(node.args[1])) + elif len(node.args)==3: + return 'make(%s, %s, %s)' %(self.visit(node.args[0]), self.visit(node.args[1]), self.visit(node.args[1])) + else: + raise SyntaxError('go make requires 2 or 3 arguments') elif name == '__go_make_chan__': return 'make(chan %s)' %self.visit(node.args[0]) elif name == '__go__array__': @@ -288,6 +302,13 @@ def _visit_call_helper_go(self, node): else: raise SyntaxError(name) + def visit_Return(self, node): + if isinstance(node.value, ast.Tuple): + return 'return %s' % ', '.join(map(self.visit, node.value.elts)) + if node.value: + return 'return %s' % self.visit(node.value) + return 'return' + def _visit_function(self, node): if self._function_stack[0] is node: self._vars = set() @@ -517,7 +538,7 @@ def main(script, insert_runtime=True): script = runtime + '\n' + script tree = ast.parse(script) - return GoGenerator().visit(tree) + #return GoGenerator().visit(tree) try: return GoGenerator().visit(tree) except SyntaxError as err: diff --git a/regtests/go/chan-transfer-speed.py b/regtests/go/chan-transfer-speed.py new file mode 100644 index 0000000..9b0c7fb --- /dev/null +++ b/regtests/go/chan-transfer-speed.py @@ -0,0 +1,107 @@ +# based on the go test by Dennis Francis +# https://github.com/dennisfrancis/gopherjs-channeltransfer-speed + + +import "github.com/gopherjs/gopherjs/js" + + +data_chan = go.channel(int) + +document = js.Global.Get("document") + +def main(): + js.Global.Get("window").Set("onload", setup) + +def setup(): + + go( receive() ) + bt = document.Call("getElementById", "startbt") + bt.Set("onclick", runtests) + + +def runtests(): + var bt = document.Call("getElementById", "startbt") + bt.Set("disabled", true) + + #go func() { + # test_calldepth() + # test_localmem() + #}() + + go( test_calldepth() ) + go( test_localmem() ) + + +def test_calldepth(): + + latency = go.make([]float64, 1000) + perf = js.Global.Get("performance") + #for cd := 1; cd <= 1000; cd++ { + for cd in range(1, 1000): + t0 = perf.Call("now").Float() + #for ii:=0; ii<50; ii++ { + for ii in range(50): + send_func(cd, 1, ii) + t1 = perf.Call("now").Float() + latency[cd-1] = (t1 - t0)/50.0 + print("test1 calldepth =", cd) + plot("ctsgraph1", latency, "Call depth", "Variation of Kilo Channel Transfers per second (KCTps) with call depth") + +def test_localmem(): + + latency = go.make([]float64, 1000) + perf = js.Global.Get("performance") + #for varsz := 1; varsz <= 1000; varsz++ { + for varsz in range(1, 1000): + t0 = perf.Call("now").Float() + #for ii:=0; ii<50; ii++ { + for ii in range(50): + send_func(1, varsz, ii) + + t1 = perf.Call("now").Float() + latency[varsz-1] = (t1 - t0)/50.0 + plot("ctsgraph2", latency, "Local variable size", "Variation of Kilo Channel Transfers per second (KCTps) with local variable size") + + +def plot(id:string, latency:[]float64, xlabel:string, title:string ): + + div = document.Call("getElementById", id) + #options = map[string]interface{}{ + options = map[string]interface{ + #"legend" : "always", + "title" : title, + "showRoller" : true, + "rollPeriod" : 1, + "ylabel" : "KCTps", + "labels" : []string("x", "CTS"), + } + + data = go.make([][]float64, len(latency)) + + #for rowid := 0; rowid < len(latency); rowid++ { + for rowid in range(len(latency)): + data[rowid] = []float64( + float64(rowid + 1), + 1.0/latency[rowid] + ) + + + js.Global.Get("Dygraph").New(div, data, options) + + +def send_func(call_depth:int, varsize:int, data:int ): + locvar = go.make([]int, varsize) + + if call_depth <= 1: + data_chan <- data + return + + send_func(call_depth-1, varsize, data) + + print(locvar) + +def receive(): + int data = 0 + while True: + data = <-data_chan + print("Received data =", data)