Skip to content
Permalink
Newer
Older
100644 816 lines (700 sloc) 22.6 KB
Sep 5, 2014
1
;(function($B){
2
3
var bltns = $B.InjectBuiltins()
4
eval(bltns)
str
Feb 10, 2018
7
str_hash = _b_.str.__hash__,
Sep 5, 2014
9
10
// dictionary
11
function $DictClass($keys,$values){
12
this.iter = null
Feb 11, 2018
13
this.__class__ = dict
14
dict.clear(this)
Feb 9, 2015
15
16
var setitem = dict.__setitem__,
17
i = $keys.length
18
while(i--){setitem($keys[i], $values[i])}
Feb 11, 2018
21
var dict = {
Feb 11, 2018
22
__class__: _b_.type,
Feb 11, 2018
23
__module__: "builtins",
Feb 11, 2018
24
__mro__: [object],
Mar 7, 2018
25
__name__ : "dict",
Feb 11, 2018
26
$is_class: true,
27
$native: true
Sep 5, 2014
28
}
29
30
var $key_iterator = function(d) {
31
this.d = d
32
this.current = 0
33
this.iter = new $item_generator(d)
34
}
35
$key_iterator.prototype.length = function(){return this.iter.items.length}
36
$key_iterator.prototype.next = function(){return this.iter.next()[0]}
37
38
var $value_iterator = function(d) {
39
this.d = d
40
this.current = 0
41
this.iter = new $item_generator(d)
42
}
43
$value_iterator.prototype.length = function(){return this.iter.items.length}
44
$value_iterator.prototype.next = function(){return this.iter.next()[1]}
45
46
var $item_generator = function(d) {
48
this.i = 0
50
if(d.$jsobj){
51
this.items = []
Mar 7, 2018
53
if(attr.charAt(0) != "$"){
54
var val = d.$jsobj[attr]
55
if(val === undefined){val = _b_.NotImplemented}
56
else if(val === null){val = $N}
57
this.items.push([attr, val])
63
var items = []
64
for(var k in d.$numeric_dict){
65
items.push([parseFloat(k), d.$numeric_dict[k]])
68
for(var k in d.$string_dict){items.push([k, d.$string_dict[k]])}
70
for(var k in d.$object_dict){items.push(d.$object_dict[k])}
72
this.items = items
Feb 9, 2015
74
75
$item_generator.prototype.next = function() {
Mar 23, 2018
76
if(this.i < this.items.length){
77
return this.items[this.i++]
79
throw _b_.StopIteration.$factory("StopIteration")
80
}
81
$item_generator.prototype.as_list = function() {
82
return this.items
83
}
84
85
var $item_iterator = function(d) {
86
this.d = d
87
this.current = 0
88
this.iter = new $item_generator(d)
89
}
90
$item_iterator.prototype.length = function(){return this.iter.items.length}
91
$item_iterator.prototype.next = function(){
92
return _b_.tuple.$factory(this.iter.next())
93
}
95
var $copy_dict = function(left, right){
96
var _l = new $item_generator(right).as_list(),
97
si = dict.__setitem__,
98
i = _l.length
99
while(i--){si(left, _l[i][0], _l[i][1])}
102
function toSet(items){
103
// Build a set from the iteration on items
104
var res = []
105
while(true){
106
try{res.push(items.next())}
107
catch(err){break}
108
}
Feb 11, 2018
109
return _b_.set.$factory(res)
110
}
111
112
var $iterator_wrapper = function(items, klass){
114
__class__: klass,
115
__eq__: function(other){
116
// compare set of items to other
117
return $B.rich_comp("__eq__", toSet(items), other)
119
__iter__: function(){items.iter.i = 0; return res},
120
__len__: function(){return items.length()},
121
__next__: function(){
124
__repr__:function(){
125
var s = []
126
for(var i = 0, len = items.length(); i < len; i++){
127
s.push(_b_.repr(items.next()))
128
}
Mar 7, 2018
129
return klass.__name__ + "(["+ s.join(",") + "])"
131
}
132
res.__str__ = res.toString = res.__repr__
133
return res
134
}
135
Feb 11, 2018
136
dict.__bool__ = function () {
Mar 7, 2018
137
var $ = $B.args("__bool__", 1, {self: null}, ["self"],
138
arguments, {}, null, null)
Feb 11, 2018
139
return dict.__len__($.self) > 0
Feb 11, 2018
142
dict.__contains__ = function(){
Nov 21, 2015
143
Mar 7, 2018
144
var $ = $B.args("__contains__", 2, {self: null, item: null},
145
["self", "item"], arguments, {}, null, null),
146
self = $.self,
147
item = $.item
Nov 21, 2015
148
149
if(self.$jsobj){return self.$jsobj[item] !== undefined}
Nov 21, 2015
150
151
switch(typeof item) {
Mar 7, 2018
152
case "string":
153
return self.$string_dict[item] !== undefined
154
case "number":
155
return self.$numeric_dict[item] !== undefined
157
158
var _key = hash(item)
Mar 23, 2018
159
if(self.$str_hash[_key] !== undefined &&
160
$B.rich_comp("__eq__", item, self.$str_hash[_key])){return true}
Mar 23, 2018
161
if(self.$numeric_dict[_key] !== undefined &&
162
$B.rich_comp("__eq__", item, _key)){return true}
Mar 23, 2018
163
if(self.$object_dict[_key] !== undefined){
Nov 21, 2015
164
// If the key is an object, its hash must be in the dict keys but the
165
// key itself must compare equal to the key associated with the hash
166
// For instance :
167
//
168
// class X:
169
// def __hash__(self): return hash('u')
170
//
Nov 21, 2015
171
// a = {'u': 'a', X(): 'b'}
172
// assert set(a.values()) == {'a', 'b'}
Nov 21, 2015
173
// assert not X() in a
174
return $B.rich_comp("__eq__", item, self.$object_dict[_key][0])
175
}
176
return false
Sep 5, 2014
177
}
178
Feb 11, 2018
179
dict.__delitem__ = function(){
Nov 21, 2015
180
Mar 7, 2018
181
var $ = $B.args("__eq__", 2, {self: null, arg: null},
182
["self", "arg"], arguments, {}, null, null),
183
self = $.self,
184
arg = $.arg
Nov 21, 2015
185
186
if(self.$jsobj){
187
if(self.$jsobj[arg] === undefined){throw KeyError.$factory(arg)}
188
delete self.$jsobj[arg]
Mar 23, 2018
191
switch(typeof arg){
Mar 7, 2018
192
case "string":
193
if(self.$string_dict[arg] === undefined){
194
throw KeyError.$factory(_b_.str.$factory(arg))
195
}
196
delete self.$string_dict[arg]
197
delete self.$str_hash[str_hash(arg)]
198
return $N
Mar 7, 2018
199
case "number":
200
if(self.$numeric_dict[arg] === undefined){
201
throw KeyError.$factory(_b_.str.$factory(arg))
202
}
203
delete self.$numeric_dict[arg]
204
return $N
206
// go with defaults
Mar 7, 2018
208
var _key = hash(arg)
Mar 23, 2018
210
if(self.$object_dict[_key] !== undefined){
Nov 21, 2015
211
delete self.$object_dict[_key]
214
if(self.$jsobj){delete self.$jsobj[arg]}
Sep 5, 2014
216
}
217
Feb 11, 2018
218
dict.__eq__ = function(){
Mar 7, 2018
219
var $ = $B.args("__eq__", 2, {self: null, other: null},
220
["self", "other"], arguments, {}, null, null),
221
self = $.self,
222
other = $.other
Nov 21, 2015
223
Mar 7, 2018
224
if(! isinstance(other, dict)){return false}
226
if(self.$jsobj){self = jsobj2dict(self.$jsobj)}
227
if(other.$jsobj){other = jsobj2dict(other.$jsobj)}
229
if(dict.__len__(self) != dict.__len__(other)){return false}
231
if((self.$numeric_dict.length != other.$numeric_dict.length) ||
232
(self.$string_dict.length != other.$string_dict.length) ||
233
(self.$object_dict.length != other.$object_dict.length)){
234
return false
Nov 21, 2015
236
for(var k in self.$numeric_dict){
237
if(!$B.rich_comp("__eq__", other.$numeric_dict[k],
238
self.$numeric_dict[k])){
Nov 21, 2015
239
return false
240
}
241
}
242
for(var k in self.$string_dict){
243
if(!$B.rich_comp("__eq__", other.$string_dict[k],
244
self.$string_dict[k])){
Nov 21, 2015
245
return false
246
}
247
}
248
for(var k in self.$object_dict){
249
if(!$B.rich_comp("__eq__", other.$object_dict[k][1],
250
self.$object_dict[k][1])){
Nov 21, 2015
251
return false
252
}
253
}
Nov 21, 2015
256
Sep 5, 2014
257
}
258
Feb 11, 2018
259
dict.__getitem__ = function(){
Mar 7, 2018
260
var $ = $B.args("__getitem__", 2, {self: null, arg: null},
261
["self", "arg"], arguments, {}, null, null),
262
self = $.self,
263
arg = $.arg
264
265
if(self.$jsobj){
266
if(!self.$jsobj.hasOwnProperty(arg)){
267
throw _b_.KeyError.$factory(str.$factory(arg))
268
}else if(self.$jsobj[arg] === undefined){
269
return _b_.NotImplemented
270
}else if(self.$jsobj[arg] === null){return $N}
271
return self.$jsobj[arg]
272
}
273
274
275
switch(typeof arg){
Mar 7, 2018
276
case "string":
277
if(self.$string_dict[arg] !== undefined){
278
return self.$string_dict[arg]
279
}
280
break
Mar 7, 2018
281
case "number":
282
if(self.$numeric_dict[arg] !== undefined){
283
return self.$numeric_dict[arg]
284
}
287
// since the key is more complex use 'default' method of getting item
288
289
var _key = _b_.hash(arg),
Mar 7, 2018
290
_eq = function(other){return $B.rich_comp("__eq__", arg, other)}
292
var sk = self.$str_hash[_key]
Mar 23, 2018
293
if(sk !== undefined && _eq(sk)){
294
return self.$string_dict[sk]
295
}
Mar 23, 2018
296
if(self.$numeric_dict[_key] !== undefined && _eq(_key)){
297
return self.$numeric_dict[_key]
301
var obj_ref = self.$object_dict[_key]
302
if(obj_ref !== undefined){
303
// An object with the same hash is already stored
304
// Lookup should fail if equality raises an exception
305
_eq(self.$object_dict[_key][0])
Nov 21, 2015
306
return self.$object_dict[_key][1]
308
if(self.__class__ !== dict){
Mar 7, 2018
310
var missing_method = getattr(self.__class__, "__missing__")
311
return missing_method(self, arg)
312
}catch(err){}
313
}
str
Feb 10, 2018
314
throw KeyError.$factory(_b_.str.$factory(arg))
Sep 5, 2014
315
}
316
Feb 11, 2018
317
dict.__hash__ = None
Sep 5, 2014
318
Feb 11, 2018
319
dict.__init__ = function(self){
320
var args = []
321
for(var i = 1; i < arguments.length; i++){args.push(arguments[i])}
322
323
switch(args.length){
324
case 0:
325
return
326
case 1:
327
var obj = args[0]
328
if(Array.isArray(obj)){
329
var i = obj.length,
330
si = dict.__setitem__
Mar 21, 2018
331
while(i-- > 0){si(self, obj[i - 1][0], obj[i - 1][1])}
332
return $N
333
}else if(obj.$nat === undefined && isinstance(obj, dict)){
334
$copy_dict(self, obj)
335
return $N
336
}
338
if(obj.__class__ === $B.JSObject){
339
// convert a JSObject into a Python dictionary
341
// Attribute $jsobj is used to update the original JS object
342
// when the dictionary is modified
343
self.$jsobj = obj.js
344
return $N
345
}
346
}
Mar 7, 2018
348
var $ns = $B.args("dict", 0, {}, [], args, {}, "args", "kw"),
349
args = $ns["args"],
350
kw = $ns["kw"]
Mar 23, 2018
352
if(args.length > 0){
353
if(isinstance(args[0], dict)){
Sep 5, 2014
356
}
Sep 5, 2014
358
// format dict([(k1,v1),(k2,v2)...])
360
if(Array.isArray(args[0])){
361
var src = args[0],
362
i = src.length - 1,
363
si = dict.__setitem__
364
while(i-- > 0){si(self, src[i - 1][0], src[i - 1][1])}
366
var iterable = $B.$iter(args[0])
367
while(1){
368
try{
369
var elt = next(iterable),
Mar 7, 2018
370
key = getattr(elt, "__getitem__")(0),
371
value = getattr(elt,"__getitem__")(1)
Feb 11, 2018
372
dict.__setitem__(self, key, value)
374
if(err.__class__ === _b_.StopIteration){
Sep 5, 2014
379
}
380
}
381
}
382
if(dict.__len__(kw) > 0){$copy_dict(self, kw)}
Sep 5, 2014
384
}
385
Mar 7, 2018
386
var $dict_iterator = $B.$iterator_class("dict iterator")
Feb 11, 2018
387
dict.__iter__ = function(self) {
388
return dict.keys(self)
Sep 5, 2014
389
}
390
Feb 11, 2018
391
dict.__len__ = function(self) {
Mar 7, 2018
392
var _count = 0
394
if(self.$jsobj){
Mar 7, 2018
395
for(var attr in self.$jsobj){if(attr.charAt(0) != "$"){_count++}}
396
return _count
397
}
Mar 23, 2018
399
for(var k in self.$numeric_dict){_count++}
400
for(var k in self.$string_dict){_count++}
401
for(var k in self.$object_dict){_count += self.$object_dict[k].length}
403
return _count
Sep 5, 2014
405
Mar 7, 2018
406
dict.__ne__ = function(self, other){return ! dict.__eq__(self, other)}
Sep 5, 2014
407
Feb 11, 2018
408
dict.__new__ = function(cls){
409
if(cls === undefined){
Mar 7, 2018
410
throw _b_.TypeError.$factory("int.__new__(): not enough arguments")
414
$numeric_dict : {},
415
$object_dict : {},
416
$string_dict : {},
417
$str_hash: {}
418
}
419
}
420
Feb 11, 2018
421
dict.__next__ = function(self){
422
if(self.$iter == null){
423
self.$iter = new $item_generator(self)
425
try{
427
}catch (err){
428
if(err.__name__ !== "StopIteration"){throw err}
Sep 5, 2014
429
}
430
}
431
Feb 11, 2018
432
dict.__repr__ = function(self){
433
if(self.$jsobj){ // wrapper around Javascript object
Feb 11, 2018
434
return dict.__repr__(jsobj2dict(self.$jsobj))
436
var res = [],
437
items = new $item_generator(self).as_list()
438
items.forEach(function(item){
439
if((!self.$jsobj && item[1] === self) ||
440
(self.$jsobj && item[1] === self.$jsobj)){
Mar 7, 2018
441
res.push(repr(item[0]) + ": {...}")
Mar 7, 2018
444
res.push(repr(item[0]) + ": " + repr(item[1]))
Mar 7, 2018
446
res.push(repr(item[0]) + ": <unprintable object>")
Mar 7, 2018
450
return "{" + res.join(", ") + "}"
Sep 5, 2014
451
}
452
453
dict.__setitem__ = function(self, key, value){
Mar 7, 2018
455
var $ = $B.args("__setitem__", 3, {self: null, key: null, value: null},
456
["self", "key", "value"], arguments, {}, null, null)
457
return dict.$setitem($.self, $.key, $.value)
458
}
Nov 21, 2015
459
460
dict.$setitem = function(self, key, value){
462
if(self.$jsobj.__class__ === _b_.type){
463
self.$jsobj[key] = $B.pyobj2jsobj(value)
464
if(key == "__init__" || key == "__new__"){
465
// If class attribute __init__ or __new__ are reset,
466
// the factory function has to change
467
self.$jsobj.$factory = $B.$instance_creator(self.$jsobj)
468
}
469
}else{
470
self.$jsobj[key] = $B.pyobj2jsobj(value)
475
switch(typeof key){
Mar 7, 2018
476
case "string":
477
self.$string_dict[key] = value
478
self.$str_hash[str_hash(key)] = key
479
return $N
Mar 7, 2018
480
case "number":
481
self.$numeric_dict[key] = value
482
return $N
485
// if we got here the key is more complex, use default method
487
var _key = hash(key),
488
_eq = function(other){return $B.rich_comp("__eq__", key, other)}
490
if(self.$numeric_dict[_key] !== undefined && _eq(_key)){
491
self.$numeric_dict[_key] = value
493
}
494
var sk = self.$str_hash[_key]
495
if(sk !== undefined && _eq(sk)){
496
self.$string_dict[sk] = value
498
}
499
500
var obj_ref = self.$object_dict[_key]
501
if(obj_ref !== undefined){
502
// An object with the same hash is already stored
503
// Lookup should fail if equality raises an exception
504
_eq(self.$object_dict[_key][0])
505
}
506
self.$object_dict[_key] = [key, value]
Sep 5, 2014
508
}
509
Feb 11, 2018
510
dict.__str__ = dict.__repr__
Sep 5, 2014
511
512
// add "reflected" methods
Feb 11, 2018
513
$B.make_rmethods(dict)
Sep 5, 2014
514
Feb 11, 2018
515
dict.clear = function(){
Sep 5, 2014
516
// Remove all items from the dictionary.
Mar 7, 2018
517
var $ = $B.args("clear", 1, {self: null}, ["self"], arguments, {},
518
null, null),
519
self = $.self
521
self.$numeric_dict = {}
522
self.$string_dict = {}
523
self.$str_hash = {}
524
self.$object_dict = {}
526
if(self.$jsobj){
527
for(var attr in self.$jsobj){
Mar 7, 2018
528
if(attr.charAt(0) !== "$" && attr !== "__class__"){
529
delete self.$jsobj[attr]
530
}
531
}
532
}
Sep 5, 2014
534
}
535
Feb 11, 2018
536
dict.copy = function(self){
Sep 5, 2014
537
// Return a shallow copy of the dictionary
Mar 7, 2018
538
var $ = $B.args("copy", 1, {self: null},["self"], arguments,{},
539
null, null),
540
self = $.self,
Feb 11, 2018
541
res = _b_.dict.$factory()
Sep 5, 2014
543
return res
544
}
545
Feb 11, 2018
546
dict.fromkeys = function(){
Nov 21, 2015
547
Mar 7, 2018
548
var $ = $B.args("fromkeys", 3, {cls: null, keys: null, value: null},
549
["cls", "keys", "value"], arguments, {value: _b_.None}, null, null),
550
keys = $.keys,
551
value = $.value
Sep 5, 2014
553
// class method
554
var klass = $.cls,
Sep 5, 2014
558
while(1){
559
try{
560
var key = _b_.next(keys_iter)
561
if(klass === dict){dict.__setitem__(res, key, value)}
562
else{_b_.getattr(res, "__setitem__")(key, value)}
Sep 5, 2014
563
}catch(err){
564
if($B.is_exc(err, [_b_.StopIteration])){
Sep 5, 2014
565
return res
566
}
567
throw err
568
}
569
}
570
}
571
Feb 11, 2018
572
dict.get = function(){
Mar 7, 2018
573
var $ = $B.args("get", 3, {self: null, key: null, _default: null},
574
["self", "key", "_default"], arguments, {_default: $N}, null, null)
Feb 11, 2018
576
try{return dict.__getitem__($.self, $.key)}
577
catch(err){
578
if(_b_.isinstance(err, _b_.KeyError)){return $._default}
579
else{throw err}
580
}
581
}
582
Mar 7, 2018
583
var $dict_itemsDict = $B.$iterator_class("dict_items")
584
Feb 11, 2018
585
dict.items = function(self){
Mar 23, 2018
586
if(arguments.length > 1){
587
var _len = arguments.length - 1,
588
_msg = "items() takes no arguments (" + _len + " given)"
589
throw _b_.TypeError.$factory(_msg)
590
}
591
return $iterator_wrapper(new $item_iterator(self), $dict_itemsDict)
592
}
593
Mar 7, 2018
594
var $dict_keysDict = $B.$iterator_class("dict_keys")
Nov 21, 2015
595
Feb 11, 2018
596
dict.keys = function(self){
Mar 23, 2018
597
if(arguments.length > 1){
598
var _len = arguments.length - 1,
599
_msg = "keys() takes no arguments (" + _len + " given)"
600
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
601
}
602
return $iterator_wrapper(new $key_iterator(self), $dict_keysDict)
Nov 21, 2015
603
}
604
Feb 11, 2018
605
dict.pop = function(){
Nov 21, 2015
606
Mar 7, 2018
607
var $ = $B.args("pop", 3, {self: null, key: null, _default: null},
608
["self", "key", "_default"], arguments, {_default: $N}, null, null),
609
self = $.self,
610
key = $.key,
611
_default = $._default
Nov 21, 2015
612
Sep 5, 2014
613
try{
614
var res = dict.__getitem__(self, key)
615
dict.__delitem__(self, key)
Sep 5, 2014
616
return res
617
}catch(err){
618
if(err.__class__ === _b_.KeyError){
619
if(_default !== undefined){return _default}
Sep 5, 2014
620
throw err
621
}
622
throw err
623
}
624
}
625
Feb 11, 2018
626
dict.popitem = function(self){
627
try{
628
var itm = new $item_iterator(self).next()
629
dict.__delitem__(self, itm[0])
Feb 11, 2018
630
return _b_.tuple.$factory(itm)
632
if (err.__class__ == _b_.StopIteration) {
633
throw KeyError.$factory("'popitem(): dictionary is empty'")
Sep 5, 2014
636
}
637
Feb 11, 2018
638
dict.setdefault = function(){
Nov 21, 2015
639
Mar 7, 2018
640
var $ = $B.args("setdefault", 3, {self: null, key: null, _default: null},
641
["self", "key", "_default"], arguments, {_default: $N}, null, null),
642
self = $.self,
643
key = $.key,
644
_default = $._default
Nov 21, 2015
645
646
try{return dict.__getitem__(self, key)}
Sep 5, 2014
647
catch(err){
648
if(_default === undefined){_default = $N}
649
dict.__setitem__(self, key, _default)
Sep 5, 2014
650
return _default
651
}
652
}
653
Feb 11, 2018
654
dict.update = function(self){
Nov 21, 2015
655
Mar 7, 2018
656
var $ = $B.args("update", 1, {"self": null}, ["self"], arguments,
657
{}, "args", "kw"),
658
self = $.self,
659
args = $.args,
660
kw = $.kw
661
662
if(args.length > 0){
663
var o = args[0]
664
if(isinstance(o, dict)){
665
if(o.$jsobj){o = jsobj2dict(o)}
666
$copy_dict(self, o)
Mar 7, 2018
667
}else if(hasattr(o, "__getitem__") && hasattr(o, "keys")){
668
var _keys = _b_.list.$factory(getattr(o, "keys")()),
669
si = dict.__setitem__,
670
i = _keys.length
671
while(i--){
Mar 7, 2018
672
var _value = getattr(o, "__getitem__")(_keys[i])
673
si(self, _keys[i], _value)
674
}
675
}
Sep 5, 2014
676
}
Sep 5, 2014
679
}
680
Mar 7, 2018
681
var $dict_valuesDict = $B.$iterator_class("dict_values")
Nov 21, 2015
682
Feb 11, 2018
683
dict.values = function(self){
Mar 23, 2018
684
if(arguments.length > 1){
685
var _len = arguments.length - 1,
686
_msg = "values() takes no arguments (" + _len + " given)"
687
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
688
}
689
return $iterator_wrapper(new $value_iterator(self), $dict_valuesDict)
690
}
691
Feb 11, 2018
692
dict.$factory = function(args, second){
694
var res = {__class__: dict,
695
$numeric_dict : {},
696
$object_dict : {},
697
$string_dict : {},
701
if(args === undefined){return res}
703
if(second === undefined){
704
if(Array.isArray(args)){
705
// Form "dict([[key1, value1], [key2,value2], ...])"
Mar 7, 2018
706
var i = -1,
707
stop = args.length - 1,
708
si = dict.__setitem__
709
while(i++ < stop){
710
var item = args[i]
Mar 7, 2018
712
case 'string':
713
res.$string_dict[item[0]] = item[1]
714
res.$str_hash[str_hash(item[0])] = item[0]
715
break
716
case 'number':
717
res.$numeric_dict[item[0]] = item[1]
718
break
719
default:
720
si(res, item[0], item[1])
721
break
Mar 7, 2018
725
}else if(args.$nat == "kw"){
Mar 7, 2018
727
var kw = args["kw"]
729
switch(typeof attr){
Mar 7, 2018
730
case "string":
731
res.$string_dict[attr] = kw[attr]
732
res.$str_hash[str_hash(attr)] = attr
733
break
Mar 7, 2018
734
case "number":
735
res.$numeric_dict[attr] = kw[attr]
736
break
737
default:
738
si(res, attr, kw[attr])
739
break
743
}else if(args.$jsobj){
744
res.$jsobj = {}
745
for(var attr in args.$jsobj){res.$jsobj[attr] = args.$jsobj[attr]}
746
return res
Sep 5, 2014
750
// apply __init__ with arguments of dict()
751
dict.__init__(res, ...arguments)
Sep 5, 2014
752
return res
753
}
Sep 5, 2014
755
_b_.dict = dict
Feb 11, 2018
757
$B.set_func_names(dict, "builtins")
759
// This must be done after set_func_names, otherwise dict.fromkeys doesn't
760
// have the attribute $infos
761
dict.fromkeys = _b_.classmethod.$factory(dict.fromkeys)
762
763
// following are used for faster access elsewhere
764
$B.$dict_iterator = function(d){return new $item_generator(d)}
Feb 11, 2018
765
$B.$dict_length = dict.__len__
766
$B.$dict_getitem = dict.__getitem__
767
$B.$dict_get = dict.get
768
$B.$dict_set = dict.__setitem__
769
$B.$dict_contains = dict.__contains__
770
$B.$dict_items = function(d) { return new $item_generator(d).as_list() }
771
$B.$copy_dict = $copy_dict // copy from right to left
Feb 11, 2018
772
$B.$dict_get_copy = dict.copy // return a shallow copy
775
// Class for attribute __dict__ of classes
Feb 12, 2018
776
var mappingproxy = $B.make_class("mappingproxy",
777
function(obj){
778
var res = obj_dict(obj)
779
res.__class__ = mappingproxy
780
return res
781
}
782
)
Feb 12, 2018
784
mappingproxy.__setitem__ = function(){
Mar 7, 2018
785
throw _b_.TypeError.$factory("'mappingproxy' object does not support " +
786
"item assignment")
Feb 12, 2018
789
$B.set_func_names(mappingproxy, "builtins")
Feb 11, 2018
792
var d = dict.$factory()
Mar 7, 2018
794
if(attr.charAt(0) != "$" && attr !== "__class__"){
795
if(x[attr] === undefined){
796
continue
797
}else if(x[attr].$jsobj === x){
798
d.$string_dict[attr] = d
799
}else{
800
d.$string_dict[attr] = x[attr]
801
}
806
$B.obj_dict = function(obj){
807
var klass = $B.get_class(obj)
808
if(klass !== undefined && klass.$native){
809
throw _b_.AttributeError.$factory(klass.__name__ +
810
" has no attribute '__dict__'")}
Feb 11, 2018
811
var res = dict.$factory()
812
res.$jsobj = obj
813
return res
814
}
815
Sep 5, 2014
816
})(__BRYTHON__)