Skip to content

Commit 2dd3235

Browse files
author
hartsantler
committed
go backend: support go.make
1 parent d9f143f commit 2dd3235

4 files changed

Lines changed: 31 additions & 16 deletions

File tree

pythonjs/python_to_pythonjs.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,10 @@ def __init__(self, source=None, module=None, module_path=None, dart=False, coffe
299299
self._source = source.splitlines()
300300

301301

302-
if '--debug' in sys.argv:
302+
if '--debug--' in sys.argv:
303303
try:
304304
tree = ast.parse( source )
305-
except:
305+
except SyntaxError:
306306
raise SyntaxError(source)
307307
else:
308308
tree = ast.parse( source )

pythonjs/pythonjs.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,7 @@ def visit_BinOp(self, node):
962962
if node.left.func.id == '__go__map__':
963963
key_type = self.visit(node.left.args[0])
964964
value_type = self.visit(node.left.args[1])
965+
if value_type == 'interface': value_type = 'interface{}'
965966
return 'map[%s]%s%s' %(key_type, value_type, right)
966967
else:
967968
if not right.startswith('{') and not right.endswith('}'):
@@ -973,6 +974,8 @@ def visit_BinOp(self, node):
973974
asize = self.visit(node.left.args[0])
974975
atype = self.visit(node.left.args[1])
975976
return '[%s]%s%s' %(asize, atype, right)
977+
elif isinstance(node.left, ast.Name) and node.left.id=='__go__array__' and op == '<<':
978+
return '[]%s' %self.visit(node.right)
976979

977980
if left in self._typed_vars and self._typed_vars[left] == 'numpy.float32':
978981
left += '[_id_]'

pythonjs/pythonjs_to_go.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ def __init__(self, requirejs=False, insert_runtime=False):
2121
self._known_vars = set()
2222
self._kwargs_type_ = dict()
2323

24+
self._imports = []
25+
2426
def visit_ClassDef(self, node):
2527
self._class_stack.append( node )
2628
node._parents = set()
@@ -152,9 +154,9 @@ def visit_Expr(self, node):
152154
def visit_Import(self, node):
153155
r = [alias.name.replace('__SLASH__', '/') for alias in node.names]
154156
if r:
155-
return 'import("%s")' %';'.join(r)
156-
else:
157-
return ''
157+
for name in r:
158+
self._imports.append('import("%s");' %name)
159+
return ''
158160

159161
def visit_Module(self, node):
160162
header = [
@@ -173,7 +175,10 @@ def visit_Module(self, node):
173175
else:
174176
lines.append( sub )
175177
else:
176-
raise SyntaxError(b)
178+
if isinstance(b, ast.Import):
179+
pass
180+
else:
181+
raise SyntaxError(b)
177182

178183
lines.append('type _kwargs_type_ struct {')
179184
for name in self._kwargs_type_:
@@ -182,7 +187,7 @@ def visit_Module(self, node):
182187
lines.append( ' __use__%s bool' %name)
183188
lines.append('}')
184189

185-
lines = header + lines
190+
lines = header + self._imports + lines
186191
return '\n'.join( lines )
187192

188193

@@ -269,12 +274,17 @@ def _visit_call_helper_go(self, node):
269274
name = self.visit(node.func)
270275
if name == '__go__':
271276
return 'go %s' %self.visit(node.args[0])
272-
elif name == '__gomake__':
277+
elif name == '__go_make__':
273278
return 'make(%s)' %self.visit(node.args[0])
274279
elif name == '__go_make_chan__':
275280
return 'make(chan %s)' %self.visit(node.args[0])
276281
elif name == '__go__array__':
277-
return '[]%s{}' %self.visit(node.args[0])
282+
if isinstance(node.args[0], ast.BinOp):# and node.args[0].op == '<<': ## todo assert right is `typedef`
283+
a = self.visit(node.args[0].left)
284+
return '[]%s' %a
285+
else:
286+
a = self.visit(node.args[0])
287+
return '[]%s{}' %a
278288
else:
279289
raise SyntaxError(name)
280290

@@ -507,7 +517,7 @@ def main(script, insert_runtime=True):
507517
script = runtime + '\n' + script
508518

509519
tree = ast.parse(script)
510-
#return GoGenerator().visit(tree)
520+
return GoGenerator().visit(tree)
511521
try:
512522
return GoGenerator().visit(tree)
513523
except SyntaxError as err:

pythonjs/typedpython.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
GO_SPECIAL_CALLS = {
2525
'go' : '__go__',
2626
'go.channel' : '__go_make_chan__',
27-
'go.array' : '__go__array__'
27+
'go.array' : '__go__array__',
28+
'go.make' : '__go_make__'
2829
}
2930

3031
def transform_source( source, strip=False ):
@@ -73,7 +74,8 @@ def transform_source( source, strip=False ):
7374
a.append(')<<{')
7475
hit_go_typedef = False
7576
elif hit_go_typedef and char==',':
76-
a.append('),')
77+
#a.append(', type=True),') ## this breaks function annotations that splits on ','
78+
a.append('<<typedef),')
7779
hit_go_typedef = False
7880

7981

@@ -270,12 +272,9 @@ def transform_source( source, strip=False ):
270272
tailend = tail[ tail.rindex(')')+1 : ]
271273
tail = tail[ : tail.rindex(')') ]
272274

273-
#print(head)
274-
#print(tail)
275-
#raise RuntimeError
276275

277276
for x in tail.split(','):
278-
y = x #x.split(')')[0]
277+
y = x
279278
if ':' in y:
280279
kw = None
281280
if '=' in y:
@@ -446,6 +445,9 @@ def f(*args:int, **kwargs:int) ->int:
446445
447446
y = go.make([]float64, 1000)
448447
448+
def plot(id:string, latency:[]float64, xlabel:string, title:string ):
449+
pass
450+
449451
'''
450452

451453
if __name__ == '__main__':

0 commit comments

Comments
 (0)