Skip to content

Commit d6235d5

Browse files
author
hartsantler
committed
improved array implementation
1 parent 115cdce commit d6235d5

3 files changed

Lines changed: 322 additions & 40 deletions

File tree

pythonscript.js

Lines changed: 242 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// PythonScript Runtime - regenerated on: Thu Oct 10 00:32:54 2013
1+
// PythonScript Runtime - regenerated on: Thu Oct 10 06:35:59 2013
22
var jsrange = function(num) {
33
"Emulates Python's range function";
44
var i, r;
@@ -1334,4 +1334,244 @@ window["__str___iter__"] = __str___iter__
13341334

13351335
__str___iter__.pythonscript_function = true;
13361336
window["__str_attrs"]["__iter__"] = __str___iter__;
1337-
str = create_class("str", window["__str_parents"], window["__str_attrs"]);
1337+
str = create_class("str", window["__str_parents"], window["__str_attrs"]);
1338+
var array, __array_attrs, __array_parents;
1339+
window["__array_attrs"] = Object();
1340+
window["__array_parents"] = create_array();
1341+
__array_typecodes = get_attribute(dict, "__call__")([], {"js_object": [{"key": "c", "value": 1}, {"key": "b", "value": 1}, {"key": "B", "value": 1}, {"key": "u", "value": 2}, {"key": "h", "value": 2}, {"key": "H", "value": 2}, {"key": "i", "value": 4}, {"key": "I", "value": 4}, {"key": "l", "value": 4}, {"key": "L", "value": 4}, {"key": "f", "value": 4}, {"key": "d", "value": 8}]});
1342+
window["__array_attrs"]["typecodes"] = __array_typecodes;
1343+
__array_typecode_names = get_attribute(dict, "__call__")([], {"js_object": [{"key": "c", "value": "Int8"}, {"key": "b", "value": "Int8"}, {"key": "B", "value": "Uint8"}, {"key": "u", "value": "Uint16"}, {"key": "h", "value": "Int16"}, {"key": "H", "value": "Uint16"}, {"key": "i", "value": "Int32"}, {"key": "I", "value": "Uint32"}, {"key": "f", "value": "Float32"}, {"key": "d", "value": "Float64"}]});
1344+
window["__array_attrs"]["typecode_names"] = __array_typecode_names;
1345+
var __array___init__ = function(args, kwargs) {
1346+
var size, buff;
1347+
var signature, arguments;
1348+
signature = {"kwargs": {"initializer": undefined, "little_endian": false}, "args": create_array("self", "typecode", "initializer", "little_endian")};
1349+
arguments = get_arguments(signature, args, kwargs);
1350+
var self = arguments['self'];
1351+
var typecode = arguments['typecode'];
1352+
var initializer = arguments['initializer'];
1353+
var little_endian = arguments['little_endian'];
1354+
self["__dict__"]["typecode"] = typecode;
1355+
self["__dict__"]["itemsize"] = get_attribute(self["__class__"]["__dict__"]["typecodes"], "__getitem__")([typecode], Object());
1356+
self["__dict__"]["little_endian"] = little_endian;
1357+
if(initializer) {
1358+
var __args_11, __kwargs_11;
1359+
__args_11 = create_array(initializer);
1360+
__kwargs_11 = Object();
1361+
self["__dict__"]["length"] = get_attribute(len, "__call__")(__args_11, __kwargs_11);
1362+
self["__dict__"]["bytes"] = self["__dict__"]["length"] * self["__dict__"]["itemsize"];
1363+
}
1364+
else {
1365+
self["__dict__"]["length"] = 0;
1366+
self["__dict__"]["bytes"] = 0;
1367+
}
1368+
1369+
size = self["__dict__"]["bytes"];
1370+
buff = new ArrayBuffer(size);
1371+
self["__dict__"]["dataview"] = new DataView(buff);
1372+
self["__dict__"]["buffer"] = buff;
1373+
var __args_12, __kwargs_12;
1374+
__args_12 = create_array(initializer);
1375+
__kwargs_12 = Object();
1376+
get_attribute(get_attribute(self, "fromlist"), "__call__")(__args_12, __kwargs_12);
1377+
}
1378+
window["__array___init__"] = __array___init__
1379+
1380+
__array___init__.pythonscript_function = true;
1381+
window["__array_attrs"]["__init__"] = __array___init__;
1382+
var __array___len__ = function(args, kwargs) {
1383+
var signature, arguments;
1384+
signature = {"kwargs": Object(), "args": create_array("self")};
1385+
arguments = get_arguments(signature, args, kwargs);
1386+
var self = arguments['self'];
1387+
return self["__dict__"]["length"];
1388+
}
1389+
window["__array___len__"] = __array___len__
1390+
1391+
__array___len__.pythonscript_function = true;
1392+
window["__array_attrs"]["__len__"] = __array___len__;
1393+
var __array___getitem__ = function(args, kwargs) {
1394+
var func_name, step, dataview, func, offset;
1395+
var signature, arguments;
1396+
signature = {"kwargs": Object(), "args": create_array("self", "index")};
1397+
arguments = get_arguments(signature, args, kwargs);
1398+
var self = arguments['self'];
1399+
var index = arguments['index'];
1400+
step = self["__dict__"]["itemsize"];
1401+
offset = step * index;
1402+
dataview = self["__dict__"]["dataview"];
1403+
func_name = "get" + get_attribute(self["__class__"]["__dict__"]["typecode_names"], "__getitem__")([self["__dict__"]["typecode"]], Object());
1404+
func = dataview[func_name].bind(dataview);
1405+
if(offset < self["__dict__"]["bytes"]) {
1406+
return func(offset);
1407+
}
1408+
else {
1409+
throw IndexError;
1410+
}
1411+
1412+
}
1413+
window["__array___getitem__"] = __array___getitem__
1414+
1415+
__array___getitem__.pythonscript_function = true;
1416+
window["__array_attrs"]["__getitem__"] = __array___getitem__;
1417+
var __array___setitem__ = function(args, kwargs) {
1418+
var func_name, step, dataview, func, offset;
1419+
var signature, arguments;
1420+
signature = {"kwargs": Object(), "args": create_array("self", "index", "value")};
1421+
arguments = get_arguments(signature, args, kwargs);
1422+
var self = arguments['self'];
1423+
var index = arguments['index'];
1424+
var value = arguments['value'];
1425+
step = self["__dict__"]["itemsize"];
1426+
if(index < 0) {
1427+
index = self["__dict__"]["length"] + index - 1;
1428+
}
1429+
1430+
offset = step * index;
1431+
dataview = self["__dict__"]["dataview"];
1432+
func_name = "set" + get_attribute(self["__class__"]["__dict__"]["typecode_names"], "__getitem__")([self["__dict__"]["typecode"]], Object());
1433+
func = dataview[func_name].bind(dataview);
1434+
if(offset < self["__dict__"]["bytes"]) {
1435+
func(offset, value);
1436+
}
1437+
else {
1438+
throw IndexError;
1439+
}
1440+
1441+
}
1442+
window["__array___setitem__"] = __array___setitem__
1443+
1444+
__array___setitem__.pythonscript_function = true;
1445+
window["__array_attrs"]["__setitem__"] = __array___setitem__;
1446+
var __array___iter__ = function(args, kwargs) {
1447+
var signature, arguments;
1448+
signature = {"kwargs": Object(), "args": create_array("self")};
1449+
arguments = get_arguments(signature, args, kwargs);
1450+
var self = arguments['self'];
1451+
var __args_13, __kwargs_13;
1452+
__args_13 = create_array(self, 0);
1453+
__kwargs_13 = Object();
1454+
return get_attribute(Iterator, "__call__")(__args_13, __kwargs_13);
1455+
}
1456+
window["__array___iter__"] = __array___iter__
1457+
1458+
__array___iter__.pythonscript_function = true;
1459+
window["__array_attrs"]["__iter__"] = __array___iter__;
1460+
var __array_get = function(args, kwargs) {
1461+
var signature, arguments;
1462+
signature = {"kwargs": Object(), "args": create_array("self", "index")};
1463+
arguments = get_arguments(signature, args, kwargs);
1464+
var self = arguments['self'];
1465+
var index = arguments['index'];
1466+
return __array___getitem__([self, index]);
1467+
}
1468+
window["__array_get"] = __array_get
1469+
1470+
__array_get.pythonscript_function = true;
1471+
window["__array_attrs"]["get"] = __array_get;
1472+
var __array_fromlist = function(args, kwargs) {
1473+
var func_name, dataview, length, step, func, size;
1474+
var signature, arguments;
1475+
signature = {"kwargs": Object(), "args": create_array("self", "lst")};
1476+
arguments = get_arguments(signature, args, kwargs);
1477+
var self = arguments['self'];
1478+
var lst = arguments['lst'];
1479+
var __args_14, __kwargs_14;
1480+
__args_14 = create_array(lst);
1481+
__kwargs_14 = Object();
1482+
length = get_attribute(len, "__call__")(__args_14, __kwargs_14);
1483+
step = self["__dict__"]["itemsize"];
1484+
size = length * step;
1485+
dataview = self["__dict__"]["dataview"];
1486+
func_name = "set" + get_attribute(self["__class__"]["__dict__"]["typecode_names"], "__getitem__")([self["__dict__"]["typecode"]], Object());
1487+
func = dataview[func_name].bind(dataview);
1488+
if(size <= self["__dict__"]["bytes"]) {
1489+
i = 0;
1490+
offset = 0;
1491+
while(i < length) {
1492+
item = get_attribute(lst, "__getitem__")([i], Object());
1493+
func(offset,item);
1494+
offset += step
1495+
i += 1
1496+
}
1497+
}
1498+
else {
1499+
throw TypeError;
1500+
}
1501+
1502+
}
1503+
window["__array_fromlist"] = __array_fromlist
1504+
1505+
__array_fromlist.pythonscript_function = true;
1506+
window["__array_attrs"]["fromlist"] = __array_fromlist;
1507+
var __array_resize = function(args, kwargs) {
1508+
var source, new_buff, target, new_size, buff;
1509+
var signature, arguments;
1510+
signature = {"kwargs": Object(), "args": create_array("self", "length")};
1511+
arguments = get_arguments(signature, args, kwargs);
1512+
var self = arguments['self'];
1513+
var length = arguments['length'];
1514+
buff = self["__dict__"]["buffer"];
1515+
source = new Uint8Array(buff);
1516+
new_size = length * self["__dict__"]["itemsize"];
1517+
new_buff = new ArrayBuffer(new_size);
1518+
target = new Uint8Array(new_buff);
1519+
target.set(source);
1520+
self["__dict__"]["length"] = length;
1521+
self["__dict__"]["bytes"] = new_size;
1522+
self["__dict__"]["buffer"] = new_buff;
1523+
self["__dict__"]["dataview"] = new DataView(new_buff);
1524+
}
1525+
window["__array_resize"] = __array_resize
1526+
1527+
__array_resize.pythonscript_function = true;
1528+
window["__array_attrs"]["resize"] = __array_resize;
1529+
var __array_append = function(args, kwargs) {
1530+
var length;
1531+
var signature, arguments;
1532+
signature = {"kwargs": Object(), "args": create_array("self", "value")};
1533+
arguments = get_arguments(signature, args, kwargs);
1534+
var self = arguments['self'];
1535+
var value = arguments['value'];
1536+
length = self["__dict__"]["length"];
1537+
var __args_15, __kwargs_15;
1538+
__args_15 = create_array(self["__dict__"]["length"] + 1);
1539+
__kwargs_15 = Object();
1540+
get_attribute(get_attribute(self, "resize"), "__call__")(__args_15, __kwargs_15);
1541+
get_attribute(get_attribute(self, "__setitem__"), "__call__")([length, value], Object());
1542+
}
1543+
window["__array_append"] = __array_append
1544+
1545+
__array_append.pythonscript_function = true;
1546+
window["__array_attrs"]["append"] = __array_append;
1547+
var __array_extend = function(args, kwargs) {
1548+
var signature, arguments;
1549+
signature = {"kwargs": Object(), "args": create_array("self", "lst")};
1550+
arguments = get_arguments(signature, args, kwargs);
1551+
var self = arguments['self'];
1552+
var lst = arguments['lst'];
1553+
var __iterator__, value;
1554+
__iterator__ = get_attribute(get_attribute(lst, "__iter__"), "__call__")(create_array(), Object());
1555+
try {
1556+
value = get_attribute(__iterator__, "next")(create_array(), Object());
1557+
while(true) {
1558+
var __args_16, __kwargs_16;
1559+
__args_16 = create_array(value);
1560+
__kwargs_16 = Object();
1561+
get_attribute(get_attribute(self, "append"), "__call__")(__args_16, __kwargs_16);
1562+
value = get_attribute(__iterator__, "next")(create_array(), Object());
1563+
}
1564+
}
1565+
catch(__exception__) {
1566+
if (__exception__ == StopIteration || isinstance([__exception__, StopIteration])) {
1567+
1568+
}
1569+
1570+
}
1571+
1572+
}
1573+
window["__array_extend"] = __array_extend
1574+
1575+
__array_extend.pythonscript_function = true;
1576+
window["__array_attrs"]["extend"] = __array_extend;
1577+
array = create_class("array", window["__array_parents"], window["__array_attrs"]);

runtime/builtins.py

Lines changed: 63 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -324,70 +324,95 @@ class array:
324324
}
325325
def __init__(self, typecode, initializer=None, little_endian=False):
326326
self.typecode = typecode
327+
self.itemsize = self.typecodes[ typecode ]
327328
self.little_endian = little_endian
328-
size = 0
329+
329330
if initializer:
330-
length = len(initializer)
331-
print 'array.initalizer length', length
332-
print 'array.typecode', typecode
333-
print 'array.type size', self.typecodes[ typecode ]
334-
size = length * self.typecodes[ typecode ]
335-
else: size = 0
336-
self.size = size
337-
print 'array.init bytes', size
331+
self.length = len(initializer)
332+
self.bytes = self.length * self.itemsize
333+
else:
334+
self.length = 0
335+
self.bytes = 0
336+
337+
size = self.bytes
338338
buff = JS('new ArrayBuffer(size)')
339339
self.dataview = JS('new DataView(buff)')
340340
self.buffer = buff
341341
self.fromlist( initializer )
342342

343-
def fromlist(self, lst):
344-
print 'array.fromlist->', lst
345-
length = len(lst)
346-
step = self.typecodes[ self.typecode ]
347-
size = length * step
348-
349-
dataview = self.dataview
350-
func_name = 'set'+self.typecode_names[ self.typecode ]
351-
print 'func name->', func_name
352-
func = JS('dataview[func_name].bind(dataview)')
353-
print 'func->', func
354-
if size <= self.size:
355-
i = 0; offset = 0
356-
while i < length:
357-
item = lst[i]
358-
print ' item->', item
359-
print ' index', i
360-
print ' offset', offset
361-
#JS('func.apply(dataview, [offset, item])')
362-
#JS('func.call(dataview, offset, item)')
363-
JS('func(offset,item)')
364-
offset += step
365-
i += 1
366-
else:
367-
raise TypeError
343+
def __len__(self):
344+
return self.length
368345

369346
def __getitem__(self, index):
370-
step = self.typecodes[ self.typecode ]
347+
step = self.itemsize
371348
offset = step * index
372349

373350
dataview = self.dataview
374351
func_name = 'get'+self.typecode_names[ self.typecode ]
375352
func = JS('dataview[func_name].bind(dataview)')
376353

377-
if offset < self.size:
354+
if offset < self.bytes:
378355
return JS('func(offset)')
379356
else:
380357
raise IndexError
381358

382359
def __setitem__(self, index, value):
383-
step = self.typecodes[ self.typecode ]
360+
step = self.itemsize
361+
if index < 0: index = self.length + index -1
384362
offset = step * index
385363

386364
dataview = self.dataview
387365
func_name = 'set'+self.typecode_names[ self.typecode ]
388366
func = JS('dataview[func_name].bind(dataview)')
389367

390-
if offset < self.size:
368+
if offset < self.bytes:
391369
JS('func(offset, value)')
392370
else:
393371
raise IndexError
372+
373+
def __iter__(self):
374+
return Iterator(self, 0)
375+
376+
def get(self, index):
377+
return self[ index ]
378+
379+
def fromlist(self, lst):
380+
length = len(lst)
381+
step = self.itemsize
382+
size = length * step
383+
384+
dataview = self.dataview
385+
func_name = 'set'+self.typecode_names[ self.typecode ]
386+
func = JS('dataview[func_name].bind(dataview)')
387+
if size <= self.bytes:
388+
i = 0; offset = 0
389+
while i < length:
390+
item = lst[i]
391+
JS('func(offset,item)')
392+
offset += step
393+
i += 1
394+
else:
395+
raise TypeError
396+
397+
def resize(self, length):
398+
buff = self.buffer
399+
source = JS('new Uint8Array(buff)')
400+
401+
new_size = length * self.itemsize
402+
new_buff = JS('new ArrayBuffer(new_size)')
403+
target = JS('new Uint8Array(new_buff)')
404+
JS('target.set(source)')
405+
406+
self.length = length
407+
self.bytes = new_size
408+
self.buffer = new_buff
409+
self.dataview = JS('new DataView(new_buff)')
410+
411+
def append(self, value):
412+
length = self.length
413+
self.resize( self.length + 1 )
414+
self[ length ] = value
415+
416+
def extend(self, lst): ## TODO optimize
417+
for value in lst:
418+
self.append( value )

0 commit comments

Comments
 (0)