Skip to content

Commit

Permalink
Dart backend: support for __getslice__, ** (Math.pow), // (Math.floor…
Browse files Browse the repository at this point in the history
…), updated nbody_fast.html so it also works with Dart.
  • Loading branch information
hartsantler committed Dec 9, 2013
1 parent b404723 commit 843f74e
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 33 deletions.
39 changes: 32 additions & 7 deletions pythonjs/python_to_pythonjs.py
Expand Up @@ -1148,7 +1148,9 @@ def visit_Subscript(self, node):
)

def visit_Slice(self, node):
if self._with_js:
if self._with_dart:
lower = upper = step = 'null'
elif self._with_js:
lower = upper = step = 'undefined'
else:
lower = upper = step = None
Expand Down Expand Up @@ -1310,7 +1312,7 @@ def _visit_assign_helper(self, node, target):
writer.write('%s = %s' % (self.visit(target), node_value))

elif self._with_dart and writer.is_at_global_level():
writer.write('var %s = %s' % (self.visit(target), node_value))
writer.write('JS("var %s = %s")' % (self.visit(target), node_value))
else:
writer.write('%s = %s' % (self.visit(target), node_value))

Expand Down Expand Up @@ -1723,15 +1725,34 @@ def visit_FunctionDef(self, node):
else:
decorators.append( decorator )

if self._with_js or javascript or self._with_dart:
if self._with_dart:
if node.args.vararg:
raise SyntaxError( 'pure javascript functions can not take variable arguments (*args)' )
elif node.args.kwarg:
raise SyntaxError( 'pure javascript functions can not take variable keyword arguments (**kwargs)' )

for dec in with_dart_decorators: writer.write('@%s'%dec)

args = []
offset = len(node.args.args) - len(node.args.defaults)
for i, arg in enumerate(node.args.args):
a = arg.id
dindex = i - offset
if dindex >= 0 and node.args.defaults:
default_value = self.visit( node.args.defaults[dindex] )
args.append( '%s=%s' %(a, default_value) )
else:
args.append( a )

writer.write( 'def %s( %s ):' % (node.name, ','.join(args)) )


elif self._with_js or javascript:
if node.args.vararg:
raise SyntaxError( 'pure javascript functions can not take variable arguments (*args)' )
elif node.args.kwarg:
raise SyntaxError( 'pure javascript functions can not take variable keyword arguments (**kwargs)' )

if self._with_dart:
for dec in with_dart_decorators:
writer.write('@%s'%dec)
args = [ a.id for a in node.args.args ]
writer.write( 'def %s( %s ):' % (node.name, ','.join(args)) )

Expand All @@ -1748,7 +1769,11 @@ def visit_FunctionDef(self, node):
a = ','.join( local_vars-global_vars )
writer.write('var(%s)' %a)

if self._with_js or javascript or self._with_dart:
#####################################################################
if self._with_dart:
pass

elif self._with_js or javascript:
if node.args.defaults:
offset = len(node.args.args) - len(node.args.defaults)
for i, arg in enumerate(node.args.args):
Expand Down
10 changes: 8 additions & 2 deletions pythonjs/pythonjs.py
Expand Up @@ -255,7 +255,13 @@ def visit_Call(self, node):
return s

elif name == 'dart_import':
return 'import "%s";' %node.args[0].s
if len(node.args) == 1:
return 'import "%s";' %node.args[0].s
elif len(node.args) == 2:
return 'import "%s" as %s;' %(node.args[0].s, node.args[1].s)
else:
raise SyntaxError


else:
if node.args:
Expand Down Expand Up @@ -467,7 +473,7 @@ def visit_For(self, node):

out = []
out.append( self.indent() + 'var %s = %s;' % (iname, iter) )
out.append( self.indent() + 'var %s = 0;' % index )
#out.append( self.indent() + 'var %s = 0;' % index )

self._visit_for_prep_iter_helper(node, out, iname)

Expand Down
27 changes: 23 additions & 4 deletions pythonjs/pythonjs_to_dart.py
Expand Up @@ -206,14 +206,19 @@ def visit_ClassDef(self, node):

def _visit_for_prep_iter_helper(self, node, out, iter_name):
out.append(
self.indent() + 'if (%s is dict) { %s = %s.keys(); }' %(iter_name, iter_name, iter_name)
#self.indent() + 'if (%s is dict) { %s = %s.keys(); }' %(iter_name, iter_name, iter_name)
self.indent() + 'if (%s is dict) %s = %s.keys();' %(iter_name, iter_name, iter_name)
)


def visit_Expr(self, node):
# XXX: this is UGLY
s = self.visit(node.value)
if not s.endswith(';'):
if isinstance(node.value, ast.Call) and isinstance(node.value.func, ast.Name) and node.value.func.id == 'JS':
if s.endswith('}') and 'return' in s.split(' '):
pass
elif not s.endswith(';'):
s += ';'
elif not s.endswith(';'):
s += ';'
return s

Expand Down Expand Up @@ -253,7 +258,21 @@ def _visit_function(self, node):
else:
raise SyntaxError

args = self.visit(node.args)
args = [] #self.visit(node.args)
oargs = []
offset = len(node.args.args) - len(node.args.defaults)
for i, arg in enumerate(node.args.args):
a = arg.id
dindex = i - offset
if dindex >= 0 and node.args.defaults:
default_value = self.visit( node.args.defaults[dindex] )
oargs.append( '%s=%s' %(a, default_value) )
else:
args.append( a )

if oargs:
args.append( '[%s]' % ','.join(oargs) )

buffer = self.indent()
if hasattr(node,'_prefix'): buffer += node._prefix + ' '

Expand Down
12 changes: 11 additions & 1 deletion runtime/dart_builtins.py
Expand Up @@ -3,6 +3,7 @@
# License: "New BSD"

dart_import('dart:collection')
dart_import('dart:math', 'Math')

@dart.extends
class list( ListBase ):
Expand Down Expand Up @@ -31,6 +32,13 @@ def __getitem__(self, index):
def __setitem__(self, index, value):
self[...][index] = value

def __getslice__(self, start, stop, step):
if stop == null and step == null:
return self[...].sublist( start )
elif stop < 0:
stop = self[...].length + stop
return self[...].sublist(start, stop)

def append(self, item):
self[...].add( item )

Expand All @@ -39,7 +47,7 @@ def index(self, obj):


#@dart.extends
class dict( HashMap ):
class dict: #( HashMap ):
'''
HashMap can not be extended anymore:
https://groups.google.com/a/dartlang.org/forum/#!msg/announce/Sj3guf3es24/YsPCdT_vb2gJ
Expand Down Expand Up @@ -77,3 +85,5 @@ def range(n):
i += 1
return r

def len(a):
return a.length
31 changes: 15 additions & 16 deletions tests/nbody_fast.html
Expand Up @@ -62,15 +62,10 @@
5.15138902046611451e-05 * SOLAR_MASS) }


SYSTEM = []
for key in BODIES:
print key
SYSTEM.append( BODIES[key] )

PAIRS = combinations(SYSTEM)


def advance(dt, n, bodies=SYSTEM, pairs=PAIRS):
def advance(dt, n, bodies, pairs):
for i in xrange(n):
for pair in pairs:
p1,p2 = pair
Expand Down Expand Up @@ -99,7 +94,7 @@
r[2] += dt * v[2]


def report_energy(bodies=SYSTEM, pairs=PAIRS, e=0.0):
def report_energy(bodies, pairs, e=0.0):
for pair in pairs:
p1,p2 = pair
vec1, v1, m1 = p1
Expand All @@ -119,7 +114,7 @@
return e


def offset_momentum(ref, bodies=SYSTEM, px=0.0, py=0.0, pz=0.0):
def offset_momentum(ref, bodies, px=0.0, py=0.0, pz=0.0):
for w in bodies:
r, v, m = w
vx, vy, vz = v
Expand All @@ -134,24 +129,28 @@


def test_nbody(iterations):
SYSTEM = []
for key in BODIES: SYSTEM.append( BODIES[key] )
PAIRS = combinations(SYSTEM)

# Warm-up runs.
report_energy()
advance(0.01, 20000)
report_energy()
report_energy( SYSTEM, PAIRS )
advance(0.01, 20000, SYSTEM, PAIRS )
report_energy( SYSTEM, PAIRS )

times = []
for _ in xrange(iterations):
t0 = time()
report_energy()
advance(0.01, 20000)
report_energy()
report_energy( SYSTEM, PAIRS )
advance(0.01, 20000, SYSTEM, PAIRS)
report_energy( SYSTEM, PAIRS )
t1 = time()
times.append(t1 - t0)
return times



def test():
def main():
times = test_nbody( 3 )
for t in times:
print 'time', t
Expand All @@ -161,6 +160,6 @@

</head>
<body>
<button id="mybutton" onclick="test()">click me</button>
<button id="mybutton" onclick="main()">click me</button>
</body>
</html>
9 changes: 7 additions & 2 deletions tests/server.py
Expand Up @@ -28,6 +28,7 @@
runtime_dart = os.path.abspath('../runtime/dart_builtins.py'),

dart2js = os.path.expanduser( '~/dart/dart-sdk/bin/dart2js'),
dartanalyzer = os.path.expanduser( '~/dart/dart-sdk/bin/dartanalyzer'),

)

Expand Down Expand Up @@ -62,14 +63,18 @@ def pythonjs_to_dart(src):
stdin = subprocess.PIPE,
stdout = subprocess.PIPE
)
dart_input = '/tmp/dart2js-input.dart'
stdout, stderr = p.communicate( src.encode('utf-8') )
open( '/tmp/dart2js-input.js', 'wb').write( stdout )
open( dart_input, 'wb').write( stdout )
ecode = subprocess.call( [PATHS['dartanalyzer'], dart_input] )
if ecode == 2:
raise SyntaxError

cmd = [
PATHS['dart2js'],
#'-c', ## insert runtime checks
'-o', '/tmp/dart2js-output.js',
'/tmp/dart2js-input.js'
dart_input
]
subprocess.call( cmd )
return open('/tmp/dart2js-output.js', 'rb').read().decode('utf-8')
Expand Down
4 changes: 3 additions & 1 deletion tests/test_for_loop.html
Expand Up @@ -4,8 +4,10 @@

<script type="text/python">


def main():
'''
basic for loop tests
'''
a = [1,2,3]
for x in a:
Expand Down

0 comments on commit 843f74e

Please sign in to comment.