@@ -172,6 +172,7 @@ class PythonToPythonJS(NodeVisitor):
172172 def __init__ (self , source = None , module = None , module_path = None , dart = False , coffee = False , lua = False ):
173173 super (PythonToPythonJS , self ).__init__ ()
174174
175+ self ._with_ll = False ## lowlevel
175176 self ._with_lua = lua
176177 self ._with_coffee = coffee
177178 self ._with_dart = dart
@@ -380,7 +381,7 @@ def visit_Dict(self, node):
380381 v = self .visit ( node .values [i ] )
381382 if self ._with_js :
382383 a .append ( '[%s,%s]' % (k ,v ) )
383- elif self ._with_dart :
384+ elif self ._with_dart or self . _with_ll :
384385 a .append ( '%s:%s' % (k ,v ) )
385386 #if isinstance(node.keys[i], ast.Str):
386387 # a.append( '%s:%s'%(k,v) )
@@ -392,7 +393,7 @@ def visit_Dict(self, node):
392393 if self ._with_js :
393394 b = ',' .join ( a )
394395 return '__jsdict( [%s] )' % b
395- elif self ._with_dart :
396+ elif self ._with_dart or self . _with_ll :
396397 b = ',' .join ( a )
397398 return '{%s}' % b
398399 else :
@@ -411,6 +412,8 @@ def visit_Tuple(self, node):
411412 def visit_List (self , node ):
412413 node .returns_type = 'list'
413414 a = '[%s]' % ', ' .join (map (self .visit , node .elts ))
415+ if self ._with_lua :
416+ a = '__get__(list, "__call__")({}, {pointer:%s, length:%s})' % (a , len (node .elts ))
414417 return a
415418
416419 def visit_GeneratorExp (self , node ):
@@ -513,7 +516,35 @@ def visit_AugAssign(self, node):
513516 op = '%s=' % self .visit ( node .op )
514517
515518 typedef = self .get_typedef ( node .target )
516- if typedef and op in typedef .operators :
519+
520+ if self ._with_lua :
521+ if op == '+=' :
522+ a = '__add__(%s,%s)' % (target , self .visit (node .value ))
523+ elif op == '-=' :
524+ a = '__sub__(%s,%s)' % (target , self .visit (node .value ))
525+ elif op == '*=' :
526+ a = '__mul__(%s,%s)' % (target , self .visit (node .value ))
527+ elif op == '/=' :
528+ a = '__div__(%s,%s)' % (target , self .visit (node .value ))
529+ elif op == '%=' :
530+ a = '__mod__(%s,%s)' % (target , self .visit (node .value ))
531+ elif op == '&=' :
532+ a = '__and__(%s,%s)' % (target , self .visit (node .value ))
533+ elif op == '|=' :
534+ a = '__or__(%s,%s)' % (target , self .visit (node .value ))
535+ elif op == '^=' :
536+ a = '__xor__(%s,%s)' % (target , self .visit (node .value ))
537+ elif op == '<<=' :
538+ a = '__lshift__(%s,%s)' % (target , self .visit (node .value ))
539+ elif op == '>>=' :
540+ a = '__rshift__(%s,%s)' % (target , self .visit (node .value ))
541+ else :
542+ raise NotImplementedError
543+
544+ writer .write ('%s=%s' % (target ,a ))
545+
546+
547+ elif typedef and op in typedef .operators :
517548 func = typedef .operators [ op ]
518549 a = '%s( [%s, %s] )' % (func , target , self .visit (node .value ))
519550 writer .write ( a )
@@ -793,13 +824,13 @@ def visit_ClassDef(self, node):
793824 if item_name in self ._decorator_properties :
794825 pass
795826 else :
796- writer .write ('__%s_attrs["%s"] = %s' % (name , item_name , item .name ))
827+ writer .write ('__%s_attrs.%s = %s' % (name , item_name , item .name ))
797828
798829 elif isinstance (item , Assign ) and isinstance (item .targets [0 ], Name ):
799830 item_name = item .targets [0 ].id
800831 item .targets [0 ].id = '__%s_%s' % (name , item_name )
801832 self .visit (item ) # this will output the code for the assign
802- writer .write ('__%s_attrs["%s"] = %s' % (name , item_name , item .targets [0 ].id ))
833+ writer .write ('__%s_attrs.%s = %s' % (name , item_name , item .targets [0 ].id ))
803834 self ._class_attributes [ name ].add ( item_name ) ## should this come before self.visit(item) ??
804835 elif isinstance (item , Pass ):
805836 pass
@@ -813,7 +844,7 @@ def visit_ClassDef(self, node):
813844 item_name = sub .targets [0 ].id
814845 sub .targets [0 ].id = '__%s_%s' % (name , item_name )
815846 self .visit (sub ) # this will output the code for the assign
816- writer .write ('__%s_attrs["%s"] = %s' % (name , item_name , sub .targets [0 ].id ))
847+ writer .write ('__%s_attrs.%s = %s' % (name , item_name , sub .targets [0 ].id ))
817848 self ._class_attributes [ name ].add ( item_name ) ## should this come before self.visit(item) ??
818849 else :
819850 raise NotImplementedError ( sub )
@@ -836,7 +867,7 @@ def visit_ClassDef(self, node):
836867 self ._instances .pop ('self' )
837868 self ._in_class = False
838869
839- writer .write ('%s = create_class ("%s", __%s_parents, __%s_attrs, __%s_properties)' % (name , name , name , name , name ))
870+ writer .write ('%s = __create_class__ ("%s", __%s_parents, __%s_attrs, __%s_properties)' % (name , name , name , name , name ))
840871 if 'init' in self ._injector :
841872 writer .write ('%s.init_callbacks = JSArray()' % name )
842873 self ._injector = []
@@ -1194,7 +1225,7 @@ def visit_Subscript(self, node):
11941225 #return '%s["$wrapped"]' %name
11951226 return '%s[...]' % name
11961227
1197- elif self ._with_lua :
1228+ elif self ._with_ll :
11981229 return '%s[ %s ]' % (name , self .visit (node .slice ))
11991230
12001231 elif self ._with_js or self ._with_dart :
@@ -1271,7 +1302,7 @@ def _visit_assign_helper(self, node, target):
12711302 #code = '%s["$wrapped"] = %s' %(self.visit(target.value), self.visit(node.value))
12721303 code = '%s[...] = %s' % (self .visit (target .value ), self .visit (node .value ))
12731304
1274- elif self ._with_dart :
1305+ elif self ._with_dart or self . _with_ll :
12751306 code = '%s[ %s ] = %s'
12761307 code = code % (self .visit (target .value ), self .visit (target .slice .value ), self .visit (node .value ))
12771308
@@ -1320,8 +1351,8 @@ def _visit_assign_helper(self, node, target):
13201351 setter = parent_prop .properties [target .attr ]['set' ]
13211352 writer .write ( '%s( [%s, %s], JSObject() )' % (setter , target_value , self .visit (node .value )) )
13221353
1323- elif parent_classattr : ## TODO fix get/set class attributes
1324- writer .write ( "__%s_attrs['%s'] = %s" % (parent_classattr .name , target .attr , self .visit (node .value )) )
1354+ elif parent_classattr :
1355+ writer .write ( "__%s_attrs.%s = %s" % (parent_classattr .name , target .attr , self .visit (node .value )) )
13251356
13261357 elif parent_setattr :
13271358 func = parent_setattr .get_pythonjs_function_name ( '__setattr__' )
@@ -2024,8 +2055,6 @@ def visit_FunctionDef(self, node):
20242055 #####################################################################
20252056 if self ._with_dart :
20262057 pass
2027- #elif self._with_coffee:
2028- # pass
20292058
20302059 elif self ._with_js or javascript :
20312060 if node .args .defaults :
@@ -2057,7 +2086,7 @@ def visit_FunctionDef(self, node):
20572086 default_value = self .visit ( node .args .defaults [dindex ] )
20582087 writer .write ("%s = kwargs.%s or %s" % (arg .id , arg .id , default_value ))
20592088 else :
2060- writer .write ( "%s = args[ %s ]" % (arg .id , i ) )
2089+ writer .write ( "%s = args[ %s ]" % (arg .id , i + 1 ) )
20612090
20622091 elif len (node .args .defaults ) or len (node .args .args ) or node .args .vararg or node .args .kwarg :
20632092 # First check the arguments are well formed
@@ -2442,7 +2471,11 @@ def visit_While(self, node):
24422471 writer .pull ()
24432472
24442473 def visit_With (self , node ):
2445- if isinstance ( node .context_expr , Name ) and node .context_expr .id == 'javascript' :
2474+ if isinstance ( node .context_expr , Name ) and node .context_expr .id == 'lowlevel' :
2475+ self ._with_ll = True
2476+ map (self .visit , node .body )
2477+ self ._with_ll = False
2478+ elif isinstance ( node .context_expr , Name ) and node .context_expr .id == 'javascript' :
24462479 self ._with_js = True
24472480 writer .with_javascript = True
24482481 map (self .visit , node .body )
0 commit comments