Skip to content

Commit 2a03ea8

Browse files
author
hartsantler
committed
fixed builtin round
1 parent 5c00d75 commit 2a03ea8

4 files changed

Lines changed: 65 additions & 40 deletions

File tree

pythonjs/pythonjs.js

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,9 +1686,9 @@ var float = function(args, kwargs) {
16861686
}
16871687
;float.is_wrapper = true;
16881688
var round = function(args, kwargs) {
1689-
var y,x,c,b;
1689+
var p,b;
16901690
var __sig__,__args__;
1691-
__sig__ = { kwargs:{},args:["a", "places"] };
1691+
__sig__ = { kwargs:{"places": 0},args:["a", "places"] };
16921692
if (args instanceof Array && ( Object.prototype.toString.call(kwargs) ) == "[object Object]" && ( arguments.length ) == 2) {
16931693
/*pass*/
16941694
} else {
@@ -1702,10 +1702,8 @@ var round = function(args, kwargs) {
17021702
if (( b.indexOf(".") ) == -1) {
17031703
return a;
17041704
} else {
1705-
c = b.split(".");
1706-
x = c[0];
1707-
y = c[1].substring(0, places);
1708-
return parseFloat(((x + ".") + y));
1705+
p = Math.pow(10, places);
1706+
return (Math.round((a * p)) / p);
17091707
}
17101708
}
17111709
;round.is_wrapper = true;
@@ -2759,18 +2757,25 @@ var __dict___init__ = function(args, kwargs) {
27592757
k = o["key"];
27602758
v = o["value"];
27612759
}
2762-
__get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1198: self.__setitem__( k,v )"), "__call__")([k, v], __NULL_OBJECT__);
2760+
try {
2761+
__get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1199: self.__setitem__( k,v )"), "__call__")([k, v], __NULL_OBJECT__);
2762+
} catch(__exception__) {
2763+
if (__exception__ == KeyError || __exception__ instanceof KeyError) {
2764+
throw new KeyError("error in dict init, bad key");
2765+
}
2766+
2767+
}
27632768
}
27642769
} else {
27652770
if (__test_if_true__(isinstance([ob, dict], __NULL_OBJECT__))) {
27662771
var key,__iterator__46;
2767-
__iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1200: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__);
2772+
__iterator__46 = __get__(__get__(__jsdict_keys(ob), "__iter__", "no iterator - line 1203: for key in ob.keys():"), "__call__")([], __NULL_OBJECT__);
27682773
var __next__46;
27692774
__next__46 = __get__(__iterator__46, "next");
27702775
while (( __iterator__46.index ) < __iterator__46.length) {
27712776
key = __next__46();
2772-
value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1201: value = ob[ key ]")([key], __NULL_OBJECT__));
2773-
__get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1202: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__);
2777+
value = ((ob instanceof Array) ? ob[key] : __get__(ob, "__getitem__", "line 1204: value = ob[ key ]")([key], __NULL_OBJECT__));
2778+
__get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1205: self.__setitem__( key, value )"), "__call__")([key, value], __NULL_OBJECT__);
27742779
}
27752780
} else {
27762781
console.log("ERROR init dict from:", js_object);
@@ -2796,15 +2801,15 @@ var __dict_jsify = function(args, kwargs) {
27962801
var self = __args__['self'];
27972802
keys = __object_keys__([self["$wrapped"]], __NULL_OBJECT__);
27982803
var key,__iterator__47;
2799-
__iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1209: for key in keys:"), "__call__")([], __NULL_OBJECT__);
2804+
__iterator__47 = __get__(__get__(keys, "__iter__", "no iterator - line 1212: for key in keys:"), "__call__")([], __NULL_OBJECT__);
28002805
var __next__47;
28012806
__next__47 = __get__(__iterator__47, "next");
28022807
while (( __iterator__47.index ) < __iterator__47.length) {
28032808
key = __next__47();
2804-
value = __get__(self["$wrapped"], "__getitem__", "line 1210: value = self[...][key]")([key], __NULL_OBJECT__);
2809+
value = __get__(self["$wrapped"], "__getitem__", "line 1213: value = self[...][key]")([key], __NULL_OBJECT__);
28052810
if (( typeof(value) ) == "object") {
28062811
if (__test_if_true__(hasattr([value, "jsify"], __NULL_OBJECT__))) {
2807-
__get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1213: self[...][key] = value.jsify()"), "__call__")()], {});
2812+
__get__(__get__(self["$wrapped"], "__setitem__"), "__call__")([key, __get__(__get__(value, "jsify", "missing attribute `jsify` - line 1216: self[...][key] = value.jsify()"), "__call__")()], {});
28082813
}
28092814
} else {
28102815
if (( typeof(value) ) == "function") {
@@ -2863,7 +2868,7 @@ var __dict_has_key = function(args, kwargs) {
28632868
var key = __args__['key'];
28642869
__dict = self["$wrapped"];
28652870
if (__test_if_true__(typeof(key) === 'object' || typeof(key) === 'function')) {
2866-
key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1226: key = key.__uid__");
2871+
key = __get__(key, "__uid__", "missing attribute `__uid__` - line 1229: key = key.__uid__");
28672872
}
28682873
if (__test_if_true__(key in __dict)) {
28692874
return true;
@@ -2887,12 +2892,12 @@ var __dict_update = function(args, kwargs) {
28872892
var self = __args__['self'];
28882893
var other = __args__['other'];
28892894
var key,__iterator__48;
2890-
__iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1232: for key in other:"), "__call__")([], __NULL_OBJECT__);
2895+
__iterator__48 = __get__(__get__(other, "__iter__", "no iterator - line 1235: for key in other:"), "__call__")([], __NULL_OBJECT__);
28912896
var __next__48;
28922897
__next__48 = __get__(__iterator__48, "next");
28932898
while (( __iterator__48.index ) < __iterator__48.length) {
28942899
key = __next__48();
2895-
__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__);
2900+
__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__);
28962901
}
28972902
}
28982903
;__dict_update.is_wrapper = true;
@@ -2911,12 +2916,12 @@ var __dict_items = function(args, kwargs) {
29112916
var self = __args__['self'];
29122917
arr = [];
29132918
var key,__iterator__49;
2914-
__iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1236: for key in self.keys():"), "__call__")([], __NULL_OBJECT__);
2919+
__iterator__49 = __get__(__get__(__jsdict_keys(self), "__iter__", "no iterator - line 1239: for key in self.keys():"), "__call__")([], __NULL_OBJECT__);
29152920
var __next__49;
29162921
__next__49 = __get__(__iterator__49, "next");
29172922
while (( __iterator__49.index ) < __iterator__49.length) {
29182923
key = __next__49();
2919-
__get__(__get__(arr, "append", "missing attribute `append` - line 1237: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__);
2924+
__get__(__get__(arr, "append", "missing attribute `append` - line 1240: arr.append( [key, self[key]] )"), "__call__")([[key, __get__(self, "__getitem__")([key], __NULL_OBJECT__)]], __NULL_OBJECT__);
29202925
}
29212926
return arr;
29222927
}
@@ -2959,7 +2964,7 @@ var __dict_set = function(args, kwargs) {
29592964
var self = __args__['self'];
29602965
var key = __args__['key'];
29612966
var value = __args__['value'];
2962-
__get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1245: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__);
2967+
__get__(__get__(self, "__setitem__", "missing attribute `__setitem__` - line 1248: self.__setitem__(key, value)"), "__call__")([key, value], __NULL_OBJECT__);
29632968
}
29642969
;__dict_set.is_wrapper = true;
29652970
__dict_attrs.set = __dict_set;
@@ -3278,7 +3283,7 @@ var __array___init__ = function(args, kwargs) {
32783283
var initializer = __args__['initializer'];
32793284
var little_endian = __args__['little_endian'];
32803285
self.typecode = typecode;
3281-
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__);
3286+
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__);
32823287
self.little_endian = little_endian;
32833288
if (__test_if_true__(initializer)) {
32843289
self.length = len([initializer], __NULL_OBJECT__);
@@ -3302,7 +3307,7 @@ var __array___init__ = function(args, kwargs) {
33023307
buff = new ArrayBuffer(size);
33033308
self.dataview = new DataView(buff);
33043309
self.buffer = buff;
3305-
__get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1450: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__);
3310+
__get__(__get__(self, "fromlist", "missing attribute `fromlist` - line 1453: self.fromlist( initializer )"), "__call__")([initializer], __NULL_OBJECT__);
33063311
}
33073312
;__array___init__.is_wrapper = true;
33083313
__array_attrs.__init__ = __array___init__;
@@ -3335,7 +3340,7 @@ var __array___contains__ = function(args, kwargs) {
33353340
__args__ = __getargs__("__array___contains__", __sig__, args, kwargs);
33363341
var self = __args__['self'];
33373342
var value = __args__['value'];
3338-
arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1456: arr = self.to_array()"), "__call__")();
3343+
arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1459: arr = self.to_array()"), "__call__")();
33393344
if (( arr.indexOf(value) ) == -1) {
33403345
return false;
33413346
} else {
@@ -3360,7 +3365,7 @@ var __array___getitem__ = function(args, kwargs) {
33603365
step = self.itemsize;
33613366
offset = (step * index);
33623367
dataview = self.dataview;
3363-
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__));
3368+
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__));
33643369
func = dataview[func_name].bind(dataview);
33653370
if (( offset ) < self.bytes) {
33663371
value = func(offset);
@@ -3398,7 +3403,7 @@ var __array___setitem__ = function(args, kwargs) {
33983403
}
33993404
offset = (step * index);
34003405
dataview = self.dataview;
3401-
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__));
3406+
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__));
34023407
func = dataview[func_name].bind(dataview);
34033408
if (( offset ) < self.bytes) {
34043409
if (( self.typecode ) == "float8") {
@@ -3466,13 +3471,13 @@ var __array_fromlist = function(args, kwargs) {
34663471
typecode = self.typecode;
34673472
size = (length * step);
34683473
dataview = self.dataview;
3469-
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__));
3474+
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__));
34703475
func = dataview[func_name].bind(dataview);
34713476
if (( size ) <= self.bytes) {
34723477
i = 0;
34733478
offset = 0;
34743479
while (( i ) < length) {
3475-
item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1505: item = lst[i]")([i], __NULL_OBJECT__));
3480+
item = ((lst instanceof Array) ? lst[i] : __get__(lst, "__getitem__", "line 1508: item = lst[i]")([i], __NULL_OBJECT__));
34763481
if (( typecode ) == "float8") {
34773482
item *= self._norm_set;
34783483
} else {
@@ -3530,7 +3535,7 @@ var __array_append = function(args, kwargs) {
35303535
var self = __args__['self'];
35313536
var value = __args__['value'];
35323537
length = self.length;
3533-
__get__(__get__(self, "resize", "missing attribute `resize` - line 1528: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__);
3538+
__get__(__get__(self, "resize", "missing attribute `resize` - line 1531: self.resize( self.length + 1 )"), "__call__")([(self.length + 1)], __NULL_OBJECT__);
35343539
__get__(__get__(self, "__setitem__"), "__call__")([length, value], {});
35353540
}
35363541
;__array_append.is_wrapper = true;
@@ -3549,12 +3554,12 @@ var __array_extend = function(args, kwargs) {
35493554
var self = __args__['self'];
35503555
var lst = __args__['lst'];
35513556
var value,__iterator__54;
3552-
__iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1531: for value in lst:"), "__call__")([], __NULL_OBJECT__);
3557+
__iterator__54 = __get__(__get__(lst, "__iter__", "no iterator - line 1534: for value in lst:"), "__call__")([], __NULL_OBJECT__);
35533558
var __next__54;
35543559
__next__54 = __get__(__iterator__54, "next");
35553560
while (( __iterator__54.index ) < __iterator__54.length) {
35563561
value = __next__54();
3557-
__get__(__get__(self, "append", "missing attribute `append` - line 1532: self.append( value )"), "__call__")([value], __NULL_OBJECT__);
3562+
__get__(__get__(self, "append", "missing attribute `append` - line 1535: self.append( value )"), "__call__")([value], __NULL_OBJECT__);
35583563
}
35593564
}
35603565
;__array_extend.is_wrapper = true;
@@ -3594,7 +3599,7 @@ var __array_to_list = function(args, kwargs) {
35943599
}
35953600
__args__ = __getargs__("__array_to_list", __sig__, args, kwargs);
35963601
var self = __args__['self'];
3597-
return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1542: return self.to_array()"), "__call__")();
3602+
return __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1545: return self.to_array()"), "__call__")();
35983603
}
35993604
;__array_to_list.is_wrapper = true;
36003605
__array_attrs.to_list = __array_to_list;
@@ -3611,9 +3616,9 @@ var __array_to_ascii = function(args, kwargs) {
36113616
__args__ = __getargs__("__array_to_ascii", __sig__, args, kwargs);
36123617
var self = __args__['self'];
36133618
string = "";
3614-
arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1545: arr = self.to_array()"), "__call__")();
3619+
arr = __get__(__get__(self, "to_array", "missing attribute `to_array` - line 1548: arr = self.to_array()"), "__call__")();
36153620
i = 0;
3616-
length = __get__(arr, "length", "missing attribute `length` - line 1546: i = 0; length = arr.length");
3621+
length = __get__(arr, "length", "missing attribute `length` - line 1549: i = 0; length = arr.length");
36173622
while (( i ) < length) {
36183623
var num = arr[i];
36193624
var char = String.fromCharCode(num);

pythonjs/pythonjs.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,14 @@ def _visit_function(self, node):
338338
raise RuntimeError(chunks)
339339
sub = []
340340
for ci,chk in enumerate(chunks):
341+
#if not chk.startswith('@'): ## special inline javascript.
342+
# chk = '```'+chk+'```'
343+
#chk = chk.replace('$', '```')
344+
341345
if not ci%2:
342346
if '@' in chk:
343347
raise SyntaxError(chunks)
348+
344349
if ci==0:
345350
if chk:
346351
sub.append('"%s"'%chk)
@@ -363,6 +368,7 @@ def _visit_function(self, node):
363368
lines.append( 'glsljit.push(%s);' %''.join(sub))
364369

365370
else:
371+
sub = sub.replace('$', '```')
366372
lines.append( 'glsljit.push("%s");' %(self.indent()+sub) )
367373

368374

@@ -400,9 +406,11 @@ def _visit_function(self, node):
400406
lines.append(' var __webclgl = new WebCLGL()')
401407
lines.append(' var header = glsljit.compile_header()')
402408
lines.append(' var shader = glsljit.compile_main()')
403-
lines.append(' console.log(header)')
409+
410+
#lines.append(' console.log(header)')
404411
lines.append(' console.log("-----------")')
405412
lines.append(' console.log(shader)')
413+
406414
## create the webCLGL kernel, compiles GLSL source
407415
lines.append(' var __kernel = __webclgl.createKernel( shader, header );')
408416

@@ -1072,6 +1080,8 @@ def visit_For(self, node):
10721080
'`@var %s = %s[0];`' %(target, iter) ## capture first item with target name so that for loops can get the length of member arrays
10731081
]
10741082

1083+
##TODO## lines.append('$') ## optimizes webclgl parser
1084+
10751085
lines.append('for (int _iter=0; _iter < `__length__`; _iter++) {' )
10761086

10771087
## declare struct variable ##
@@ -1082,6 +1092,8 @@ def visit_For(self, node):
10821092
lines.append( '`@glsljit.push("if (_iter==" +__j+ ") { %s=%s_" +__j+ ";}");`' %(target, iter))
10831093
lines.append( '`@}`')
10841094

1095+
##TODO## lines.append('$') ## optimizes webclgl parser
1096+
10851097

10861098
elif isinstance(node.iter, ast.Call): ## `for i in range(n):`
10871099
iter = self.visit(node.iter.args[0])

pythonjs/runtime/builtins.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -812,17 +812,16 @@ def float(a):
812812
raise ValueError('can not convert to float: '+a)
813813
return b
814814

815-
def round(a, places):
815+
def round(a, places=0):
816816
with javascript:
817817
b = '' + a
818818
if b.indexOf('.') == -1:
819819
return a
820820
else:
821-
c = b.split('.')
822-
x = c[0]
823-
y = c[1].substring(0, places)
824-
return parseFloat( x+'.'+y )
825-
821+
## this could return NaN with large numbers and large places,
822+
## TODO check for NaN and instead fallback to `a.toFixed(places)`
823+
p = Math.pow(10, places)
824+
return Math.round(a * p) / p
826825

827826
def str(s):
828827
return ''+s
@@ -1419,7 +1418,10 @@ def __init__(self, js_object=None, pointer=None):
14191418
else:
14201419
k= o['key']; v= o['value']
14211420

1422-
self.__setitem__( k,v )
1421+
try:
1422+
self.__setitem__( k,v )
1423+
except KeyError:
1424+
raise KeyError('error in dict init, bad key')
14231425

14241426
elif isinstance(ob, dict):
14251427
for key in ob.keys():

regtests/lang/builtins.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,9 @@ def main():
2020
i = int( 100.1 )
2121
TestError( i == 100 )
2222

23+
r = round( 5.49 )
24+
TestError( r == 5 )
25+
26+
r = round( 5.49, 1 )
27+
TestError( r == 5.5 )
28+

0 commit comments

Comments
 (0)