Skip to content

Commit d59559e

Browse files
author
hartsantler
committed
allow any object type to be used to contruct a dict litteral, and other improvements to dict class.
1 parent b5fe7f0 commit d59559e

5 files changed

Lines changed: 230 additions & 52 deletions

File tree

pythonscript.js

Lines changed: 110 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// PythonScript Runtime - regenerated on: Wed Oct 9 19:22:57 2013
1+
// PythonScript Runtime - regenerated on: Wed Oct 9 20:55:21 2013
22
var jsrange = function(num) {
33
"Emulates Python's range function";
44
var i, r;
@@ -1066,7 +1066,23 @@ arguments = get_arguments(signature, args, kwargs);
10661066
var self = arguments['self'];
10671067
var js_object = arguments['js_object'];
10681068
if(js_object) {
1069+
if(js_object instanceof Array) {
1070+
self["__dict__"]["js_object"] = Object.create(null);
1071+
i = 0;
1072+
while(i < get_attribute(js_object, "length")) {
1073+
var key = js_object[i]["key"];
1074+
var value = js_object[i]["value"];
1075+
var __args_8, __kwargs_8;
1076+
__args_8 = create_array(key, value);
1077+
__kwargs_8 = Object();
1078+
get_attribute(get_attribute(self, "set"), "__call__")(__args_8, __kwargs_8);
1079+
i += 1
1080+
}
1081+
}
1082+
else {
10691083
self["__dict__"]["js_object"] = js_object;
1084+
}
1085+
10701086
}
10711087
else {
10721088
self["__dict__"]["js_object"] = Object();
@@ -1080,18 +1096,37 @@ window["__dict_attrs"]["__init__"] = __dict___init__;
10801096
var __dict_get = function(args, kwargs) {
10811097
var __dict;
10821098
var signature, arguments;
1083-
signature = {"kwargs": Object(), "args": create_array("self", "key", "d")};
1099+
signature = {"kwargs": {"_default": undefined}, "args": create_array("self", "key", "_default")};
10841100
arguments = get_arguments(signature, args, kwargs);
10851101
var self = arguments['self'];
10861102
var key = arguments['key'];
1087-
var d = arguments['d'];
1088-
var __dict;
1103+
var _default = arguments['_default'];
10891104
__dict = self["__dict__"]["js_object"];
1090-
if(__dict[key]) {
1105+
if(typeof(key) === 'object') {
1106+
var uid = "@"+key.uid;
1107+
if(uid in __dict) {
1108+
return __dict[uid];
1109+
}
1110+
1111+
}
1112+
else {
1113+
if(typeof(key) === 'function') {
1114+
var uid = "@"+key.uid;
1115+
if(uid in __dict) {
1116+
return __dict[uid];
1117+
}
1118+
1119+
}
1120+
else {
1121+
if(key in __dict) {
10911122
return __dict[key];
10921123
}
10931124

1094-
return d;
1125+
}
1126+
1127+
}
1128+
1129+
return _default;
10951130
}
10961131
window["__dict_get"] = __dict_get
10971132

@@ -1105,9 +1140,34 @@ arguments = get_arguments(signature, args, kwargs);
11051140
var self = arguments['self'];
11061141
var key = arguments['key'];
11071142
var value = arguments['value'];
1108-
var __dict;
11091143
__dict = self["__dict__"]["js_object"];
1144+
if(typeof(key) === 'object') {
1145+
if(key.uid === undefined) {
1146+
uid = self["__class__"]["__dict__"]["UID"];
1147+
key.uid = uid;
1148+
self["__class__"]["__dict__"]["UID"] += 1
1149+
}
1150+
1151+
var uid = key.uid;
1152+
__dict["@"+uid] = value;
1153+
}
1154+
else {
1155+
if(typeof(key) === 'function') {
1156+
if(key.uid === undefined) {
1157+
uid = self["__class__"]["__dict__"]["UID"];
1158+
key.uid = uid;
1159+
self["__class__"]["__dict__"]["UID"] += 1
1160+
}
1161+
1162+
var uid = key.uid;
1163+
__dict["@"+uid] = value;
1164+
}
1165+
else {
11101166
__dict[key] = value;
1167+
}
1168+
1169+
}
1170+
11111171
}
11121172
window["__dict_set"] = __dict_set
11131173

@@ -1119,31 +1179,13 @@ var signature, arguments;
11191179
signature = {"kwargs": Object(), "args": create_array("self")};
11201180
arguments = get_arguments(signature, args, kwargs);
11211181
var self = arguments['self'];
1122-
var __dict;
11231182
__dict = self["__dict__"]["js_object"];
11241183
return Object.keys(__dict).length;
11251184
}
11261185
window["__dict___len__"] = __dict___len__
11271186

11281187
__dict___len__.pythonscript_function = true;
11291188
window["__dict_attrs"]["__len__"] = __dict___len__;
1130-
var __dict_keys = function(args, kwargs) {
1131-
var __dict, __keys, out;
1132-
var signature, arguments;
1133-
signature = {"kwargs": Object(), "args": create_array("self")};
1134-
arguments = get_arguments(signature, args, kwargs);
1135-
var self = arguments['self'];
1136-
var __dict, out;
1137-
__dict = self["__dict__"]["js_object"];
1138-
__keys = Object.keys(__dict);
1139-
out = get_attribute(list, "__call__")(create_array(), Object());
1140-
set_attribute(out, "js_object", __keys);
1141-
return out;
1142-
}
1143-
window["__dict_keys"] = __dict_keys
1144-
1145-
__dict_keys.pythonscript_function = true;
1146-
window["__dict_attrs"]["keys"] = __dict_keys;
11471189
var __dict___getitem__ = function(args, kwargs) {
11481190
var __dict;
11491191
var signature, arguments;
@@ -1213,6 +1255,45 @@ window["__dict___setitem__"] = __dict___setitem__
12131255

12141256
__dict___setitem__.pythonscript_function = true;
12151257
window["__dict_attrs"]["__setitem__"] = __dict___setitem__;
1258+
var __dict_keys = function(args, kwargs) {
1259+
var __dict, __keys, out;
1260+
var signature, arguments;
1261+
signature = {"kwargs": Object(), "args": create_array("self")};
1262+
arguments = get_arguments(signature, args, kwargs);
1263+
var self = arguments['self'];
1264+
__dict = self["__dict__"]["js_object"];
1265+
__keys = Object.keys(__dict);
1266+
out = get_attribute(list, "__call__")(create_array(), Object());
1267+
set_attribute(out, "js_object", __keys);
1268+
return out;
1269+
}
1270+
window["__dict_keys"] = __dict_keys
1271+
1272+
__dict_keys.pythonscript_function = true;
1273+
window["__dict_attrs"]["keys"] = __dict_keys;
1274+
var __dict_values = function(args, kwargs) {
1275+
var __dict, __keys, i, out;
1276+
var signature, arguments;
1277+
signature = {"kwargs": Object(), "args": create_array("self")};
1278+
arguments = get_arguments(signature, args, kwargs);
1279+
var self = arguments['self'];
1280+
__dict = self["__dict__"]["js_object"];
1281+
__keys = Object.keys(__dict);
1282+
out = get_attribute(list, "__call__")(create_array(), Object());
1283+
i = 0;
1284+
while(i < get_attribute(__keys, "length")) {
1285+
var __args_9, __kwargs_9;
1286+
__args_9 = create_array(__dict[ __keys[i] ]);
1287+
__kwargs_9 = Object();
1288+
get_attribute(get_attribute(out, "append"), "__call__")(__args_9, __kwargs_9);
1289+
i += 1
1290+
}
1291+
return out;
1292+
}
1293+
window["__dict_values"] = __dict_values
1294+
1295+
__dict_values.pythonscript_function = true;
1296+
window["__dict_attrs"]["values"] = __dict_values;
12161297
dict = create_class("dict", window["__dict_parents"], window["__dict_attrs"]);
12171298
var str, __str_attrs, __str_parents;
12181299
window["__str_attrs"] = Object();
@@ -1234,10 +1315,10 @@ var signature, arguments;
12341315
signature = {"kwargs": Object(), "args": create_array("self")};
12351316
arguments = get_arguments(signature, args, kwargs);
12361317
var self = arguments['self'];
1237-
var __args_8, __kwargs_8;
1238-
__args_8 = create_array(self["__dict__"]["jsstring"], 0);
1239-
__kwargs_8 = Object();
1240-
return get_attribute(Iterator, "__call__")(__args_8, __kwargs_8);
1318+
var __args_10, __kwargs_10;
1319+
__args_10 = create_array(self["__dict__"]["jsstring"], 0);
1320+
__kwargs_10 = Object();
1321+
return get_attribute(Iterator, "__call__")(__args_10, __kwargs_10);
12411322
}
12421323
window["__str___iter__"] = __str___iter__
12431324

pythonscript/python_to_pythonjs.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -240,10 +240,17 @@ def visit_Assert(self, node):
240240

241241
def visit_Dict(self, node):
242242
node.returns_type = 'dict'
243-
keys = [x.s for x in node.keys]
244-
values = map(self.visit, node.values)
245-
a = [ '%s=%s'%x for x in zip(keys, values) ]
246-
b = 'JSObject(%s)' %', '.join(a)
243+
#keys = [x.s for x in node.keys]
244+
#values = map(self.visit, node.values)
245+
#a = [ '%s=%s'%x for x in zip(keys, values) ]
246+
#b = 'JSObject(%s)' %', '.join(a)
247+
#return 'get_attribute(dict, "__call__")([], JSObject(js_object=%s))' %b
248+
a = []
249+
for i in range( len(node.keys) ):
250+
k = self.visit( node.keys[ i ] )
251+
v = self.visit( node.values[i] )
252+
a.append( 'JSObject(key=%s, value=%s)'%(k,v) )
253+
b = '[%s]' %', '.join(a)
247254
return 'get_attribute(dict, "__call__")([], JSObject(js_object=%s))' %b
248255

249256
def visit_Tuple(self, node):

runtime/builtins.py

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -175,37 +175,59 @@ class dict:
175175
# http://stackoverflow.com/questions/10858632/are-functions-valid-keys-for-javascript-object-properties
176176
UID = 0
177177
def __init__(self, js_object=None):
178-
#self.js_object = JS('Object.create(null)')
179178
if js_object:
180-
self.js_object = js_object
179+
if JS("js_object instanceof Array"):
180+
self.js_object = JS('Object.create(null)')
181+
i = 0
182+
while i < js_object.length:
183+
JS('var key = js_object[i]["key"]')
184+
JS('var value = js_object[i]["value"]')
185+
self.set(key, value)
186+
i += 1
187+
else:
188+
self.js_object = js_object
181189
else:
182190
self.js_object = JSObject()
183191

184-
def get(self, key, d):
185-
var(__dict)
192+
def get(self, key, _default=None):
186193
__dict = self.js_object
187-
if JS('__dict[key]'):
188-
return JS('__dict[key]')
189-
return d
194+
if JS("typeof(key) === 'object'"):
195+
JS('var uid = "@"+key.uid') ## gotcha - what if "@undefined" was in __dict ?
196+
if JS('uid in __dict'):
197+
return JS('__dict[uid]')
198+
elif JS("typeof(key) === 'function'"):
199+
JS('var uid = "@"+key.uid')
200+
if JS('uid in __dict'):
201+
return JS('__dict[uid]')
202+
else:
203+
if JS('key in __dict'):
204+
return JS('__dict[key]')
205+
206+
return _default
190207

191208
def set(self, key, value):
192-
var(__dict)
193209
__dict = self.js_object
194-
JS('__dict[key] = value')
210+
if JS("typeof(key) === 'object'"):
211+
if JS("key.uid === undefined"):
212+
uid = self.UID
213+
JS("key.uid = uid")
214+
self.UID += 1
215+
JS('var uid = key.uid')
216+
JS('__dict["@"+uid] = value')
217+
elif JS("typeof(key) === 'function'"):
218+
if JS("key.uid === undefined"):
219+
uid = self.UID
220+
JS("key.uid = uid")
221+
self.UID += 1
222+
JS('var uid = key.uid')
223+
JS('__dict["@"+uid] = value')
224+
else:
225+
JS('__dict[key] = value')
195226

196227
def __len__(self):
197-
var(__dict)
198228
__dict = self.js_object
199229
return JS('Object.keys(__dict).length')
200230

201-
def keys(self):
202-
var(__dict, out)
203-
__dict = self.js_object
204-
__keys = JS('Object.keys(__dict)')
205-
out = list()
206-
out.js_object = __keys
207-
return out
208-
209231
def __getitem__(self, key):
210232
__dict = self.js_object
211233
if JS("typeof(key) === 'object'"):
@@ -236,6 +258,23 @@ def __setitem__(self, key, value):
236258
else:
237259
JS('__dict[key] = value')
238260

261+
def keys(self):
262+
__dict = self.js_object
263+
__keys = JS('Object.keys(__dict)')
264+
out = list()
265+
out.js_object = __keys
266+
return out
267+
268+
def values(self):
269+
__dict = self.js_object
270+
__keys = JS('Object.keys(__dict)')
271+
out = list()
272+
i = 0
273+
while i < __keys.length:
274+
out.append( JS('__dict[ __keys[i] ]') )
275+
i += 1
276+
return out
277+
239278

240279
class str:
241280

tests/test_dict.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
e2[ e1 ] = "in python you can't use a dict as a key!" ## in PythonScript we allow this
7272

7373
print 'int-key:0', e2[0]
74-
print 'int-key:1', e2[0]
74+
print 'int-key:1', e2[1]
7575
print 'dict-key:e1', e2[ e1 ]
7676

7777
e2[ 'mykey' ] = 'simple string key'

tests/test_dict_advanced.html

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<html>
2+
<head>
3+
<script src="pythonscript.js"></script>
4+
5+
<script type="text/python" closure="false">
6+
7+
class Key1:
8+
def foo(self):
9+
print('FOO')
10+
11+
class Key2:
12+
def bar(self):
13+
print('BAR')
14+
15+
16+
def test():
17+
global d, k1, k2
18+
19+
k1 = Key1()
20+
k2 = Key2()
21+
22+
d = {
23+
k1:'k1 instance',
24+
k2:'k2 instance',
25+
Key1: 'K1 class',
26+
Key2: 'K2 class',
27+
Key1(): 'lost instance!'
28+
}
29+
print d[k1]
30+
print d[k2]
31+
print d[Key1]
32+
print d[Key2]
33+
print d['@4'] ## this is cheating!
34+
35+
print d.get('get default', 'My Default')
36+
print 'this should be undefined:', d.get('get undefined')
37+
38+
d.set(k1, 'changed k1')
39+
print d[k1]
40+
print d.get( k1 )
41+
42+
print d.keys()
43+
print d.values()
44+
45+
</script>
46+
</head>
47+
48+
<body>
49+
<button onclick="test()">click me</button>
50+
</body>
51+
</html>

0 commit comments

Comments
 (0)