Skip to content
Permalink
Newer
Older
100644 926 lines (825 sloc) 26.3 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
Feb 11, 2018
10
var dict = {
Feb 11, 2018
11
__class__: _b_.type,
12
__mro__: [object],
13
$infos: {
14
__module__: "builtins",
15
__name__: "dict"
16
},
Feb 11, 2018
17
$is_class: true,
18
$native: true
Sep 5, 2014
19
}
20
21
var $key_iterator = function(d) {
22
this.d = d
23
this.current = 0
24
this.iter = new $item_generator(d)
25
}
26
$key_iterator.prototype.length = function(){return this.iter.items.length}
27
$key_iterator.prototype.next = function(){return this.iter.next()[0]}
28
29
var $value_iterator = function(d) {
30
this.d = d
31
this.current = 0
32
this.iter = new $item_generator(d)
33
}
34
$value_iterator.prototype.length = function(){return this.iter.items.length}
35
$value_iterator.prototype.next = function(){return this.iter.next()[1]}
36
37
var $item_generator = function(d) {
39
this.i = 0
41
if(d.$jsobj){
Mar 7, 2018
44
if(attr.charAt(0) != "$"){
45
var val = d.$jsobj[attr]
46
if(val === undefined){val = _b_.NotImplemented}
47
else if(val === null){val = $N}
48
this.items.push([attr, val])
54
var items = []
55
for(var k in d.$numeric_dict){
56
items.push([parseFloat(k), d.$numeric_dict[k]])
58
59
for(var k in d.$string_dict){items.push([k, d.$string_dict[k]])}
60
61
for(var k in d.$object_dict){
62
d.$object_dict[k].forEach(function(item){
63
items.push(item)
64
})
65
}
66
67
this.items = items
Feb 9, 2015
69
70
$item_generator.prototype.next = function() {
Mar 23, 2018
71
if(this.i < this.items.length){
72
return this.items[this.i++]
74
throw _b_.StopIteration.$factory("StopIteration")
75
}
76
$item_generator.prototype.as_list = function() {
77
return this.items
78
}
79
80
var $item_iterator = function(d) {
81
this.d = d
82
this.current = 0
83
this.iter = new $item_generator(d)
84
}
85
$item_iterator.prototype.length = function(){return this.iter.items.length}
86
$item_iterator.prototype.next = function(){
87
return _b_.tuple.$factory(this.iter.next())
88
}
90
var $copy_dict = function(left, right){
91
var _l = new $item_generator(right).as_list(),
93
i = _l.length
94
right.$version = right.$version || 0
95
var right_version = right.$version || 0
96
while(i--){
97
si(left, _l[i][0], _l[i][1])
98
if(right.$version != right_version){
99
throw _b_.RuntimeError.$factory("dict mutated during update")
100
}
101
}
104
var $iterator_wrapper = function(items, klass){
106
__class__: klass,
107
__eq__: function(other){
108
// compare set of items to other
109
return $B.rich_comp("__eq__", _b_.set.$factory(res),
110
_b_.set.$factory(other))
112
__iter__: function(){items.iter.i = 0; return res},
113
__len__: function(){return items.length()},
114
__next__: function(){
117
__repr__:function(){
118
var s = []
120
for(var i = 0, len = items.length(); i < len; i++){
121
s.push(_b_.repr(items.next()))
122
}
123
return klass.$infos.__name__ + "(["+ s.join(",") + "])"
127
klass.__reduce_ex__ = klass.__reduce__ = function(self){
128
return _b_.tuple.$factory([_b_.iter,
129
_b_.tuple.$factory([_b_.list.$factory(self)])])
130
}
134
function rank(self, hash, key){
135
// Search if object key, with hash = hash(key), is in
136
// self.$object_dict
137
var pairs = self.$object_dict[hash]
138
if(pairs !== undefined){
139
for(var i = 0, len = pairs.length; i < len; i++){
140
if($B.rich_comp("__eq__", key, pairs[i][0])){
141
return i
142
}
143
}
144
}
145
return -1
146
}
147
Feb 11, 2018
148
dict.__bool__ = function () {
Mar 7, 2018
149
var $ = $B.args("__bool__", 1, {self: null}, ["self"],
150
arguments, {}, null, null)
Feb 11, 2018
151
return dict.__len__($.self) > 0
Feb 11, 2018
154
dict.__contains__ = function(){
Nov 21, 2015
155
156
var $ = $B.args("__contains__", 2, {self: null, key: null},
157
["self", "key"], arguments, {}, null, null),
158
self = $.self,
161
if(self.$jsobj){return self.$jsobj[key] !== undefined}
163
switch(typeof key) {
165
return self.$string_dict[key] !== undefined
167
return self.$numeric_dict[key] !== undefined
168
}
169
170
var hash = _b_.hash(key)
171
if(self.$str_hash[hash] !== undefined &&
172
$B.rich_comp("__eq__", key, self.$str_hash[hash])){return true}
173
if(self.$numeric_dict[hash] !== undefined &&
174
$B.rich_comp("__eq__", key, hash)){return true}
175
return rank(self, hash, key) > -1
Sep 5, 2014
176
}
177
Feb 11, 2018
178
dict.__delitem__ = function(){
Nov 21, 2015
179
180
var $ = $B.args("__eq__", 2, {self: null, arg: null},
181
["self", "arg"], arguments, {}, null, null),
182
self = $.self,
Nov 21, 2015
184
185
if(self.$jsobj){
186
if(self.$jsobj[arg] === undefined){throw KeyError.$factory(arg)}
187
delete self.$jsobj[arg]
190
switch(typeof arg){
191
case "string":
192
if(self.$string_dict[arg] === undefined){
193
throw KeyError.$factory(_b_.str.$factory(arg))
194
}
195
delete self.$string_dict[arg]
196
delete self.$str_hash[str_hash(arg)]
198
return $N
199
case "number":
200
if(self.$numeric_dict[arg] === undefined){
201
throw KeyError.$factory(_b_.str.$factory(arg))
203
delete self.$numeric_dict[arg]
207
// go with defaults
208
209
var hash = _b_.hash(arg),
210
ix
212
if((ix = rank(self, hash, arg)) > -1){
213
self.$object_dict[hash].splice(ix, 1)
214
}else{
215
throw KeyError.$factory(_b_.str.$factory(arg))
Sep 5, 2014
220
}
221
Feb 11, 2018
222
dict.__eq__ = function(){
Mar 7, 2018
223
var $ = $B.args("__eq__", 2, {self: null, other: null},
224
["self", "other"], arguments, {}, null, null),
225
self = $.self,
226
other = $.other
Mar 7, 2018
228
if(! isinstance(other, dict)){return false}
230
if(self.$jsobj){self = jsobj2dict(self.$jsobj)}
231
if(other.$jsobj){other = jsobj2dict(other.$jsobj)}
232
if(dict.__len__(self) != dict.__len__(other)){
233
return false
234
}
236
if(self.$string_dict.length != other.$string_dict.length){
240
for(var k in self.$numeric_dict){
241
if(other.$numeric_dict.hasOwnProperty(k)){
242
if(!$B.rich_comp("__eq__", other.$numeric_dict[k],
243
self.$numeric_dict[k])){
244
return false
245
}
246
}else if(other.$object_dict.hasOwnProperty(k)){
247
var pairs = other.$object_dict[k],
248
flag = false
249
for(var i = 0, len = pairs.length; i < len; i++){
250
if($B.rich_comp("__eq__", k, pairs[i][0]) &&
251
$B.rich_comp("__eq__", self.$numeric_dict[k],
252
pairs[i][1])){
253
flag = true
254
break
255
}
257
if(! flag){return false}
Nov 21, 2015
260
}
261
}
262
for(var k in self.$string_dict){
263
if(!other.$string_dict.hasOwnProperty(k) ||
264
!$B.rich_comp("__eq__", other.$string_dict[k],
265
self.$string_dict[k])){
266
return false
Nov 21, 2015
267
}
268
}
269
for(var hash in self.$object_dict){
270
var pairs = self.$object_dict[hash]
271
// Get all (key, value) pairs in other that have the same hash
272
var other_pairs = []
273
if(other.$numeric_dict[hash] !== undefined){
274
other_pairs.push([hash, other.$numeric_dict[hash]])
275
}
276
if(other.$object_dict[hash] !== undefined){
277
other_pairs = other_pairs.concat(other.$object_dict[hash])
278
}
279
if(other_pairs.length == 0){
280
return false
281
}
282
for(var i = 0, len_i = pairs.length; i < len_i; i++){
283
var flag = false
284
var key = pairs[i][0],
285
value = pairs[i][1]
286
for(var j = 0, len_j = other_pairs.length; j < len_j; j++){
287
if($B.rich_comp("__eq__", key, other_pairs[j][0]) &&
288
$B.rich_comp("__eq__", value, other_pairs[j][1])){
289
flag = true
290
break
296
}
297
}
298
return true
Sep 5, 2014
299
}
300
Feb 11, 2018
301
dict.__getitem__ = function(){
302
var $ = $B.args("__getitem__", 2, {self: null, arg: null},
303
["self", "arg"], arguments, {}, null, null),
304
self = $.self,
306
if(self.$jsobj){
307
if(!self.$jsobj.hasOwnProperty(arg)){
308
throw _b_.KeyError.$factory(str.$factory(arg))
309
}else if(self.$jsobj[arg] === undefined){
310
return _b_.NotImplemented
311
}else if(self.$jsobj[arg] === null){return $N}
312
return self.$jsobj[arg]
314
315
switch(typeof arg){
316
case "string":
317
if(self.$string_dict[arg] !== undefined){
318
return self.$string_dict[arg]
320
break
321
case "number":
322
if(self.$numeric_dict[arg] !== undefined){
323
return self.$numeric_dict[arg]
325
break
326
}
327
328
// since the key is more complex use 'default' method of getting item
329
330
var hash = _b_.hash(arg),
331
_eq = function(other){return $B.rich_comp("__eq__", arg, other)}
332
333
arg.$hash = hash // cache for setdefault
334
var sk = self.$str_hash[hash]
335
if(sk !== undefined && _eq(sk)){
336
return self.$string_dict[sk]
337
}
338
if(self.$numeric_dict[hash] !== undefined && _eq(hash)){
339
return self.$numeric_dict[hash]
340
}
341
if(isinstance(arg, _b_.str)){
342
// string subclass
343
var res = self.$string_dict[arg.valueOf()]
344
if(res !== undefined){return res}
345
}
346
347
var ix = rank(self, hash, arg)
348
if(ix > -1){
349
return self.$object_dict[hash][ix][1]
352
if(self.__class__ !== dict){
354
var missing_method = getattr(self.__class__, "__missing__",
355
_b_.None)
356
}catch(err){
357
console.log(err)
358
359
}
360
if(missing_method !== _b_.None){
361
return missing_method(self, arg)
Sep 5, 2014
365
}
366
367
dict.__hash__ = _b_.None
Sep 5, 2014
368
369
function init_from_list(self, args){
370
var i = -1,
371
stop = args.length - 1,
372
si = dict.__setitem__
373
while(i++ < stop){
374
var item = args[i]
375
switch(typeof item[0]) {
376
case 'string':
377
self.$string_dict[item[0]] = item[1]
378
self.$str_hash[str_hash(item[0])] = item[0]
379
break
380
case 'number':
381
self.$numeric_dict[item[0]] = item[1]
382
break
383
default:
384
si(self, item[0], item[1])
385
break
386
}
387
}
388
}
389
390
dict.__init__ = function(self, first, second){
392
if(first === undefined){return $N}
393
if(second === undefined){
394
if(first.__class__ === $B.JSObject){
395
self.$jsobj = first.js
396
return $N
397
}else if(first.$jsobj){
398
self.$jsobj = {}
399
for(var attr in first.$jsobj){
400
self.$jsobj[attr] = first.$jsobj[attr]
403
}else if(Array.isArray(first)){
404
init_from_list(self, first)
405
return $N
Sep 5, 2014
406
}
409
$ = $ || $B.args("dict", 1, {self:null}, ["self"],
410
arguments, {}, "first", "second")
411
var args = $.first
412
if(args.length > 1){
413
throw _b_.TypeError.$factory("dict expected at most 1 argument" +
414
", got 2")
415
}else if(args.length == 1){
416
args = args[0]
417
if(args.__class__ === dict){
418
['$string_dict', '$str_hash', '$numeric_dict', '$object_dict'].
419
forEach(function(d){
420
for(key in args[d]){self[d][key] = args[d][key]}
421
})
422
}else if(isinstance(args, dict)){
423
$copy_dict(self, args)
425
var keys = $B.$getattr(args, "keys", null)
426
if(keys !== null){
427
var gi = $B.$getattr(args, "__getitem__", null)
428
if(gi !== null){
429
// has keys and __getitem__ : it's a mapping, iterate on
430
// keys and values
431
gi = $B.$call(gi)
432
var kiter = _b_.iter($B.$call(keys)())
433
while(true){
434
try{
435
var key = _b_.next(kiter),
436
value = gi(key)
437
dict.__setitem__(self, key, value)
438
}catch(err){
439
if(err.__class__ === _b_.StopIteration){
440
break
441
}
442
throw err
443
}
444
}
445
return $N
446
}
447
}
448
if(! Array.isArray(args)){
449
args = _b_.list.$factory(args)
450
}
451
// Form "dict([[key1, value1], [key2,value2], ...])"
452
init_from_list(self, args)
Sep 5, 2014
453
}
455
var kw = $.second.$string_dict
456
for(var attr in kw){
457
switch(typeof attr){
458
case "string":
459
self.$string_dict[attr] = kw[attr]
460
self.$str_hash[str_hash(attr)] = attr
461
break
462
case "number":
463
self.$numeric_dict[attr] = kw[attr]
464
break
465
default:
466
si(self, attr, kw[attr])
467
break
468
}
Sep 5, 2014
471
}
472
Feb 11, 2018
473
dict.__iter__ = function(self) {
Sep 5, 2014
475
}
476
Feb 11, 2018
477
dict.__len__ = function(self) {
480
if(self.$jsobj){
Mar 7, 2018
481
for(var attr in self.$jsobj){if(attr.charAt(0) != "$"){_count++}}
482
return _count
483
}
485
for(var k in self.$numeric_dict){_count++}
486
for(var k in self.$string_dict){_count++}
487
for(var hash in self.$object_dict){
488
_count += self.$object_dict[hash].length
489
}
Sep 5, 2014
493
Mar 7, 2018
494
dict.__ne__ = function(self, other){return ! dict.__eq__(self, other)}
Sep 5, 2014
495
Feb 11, 2018
496
dict.__new__ = function(cls){
497
if(cls === undefined){
Mar 7, 2018
498
throw _b_.TypeError.$factory("int.__new__(): not enough arguments")
500
var instance = {
502
$numeric_dict : {},
503
$object_dict : {},
505
$str_hash: {},
506
$version: 0
508
if(cls !== dict){
509
instance.__dict__ = _b_.dict.$factory()
510
}
511
return instance
Feb 11, 2018
514
dict.__next__ = function(self){
515
if(self.$iter == null){
516
self.$iter = new $item_generator(self)
518
try{
520
}catch (err){
521
if(err.__name__ !== "StopIteration"){throw err}
Sep 5, 2014
522
}
523
}
524
Feb 11, 2018
525
dict.__repr__ = function(self){
526
if(self.$jsobj){ // wrapper around Javascript object
Feb 11, 2018
527
return dict.__repr__(jsobj2dict(self.$jsobj))
529
var res = [],
530
items = new $item_generator(self).as_list()
531
items.forEach(function(item){
532
if((!self.$jsobj && item[1] === self) ||
533
(self.$jsobj && item[1] === self.$jsobj)){
Mar 7, 2018
534
res.push(repr(item[0]) + ": {...}")
536
res.push(repr(item[0]) + ": " + repr(item[1]))
Mar 7, 2018
539
return "{" + res.join(", ") + "}"
Sep 5, 2014
540
}
541
542
dict.__setitem__ = function(self, key, value){
Mar 7, 2018
543
var $ = $B.args("__setitem__", 3, {self: null, key: null, value: null},
544
["self", "key", "value"], arguments, {}, null, null)
545
return dict.$setitem($.self, $.key, $.value)
546
}
Nov 21, 2015
547
548
dict.$setitem = function(self, key, value, $hash){
549
// Parameter $hash is only set if this method is called by setdefault.
550
// In this case the hash of key has already been computed and we
551
// know that the key is not present in the dictionary, so it's no
552
// use computing hash(key) again, nor testing equality of keys
554
if(self.$from_js){
555
// dictionary created by method to_dict of JSObject instances
556
value = $B.pyobj2jsobj(value)
557
}
558
if(self.$jsobj.__class__ === _b_.type){
559
self.$jsobj[key] = value
560
if(key == "__init__" || key == "__new__"){
561
// If class attribute __init__ or __new__ are reset,
562
// the factory function has to change
563
self.$jsobj.$factory = $B.$instance_creator(self.$jsobj)
564
}
565
}else{
566
self.$jsobj[key] = value
571
switch(typeof key){
572
case "string":
573
self.$string_dict[key] = value
574
self.$str_hash[str_hash(key)] = key
576
return $N
577
case "number":
578
self.$numeric_dict[key] = value
580
return $N
583
// if we got here the key is more complex, use default method
584
585
var hash = $hash === undefined ? _b_.hash(key) : $hash,
586
_eq = function(other){return $B.rich_comp("__eq__", key, other)}
587
588
if(self.$numeric_dict[hash] !== undefined && _eq(hash)){
589
self.$numeric_dict[hash] = value
593
var sk = self.$str_hash[hash]
594
if(sk !== undefined && _eq(sk)){
595
self.$string_dict[sk] = value
600
// If $setitem is called from setdefault, don't test equality of key
601
// with any object
602
if($hash){
603
if(self.$object_dict[$hash] !== undefined){
604
self.$object_dict[$hash].push([key, value])
605
}else{
606
self.$object_dict[$hash] = [[key, value]]
607
}
608
self.$version++
609
return $N
610
}
611
var ix = rank(self, hash, key)
612
if(ix > -1){
613
// reset value
614
self.$object_dict[hash][ix][1] = value
615
return $N
616
}else if(self.$object_dict.hasOwnProperty(hash)){
617
self.$object_dict[hash].push([key, value])
618
}else{
619
self.$object_dict[hash] = [[key, value]]
Sep 5, 2014
623
}
624
625
dict.__str__ = function(){return dict.__repr__.apply(null, arguments)}
Sep 5, 2014
626
627
// add "reflected" methods
Feb 11, 2018
628
$B.make_rmethods(dict)
Sep 5, 2014
629
Feb 11, 2018
630
dict.clear = function(){
Sep 5, 2014
631
// Remove all items from the dictionary.
Mar 7, 2018
632
var $ = $B.args("clear", 1, {self: null}, ["self"], arguments, {},
633
null, null),
634
self = $.self
636
self.$numeric_dict = {}
637
self.$string_dict = {}
638
self.$str_hash = {}
639
self.$object_dict = {}
641
if(self.$jsobj){
642
for(var attr in self.$jsobj){
Mar 7, 2018
643
if(attr.charAt(0) !== "$" && attr !== "__class__"){
644
delete self.$jsobj[attr]
645
}
646
}
647
}
Sep 5, 2014
650
}
651
Feb 11, 2018
652
dict.copy = function(self){
Sep 5, 2014
653
// Return a shallow copy of the dictionary
Mar 7, 2018
654
var $ = $B.args("copy", 1, {self: null},["self"], arguments,{},
655
null, null),
656
self = $.self,
Feb 11, 2018
657
res = _b_.dict.$factory()
Sep 5, 2014
659
return res
660
}
661
Feb 11, 2018
662
dict.fromkeys = function(){
Nov 21, 2015
663
Mar 7, 2018
664
var $ = $B.args("fromkeys", 3, {cls: null, keys: null, value: null},
665
["cls", "keys", "value"], arguments, {value: _b_.None}, null, null),
666
keys = $.keys,
667
value = $.value
Sep 5, 2014
669
// class method
670
var klass = $.cls,
Sep 5, 2014
674
while(1){
675
try{
676
var key = _b_.next(keys_iter)
677
if(klass === dict){dict.$setitem(res, key, value)}
678
else{$B.$getattr(res, "__setitem__")(key, value)}
Sep 5, 2014
679
}catch(err){
680
if($B.is_exc(err, [_b_.StopIteration])){
Sep 5, 2014
681
return res
682
}
683
throw err
684
}
685
}
686
}
687
Feb 11, 2018
688
dict.get = function(){
Mar 7, 2018
689
var $ = $B.args("get", 3, {self: null, key: null, _default: null},
690
["self", "key", "_default"], arguments, {_default: $N}, null, null)
Feb 11, 2018
692
try{return dict.__getitem__($.self, $.key)}
693
catch(err){
694
if(_b_.isinstance(err, _b_.KeyError)){return $._default}
695
else{throw err}
696
}
697
}
698
Mar 7, 2018
699
var $dict_itemsDict = $B.$iterator_class("dict_items")
700
Feb 11, 2018
701
dict.items = function(self){
Mar 23, 2018
702
if(arguments.length > 1){
703
var _len = arguments.length - 1,
704
_msg = "items() takes no arguments (" + _len + " given)"
705
throw _b_.TypeError.$factory(_msg)
706
}
707
return $iterator_wrapper(new $item_iterator(self), $dict_itemsDict)
708
}
709
Mar 7, 2018
710
var $dict_keysDict = $B.$iterator_class("dict_keys")
Nov 21, 2015
711
Mar 23, 2018
713
if(arguments.length > 1){
714
var _len = arguments.length - 1,
715
_msg = "keys() takes no arguments (" + _len + " given)"
716
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
717
}
718
return $iterator_wrapper(new $key_iterator(self), $dict_keysDict)
Nov 21, 2015
719
}
720
Feb 11, 2018
721
dict.pop = function(){
Nov 21, 2015
722
723
var missing = {},
724
$ = $B.args("pop", 3, {self: null, key: null, _default: null},
725
["self", "key", "_default"], arguments, {_default: missing}, null, null),
726
self = $.self,
727
key = $.key,
728
_default = $._default
Nov 21, 2015
729
Sep 5, 2014
730
try{
731
var res = dict.__getitem__(self, key)
732
dict.__delitem__(self, key)
Sep 5, 2014
733
return res
734
}catch(err){
735
if(err.__class__ === _b_.KeyError){
736
if(_default !== missing){return _default}
Sep 5, 2014
737
throw err
738
}
739
throw err
740
}
741
}
742
Feb 11, 2018
743
dict.popitem = function(self){
744
try{
745
var itm = new $item_iterator(self).next()
746
dict.__delitem__(self, itm[0])
Feb 11, 2018
747
return _b_.tuple.$factory(itm)
749
if (err.__class__ == _b_.StopIteration) {
750
throw KeyError.$factory("'popitem(): dictionary is empty'")
Sep 5, 2014
753
}
754
Feb 11, 2018
755
dict.setdefault = function(){
Nov 21, 2015
756
Mar 7, 2018
757
var $ = $B.args("setdefault", 3, {self: null, key: null, _default: null},
758
["self", "key", "_default"], arguments, {_default: $N}, null, null),
759
self = $.self,
760
key = $.key,
761
_default = $._default
Nov 21, 2015
762
763
try{return dict.__getitem__(self, key)}
Sep 5, 2014
764
catch(err){
765
if(err.__class__ !== _b_.KeyError){
766
throw err
767
}
768
if(_default === undefined){_default = $N}
769
var hash = key.$hash
770
key.$hash = undefined
771
dict.$setitem(self, key, _default, hash)
Sep 5, 2014
772
return _default
773
}
774
}
775
Feb 11, 2018
776
dict.update = function(self){
Nov 21, 2015
777
Mar 7, 2018
778
var $ = $B.args("update", 1, {"self": null}, ["self"], arguments,
779
{}, "args", "kw"),
780
self = $.self,
781
args = $.args,
782
kw = $.kw
783
if(args.length > 0){
784
var o = args[0]
785
if(isinstance(o, dict)){
786
if(o.$jsobj){
787
o = jsobj2dict(o.$jsobj)
788
}
790
}else if(hasattr(o, "keys")){
791
var _keys = _b_.list.$factory($B.$call($B.$getattr(o, "keys"))()),
792
i = _keys.length
793
while(i--){
794
var _value = getattr(o, "__getitem__")(_keys[i])
795
dict.$setitem(self, _keys[i], _value)
796
}
797
}else{
798
var it = _b_.iter(o),
799
i = 0
800
while(true){
801
try{
802
var item = _b_.next(it)
803
}catch(err){
804
if(err.__class__ === _b_.StopIteration){break}
805
throw err
806
}
807
try{
808
key_value = _b_.list.$factory(item)
809
}catch(err){
810
throw _b_.TypeError.$factory("cannot convert dictionary" +
811
" update sequence element #" + i + " to a sequence")
812
}
813
if(key_value.length !== 2){
814
throw _b_.ValueError.$factory("dictionary update " +
815
"sequence element #" + i + " has length " +
816
key_value.length + "; 2 is required")
817
}
818
dict.$setitem(self, key_value[0], key_value[1])
819
i++
Sep 5, 2014
822
}
Sep 5, 2014
826
}
827
Mar 7, 2018
828
var $dict_valuesDict = $B.$iterator_class("dict_values")
Nov 21, 2015
829
Feb 11, 2018
830
dict.values = function(self){
Mar 23, 2018
831
if(arguments.length > 1){
832
var _len = arguments.length - 1,
833
_msg = "values() takes no arguments (" + _len + " given)"
834
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
835
}
836
return $iterator_wrapper(new $value_iterator(self), $dict_valuesDict)
837
}
838
839
dict.$factory = function(){
840
var res = dict.__new__(dict)
841
var args = [res]
842
for(var i = 0, len = arguments.length; i < len ; i++){
843
args.push(arguments[i])
844
}
845
dict.__init__.apply(null, args)
Sep 5, 2014
846
return res
847
}
Sep 5, 2014
849
_b_.dict = dict
Feb 11, 2018
851
$B.set_func_names(dict, "builtins")
853
// This must be done after set_func_names, otherwise dict.fromkeys doesn't
854
// have the attribute $infos
855
dict.fromkeys = _b_.classmethod.$factory(dict.fromkeys)
856
857
// Use in py_types.js
858
$B.$dict_items = function(d){return new $item_generator(d).as_list()}
860
// Class for attribute __dict__ of classes
861
var mappingproxy = $B.mappingproxy = $B.make_class("mappingproxy",
Feb 12, 2018
862
function(obj){
863
if(_b_.isinstance(obj, dict)){
864
// Should be a dictionary
865
var res = $B.obj_dict(obj.$string_dict)
866
}else{
867
var res = $B.obj_dict(obj)
868
}
Feb 12, 2018
869
res.__class__ = mappingproxy
870
return res
871
}
872
)
Feb 12, 2018
874
mappingproxy.__setitem__ = function(){
Mar 7, 2018
875
throw _b_.TypeError.$factory("'mappingproxy' object does not support " +
876
"item assignment")
879
for(var attr in dict){
880
if(mappingproxy[attr] !== undefined ||
881
["__class__", "__mro__", "__new__", "__init__", "__delitem__",
882
"clear", "fromkeys", "pop", "popitem", "setdefault",
883
"update"].indexOf(attr) > -1){
884
continue
885
}
886
if(typeof dict[attr] == "function"){
887
mappingproxy[attr] = (function(key){
888
return function(){
889
return dict[key].apply(null, arguments)
890
}
891
})(attr)
892
}else{
893
mappingproxy[attr] = dict[attr]
894
}
895
}
896
Feb 12, 2018
897
$B.set_func_names(mappingproxy, "builtins")
Feb 11, 2018
900
var d = dict.$factory()
Mar 7, 2018
902
if(attr.charAt(0) != "$" && attr !== "__class__"){
903
if(x[attr] === undefined){
904
continue
905
}else if(x[attr].$jsobj === x){
906
d.$string_dict[attr] = d
907
}else{
908
d.$string_dict[attr] = x[attr]
909
}
915
$B.obj_dict = function(obj, from_js){
916
var klass = obj.__class__ || $B.get_class(obj)
917
if(klass !== undefined && klass.$native){
918
throw _b_.AttributeError.$factory(klass.__name__ +
919
" has no attribute '__dict__'")}
Feb 11, 2018
920
var res = dict.$factory()
921
res.$jsobj = obj
922
res.$from_js = from_js // set to true if created by JSObject.to_dict()
923
return res
924
}
925
Sep 5, 2014
926
})(__BRYTHON__)