Skip to content
Permalink
Newer
Older
100644 926 lines (826 sloc) 26.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
var set_ops = ["eq", "add", "sub", "and", "or", "xor", "le", "lt", "ge", "gt"]
11
12
$B.make_view = function(name, set_like){
13
var klass = $B.make_class(name, function(items){
14
return {
15
__class__: klass,
16
__dict__: _b_.dict.$factory(),
17
counter: -1,
18
items: items,
19
len: items.length
20
}
21
})
22
23
if(set_like){
24
for(var i = 0, len = set_ops.length; i < len; i++){
25
var op = "__" + set_ops[i] + "__"
26
klass[op] = (function(op){
27
return function(self, other){
28
// compare set of items to other
29
return _b_.set[op](_b_.set.$factory(self),
30
_b_.set.$factory(other))
31
}
32
})(op)
33
}
34
}
35
klass.__iter__ = function(self){
36
var it = klass.$iterator.$factory(self.items)
37
it.len_func = self.len_func
38
return it
39
}
40
klass.__repr__ = function(self){
41
return klass.$infos.__name__ + '(' + _b_.repr(self.items) + ')'
42
}
43
44
return klass
45
}
46
47
// Special version of __next__ for iterators on dict keys / values / items.
48
// Checks that the dictionary size didn't change during iteration.
49
function dict_iterator_next(self){
50
if(self.len_func() != self.len){
51
throw RuntimeError.$factory("dictionary changed size during iteration")
52
}
53
self.counter++
54
if(self.counter < self.items.length){
55
return self.items[self.counter]
56
}
57
throw _b_.StopIteration.$factory("StopIteration")
58
}
59
Feb 11, 2018
60
var dict = {
Feb 11, 2018
61
__class__: _b_.type,
62
__mro__: [object],
63
$infos: {
64
__module__: "builtins",
65
__name__: "dict"
66
},
Feb 11, 2018
67
$is_class: true,
68
$native: true
Sep 5, 2014
69
}
70
71
function to_list(d, ix){
72
var items = [],
73
item
75
if(d.$jsobj){
Mar 7, 2018
78
if(attr.charAt(0) != "$"){
79
var val = d.$jsobj[attr]
80
if(val === undefined){val = _b_.NotImplemented}
81
else if(val === null){val = $N}
85
}else{
86
for(var k in d.$numeric_dict){
87
items.push([parseFloat(k), d.$numeric_dict[k]])
88
}
90
for(var k in d.$string_dict){items.push([k, d.$string_dict[k]])}
92
for(var k in d.$object_dict){
93
d.$object_dict[k].forEach(function(item){
94
items.push(item)
95
})
96
}
99
if(ix !== undefined){
100
return items.map(function(item){return item[ix]})
101
}else{
102
items.__class__ = _b_.tuple
103
return items.map(function(item){
104
item.__class__ = _b_.tuple; return item}
105
)
106
}
Feb 9, 2015
108
109
$B.dict_to_list = to_list // used in py_types.js
110
111
// Special version of __next__ for iterators on dict keys / values / items.
112
// Checks that the dictionary size didn't change during iteration.
113
function dict_iterator_next(self){
114
if(self.len_func() != self.len){
115
throw RuntimeError.$factory("dictionary changed size during iteration")
116
}
117
self.counter++
118
if(self.counter < self.items.length){
119
return self.items[self.counter]
121
throw _b_.StopIteration.$factory("StopIteration")
125
var $copy_dict = function(left, right){
127
si = dict.$setitem
128
right.$version = right.$version || 0
129
var right_version = right.$version || 0
130
for(var i = 0, len = _l.length; i < len; i++){
131
si(left, _l[i][0], _l[i][1])
132
if(right.$version != right_version){
133
throw _b_.RuntimeError.$factory("dict mutated during update")
134
}
135
}
138
function rank(self, hash, key){
139
// Search if object key, with hash = hash(key), is in
140
// self.$object_dict
141
var pairs = self.$object_dict[hash]
142
if(pairs !== undefined){
143
for(var i = 0, len = pairs.length; i < len; i++){
144
if($B.rich_comp("__eq__", key, pairs[i][0])){
145
return i
146
}
147
}
148
}
149
return -1
150
}
151
Feb 11, 2018
152
dict.__bool__ = function () {
Mar 7, 2018
153
var $ = $B.args("__bool__", 1, {self: null}, ["self"],
154
arguments, {}, null, null)
Feb 11, 2018
155
return dict.__len__($.self) > 0
Feb 11, 2018
158
dict.__contains__ = function(){
Nov 21, 2015
159
160
var $ = $B.args("__contains__", 2, {self: null, key: null},
161
["self", "key"], arguments, {}, null, null),
162
self = $.self,
165
if(self.$jsobj){return self.$jsobj[key] !== undefined}
167
switch(typeof key) {
169
return self.$string_dict[key] !== undefined
171
return self.$numeric_dict[key] !== undefined
172
}
173
174
var hash = _b_.hash(key)
175
if(self.$str_hash[hash] !== undefined &&
176
$B.rich_comp("__eq__", key, self.$str_hash[hash])){return true}
177
if(self.$numeric_dict[hash] !== undefined &&
178
$B.rich_comp("__eq__", key, hash)){return true}
179
return rank(self, hash, key) > -1
Sep 5, 2014
180
}
181
Feb 11, 2018
182
dict.__delitem__ = function(){
Nov 21, 2015
183
184
var $ = $B.args("__eq__", 2, {self: null, arg: null},
185
["self", "arg"], arguments, {}, null, null),
186
self = $.self,
Nov 21, 2015
188
189
if(self.$jsobj){
190
if(self.$jsobj[arg] === undefined){throw KeyError.$factory(arg)}
191
delete self.$jsobj[arg]
194
switch(typeof arg){
195
case "string":
196
if(self.$string_dict[arg] === undefined){
197
throw KeyError.$factory(_b_.str.$factory(arg))
198
}
199
delete self.$string_dict[arg]
200
delete self.$str_hash[str_hash(arg)]
202
return $N
203
case "number":
204
if(self.$numeric_dict[arg] === undefined){
205
throw KeyError.$factory(_b_.str.$factory(arg))
207
delete self.$numeric_dict[arg]
211
// go with defaults
212
213
var hash = _b_.hash(arg),
214
ix
216
if((ix = rank(self, hash, arg)) > -1){
217
self.$object_dict[hash].splice(ix, 1)
218
}else{
219
throw KeyError.$factory(_b_.str.$factory(arg))
Sep 5, 2014
224
}
225
Feb 11, 2018
226
dict.__eq__ = function(){
Mar 7, 2018
227
var $ = $B.args("__eq__", 2, {self: null, other: null},
228
["self", "other"], arguments, {}, null, null),
229
self = $.self,
230
other = $.other
Mar 7, 2018
232
if(! isinstance(other, dict)){return false}
234
if(self.$jsobj){self = jsobj2dict(self.$jsobj)}
235
if(other.$jsobj){other = jsobj2dict(other.$jsobj)}
236
if(dict.__len__(self) != dict.__len__(other)){
237
return false
238
}
240
if(self.$string_dict.length != other.$string_dict.length){
244
for(var k in self.$numeric_dict){
245
if(other.$numeric_dict.hasOwnProperty(k)){
246
if(!$B.rich_comp("__eq__", other.$numeric_dict[k],
247
self.$numeric_dict[k])){
248
return false
249
}
250
}else if(other.$object_dict.hasOwnProperty(k)){
251
var pairs = other.$object_dict[k],
252
flag = false
253
for(var i = 0, len = pairs.length; i < len; i++){
254
if($B.rich_comp("__eq__", k, pairs[i][0]) &&
255
$B.rich_comp("__eq__", self.$numeric_dict[k],
256
pairs[i][1])){
257
flag = true
258
break
259
}
261
if(! flag){return false}
Nov 21, 2015
264
}
265
}
266
for(var k in self.$string_dict){
267
if(!other.$string_dict.hasOwnProperty(k) ||
268
!$B.rich_comp("__eq__", other.$string_dict[k],
269
self.$string_dict[k])){
270
return false
Nov 21, 2015
271
}
272
}
273
for(var hash in self.$object_dict){
274
var pairs = self.$object_dict[hash]
275
// Get all (key, value) pairs in other that have the same hash
276
var other_pairs = []
277
if(other.$numeric_dict[hash] !== undefined){
278
other_pairs.push([hash, other.$numeric_dict[hash]])
279
}
280
if(other.$object_dict[hash] !== undefined){
281
other_pairs = other_pairs.concat(other.$object_dict[hash])
282
}
283
if(other_pairs.length == 0){
284
return false
285
}
286
for(var i = 0, len_i = pairs.length; i < len_i; i++){
287
var flag = false
288
var key = pairs[i][0],
289
value = pairs[i][1]
290
for(var j = 0, len_j = other_pairs.length; j < len_j; j++){
291
if($B.rich_comp("__eq__", key, other_pairs[j][0]) &&
292
$B.rich_comp("__eq__", value, other_pairs[j][1])){
293
flag = true
294
break
300
}
301
}
302
return true
Sep 5, 2014
303
}
304
Feb 11, 2018
305
dict.__getitem__ = function(){
306
var $ = $B.args("__getitem__", 2, {self: null, arg: null},
307
["self", "arg"], arguments, {}, null, null),
308
self = $.self,
310
if(self.$jsobj){
311
if(!self.$jsobj.hasOwnProperty(arg)){
312
throw _b_.KeyError.$factory(str.$factory(arg))
313
}else if(self.$jsobj[arg] === undefined){
314
return _b_.NotImplemented
315
}else if(self.$jsobj[arg] === null){return $N}
316
return self.$jsobj[arg]
318
319
switch(typeof arg){
320
case "string":
321
if(self.$string_dict[arg] !== undefined){
322
return self.$string_dict[arg]
324
break
325
case "number":
326
if(self.$numeric_dict[arg] !== undefined){
327
return self.$numeric_dict[arg]
329
break
330
}
331
332
// since the key is more complex use 'default' method of getting item
333
334
var hash = _b_.hash(arg),
335
_eq = function(other){return $B.rich_comp("__eq__", arg, other)}
336
337
if(typeof arg == "object"){
338
arg.$hash = hash // cache for setdefault
339
}
340
var sk = self.$str_hash[hash]
341
if(sk !== undefined && _eq(sk)){
342
return self.$string_dict[sk]
343
}
344
if(self.$numeric_dict[hash] !== undefined && _eq(hash)){
345
return self.$numeric_dict[hash]
346
}
347
if(isinstance(arg, _b_.str)){
348
// string subclass
349
var res = self.$string_dict[arg.valueOf()]
350
if(res !== undefined){return res}
351
}
352
353
var ix = rank(self, hash, arg)
354
if(ix > -1){
355
return self.$object_dict[hash][ix][1]
358
if(self.__class__ !== dict){
360
var missing_method = getattr(self.__class__, "__missing__",
361
_b_.None)
362
}catch(err){
363
console.log(err)
364
365
}
366
if(missing_method !== _b_.None){
367
return missing_method(self, arg)
Sep 5, 2014
371
}
372
373
dict.__hash__ = _b_.None
Sep 5, 2014
374
375
function init_from_list(self, args){
376
var i = -1,
377
stop = args.length - 1,
378
si = dict.__setitem__
379
while(i++ < stop){
380
var item = args[i]
381
switch(typeof item[0]) {
382
case 'string':
383
self.$string_dict[item[0]] = item[1]
384
self.$str_hash[str_hash(item[0])] = item[0]
385
break
386
case 'number':
387
self.$numeric_dict[item[0]] = item[1]
388
break
389
default:
390
si(self, item[0], item[1])
391
break
392
}
393
}
394
}
395
396
dict.__init__ = function(self, first, second){
398
if(first === undefined){return $N}
399
if(second === undefined){
400
if(first.__class__ === $B.JSObject){
401
self.$jsobj = first.js
402
return $N
403
}else if(first.$jsobj){
404
self.$jsobj = {}
405
for(var attr in first.$jsobj){
406
self.$jsobj[attr] = first.$jsobj[attr]
409
}else if(Array.isArray(first)){
410
init_from_list(self, first)
411
return $N
Sep 5, 2014
412
}
415
$ = $ || $B.args("dict", 1, {self:null}, ["self"],
416
arguments, {}, "first", "second")
417
var args = $.first
418
if(args.length > 1){
419
throw _b_.TypeError.$factory("dict expected at most 1 argument" +
420
", got 2")
421
}else if(args.length == 1){
422
args = args[0]
423
if(args.__class__ === dict){
424
['$string_dict', '$str_hash', '$numeric_dict', '$object_dict'].
425
forEach(function(d){
426
for(key in args[d]){self[d][key] = args[d][key]}
427
})
428
}else if(isinstance(args, dict)){
429
$copy_dict(self, args)
431
var keys = $B.$getattr(args, "keys", null)
432
if(keys !== null){
433
var gi = $B.$getattr(args, "__getitem__", null)
434
if(gi !== null){
435
// has keys and __getitem__ : it's a mapping, iterate on
436
// keys and values
437
gi = $B.$call(gi)
438
var kiter = _b_.iter($B.$call(keys)())
439
while(true){
440
try{
441
var key = _b_.next(kiter),
442
value = gi(key)
443
dict.__setitem__(self, key, value)
444
}catch(err){
445
if(err.__class__ === _b_.StopIteration){
446
break
447
}
448
throw err
449
}
450
}
451
return $N
452
}
453
}
454
if(! Array.isArray(args)){
455
args = _b_.list.$factory(args)
456
}
457
// Form "dict([[key1, value1], [key2,value2], ...])"
458
init_from_list(self, args)
Sep 5, 2014
459
}
461
var kw = $.second.$string_dict
462
for(var attr in kw){
463
switch(typeof attr){
464
case "string":
465
self.$string_dict[attr] = kw[attr]
466
self.$str_hash[str_hash(attr)] = attr
467
break
468
case "number":
469
self.$numeric_dict[attr] = kw[attr]
470
break
471
default:
472
si(self, attr, kw[attr])
473
break
474
}
Sep 5, 2014
477
}
478
Feb 11, 2018
479
dict.__iter__ = function(self) {
480
return _b_.iter(dict.$$keys(self))
Sep 5, 2014
481
}
482
Feb 11, 2018
483
dict.__len__ = function(self) {
486
if(self.$jsobj){
Mar 7, 2018
487
for(var attr in self.$jsobj){if(attr.charAt(0) != "$"){_count++}}
488
return _count
489
}
491
for(var k in self.$numeric_dict){_count++}
492
for(var k in self.$string_dict){_count++}
493
for(var hash in self.$object_dict){
494
_count += self.$object_dict[hash].length
495
}
Sep 5, 2014
499
Mar 7, 2018
500
dict.__ne__ = function(self, other){return ! dict.__eq__(self, other)}
Sep 5, 2014
501
Feb 11, 2018
502
dict.__new__ = function(cls){
503
if(cls === undefined){
Mar 7, 2018
504
throw _b_.TypeError.$factory("int.__new__(): not enough arguments")
506
var instance = {
508
$numeric_dict : {},
509
$object_dict : {},
511
$str_hash: {},
512
$version: 0
514
if(cls !== dict){
515
instance.__dict__ = _b_.dict.$factory()
516
}
517
return instance
Feb 11, 2018
520
dict.__repr__ = function(self){
521
if(self.$jsobj){ // wrapper around Javascript object
Feb 11, 2018
522
return dict.__repr__(jsobj2dict(self.$jsobj))
524
var res = [],
526
items.forEach(function(item){
527
if((!self.$jsobj && item[1] === self) ||
528
(self.$jsobj && item[1] === self.$jsobj)){
Mar 7, 2018
529
res.push(repr(item[0]) + ": {...}")
531
res.push(repr(item[0]) + ": " + repr(item[1]))
Mar 7, 2018
534
return "{" + res.join(", ") + "}"
Sep 5, 2014
535
}
536
537
dict.__setitem__ = function(self, key, value){
Mar 7, 2018
538
var $ = $B.args("__setitem__", 3, {self: null, key: null, value: null},
539
["self", "key", "value"], arguments, {}, null, null)
540
return dict.$setitem($.self, $.key, $.value)
541
}
Nov 21, 2015
542
543
dict.$setitem = function(self, key, value, $hash){
544
// Parameter $hash is only set if this method is called by setdefault.
545
// In this case the hash of key has already been computed and we
546
// know that the key is not present in the dictionary, so it's no
547
// use computing hash(key) again, nor testing equality of keys
549
if(self.$from_js){
550
// dictionary created by method to_dict of JSObject instances
551
value = $B.pyobj2jsobj(value)
552
}
553
if(self.$jsobj.__class__ === _b_.type){
554
self.$jsobj[key] = value
555
if(key == "__init__" || key == "__new__"){
556
// If class attribute __init__ or __new__ are reset,
557
// the factory function has to change
558
self.$jsobj.$factory = $B.$instance_creator(self.$jsobj)
559
}
560
}else{
561
self.$jsobj[key] = value
566
switch(typeof key){
567
case "string":
568
self.$string_dict[key] = value
569
self.$str_hash[str_hash(key)] = key
571
return $N
572
case "number":
573
self.$numeric_dict[key] = value
575
return $N
578
// if we got here the key is more complex, use default method
579
580
var hash = $hash === undefined ? _b_.hash(key) : $hash,
581
_eq = function(other){return $B.rich_comp("__eq__", key, other)}
582
583
if(self.$numeric_dict[hash] !== undefined && _eq(hash)){
584
self.$numeric_dict[hash] = value
588
var sk = self.$str_hash[hash]
589
if(sk !== undefined && _eq(sk)){
590
self.$string_dict[sk] = value
595
// If $setitem is called from setdefault, don't test equality of key
596
// with any object
597
if($hash){
598
if(self.$object_dict[$hash] !== undefined){
599
self.$object_dict[$hash].push([key, value])
600
}else{
601
self.$object_dict[$hash] = [[key, value]]
602
}
603
self.$version++
604
return $N
605
}
606
var ix = rank(self, hash, key)
607
if(ix > -1){
608
// reset value
609
self.$object_dict[hash][ix][1] = value
610
return $N
611
}else if(self.$object_dict.hasOwnProperty(hash)){
612
self.$object_dict[hash].push([key, value])
613
}else{
614
self.$object_dict[hash] = [[key, value]]
Sep 5, 2014
618
}
619
620
dict.__str__ = function(){return dict.__repr__.apply(null, arguments)}
Sep 5, 2014
621
622
// add "reflected" methods
Feb 11, 2018
623
$B.make_rmethods(dict)
Sep 5, 2014
624
Feb 11, 2018
625
dict.clear = function(){
Sep 5, 2014
626
// Remove all items from the dictionary.
Mar 7, 2018
627
var $ = $B.args("clear", 1, {self: null}, ["self"], arguments, {},
628
null, null),
629
self = $.self
631
self.$numeric_dict = {}
632
self.$string_dict = {}
633
self.$str_hash = {}
634
self.$object_dict = {}
636
if(self.$jsobj){
637
for(var attr in self.$jsobj){
Mar 7, 2018
638
if(attr.charAt(0) !== "$" && attr !== "__class__"){
639
delete self.$jsobj[attr]
640
}
641
}
642
}
Sep 5, 2014
645
}
646
Feb 11, 2018
647
dict.copy = function(self){
Sep 5, 2014
648
// Return a shallow copy of the dictionary
Mar 7, 2018
649
var $ = $B.args("copy", 1, {self: null},["self"], arguments,{},
650
null, null),
651
self = $.self,
Feb 11, 2018
652
res = _b_.dict.$factory()
Sep 5, 2014
654
return res
655
}
656
Feb 11, 2018
657
dict.fromkeys = function(){
Nov 21, 2015
658
Mar 7, 2018
659
var $ = $B.args("fromkeys", 3, {cls: null, keys: null, value: null},
660
["cls", "keys", "value"], arguments, {value: _b_.None}, null, null),
661
keys = $.keys,
662
value = $.value
Sep 5, 2014
664
// class method
665
var klass = $.cls,
Sep 5, 2014
669
while(1){
670
try{
671
var key = _b_.next(keys_iter)
672
if(klass === dict){dict.$setitem(res, key, value)}
673
else{$B.$getattr(res, "__setitem__")(key, value)}
Sep 5, 2014
674
}catch(err){
675
if($B.is_exc(err, [_b_.StopIteration])){
Sep 5, 2014
676
return res
677
}
678
throw err
679
}
680
}
681
}
682
Feb 11, 2018
683
dict.get = function(){
Mar 7, 2018
684
var $ = $B.args("get", 3, {self: null, key: null, _default: null},
685
["self", "key", "_default"], arguments, {_default: $N}, null, null)
Feb 11, 2018
687
try{return dict.__getitem__($.self, $.key)}
688
catch(err){
689
if(_b_.isinstance(err, _b_.KeyError)){return $._default}
690
else{throw err}
691
}
692
}
693
694
var dict_items = $B.make_view("dict_items", true)
695
dict_items.$iterator = $B.make_iterator_class("dict_itemiterator")
696
Feb 11, 2018
697
dict.items = function(self){
Mar 23, 2018
698
if(arguments.length > 1){
699
var _len = arguments.length - 1,
700
_msg = "items() takes no arguments (" + _len + " given)"
701
throw _b_.TypeError.$factory(_msg)
702
}
703
var it = dict_items.$factory(to_list(self))
704
it.len_func = function(){return dict.__len__(self)}
705
return it
706
}
707
708
var dict_keys = $B.make_view("dict_keys", true)
709
dict_keys.$iterator = $B.make_iterator_class("dict_keyiterator")
Nov 21, 2015
710
Mar 23, 2018
712
if(arguments.length > 1){
713
var _len = arguments.length - 1,
714
_msg = "keys() takes no arguments (" + _len + " given)"
715
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
716
}
717
var it = dict_keys.$factory(to_list(self, 0))
718
it.len_func = function(){return dict.__len__(self)}
719
return it
Nov 21, 2015
720
}
721
Feb 11, 2018
722
dict.pop = function(){
Nov 21, 2015
723
724
var missing = {},
725
$ = $B.args("pop", 3, {self: null, key: null, _default: null},
726
["self", "key", "_default"], arguments, {_default: missing}, null, null),
727
self = $.self,
728
key = $.key,
729
_default = $._default
Nov 21, 2015
730
Sep 5, 2014
731
try{
732
var res = dict.__getitem__(self, key)
733
dict.__delitem__(self, key)
Sep 5, 2014
734
return res
735
}catch(err){
736
if(err.__class__ === _b_.KeyError){
737
if(_default !== missing){return _default}
Sep 5, 2014
738
throw err
739
}
740
throw err
741
}
742
}
743
Feb 11, 2018
744
dict.popitem = function(self){
746
var itm = _b_.next(_b_.iter(dict.items(self)))
747
dict.__delitem__(self, itm[0])
Feb 11, 2018
748
return _b_.tuple.$factory(itm)
750
if (err.__class__ == _b_.StopIteration) {
751
throw KeyError.$factory("'popitem(): dictionary is empty'")
Sep 5, 2014
754
}
755
Feb 11, 2018
756
dict.setdefault = function(){
Nov 21, 2015
757
Mar 7, 2018
758
var $ = $B.args("setdefault", 3, {self: null, key: null, _default: null},
759
["self", "key", "_default"], arguments, {_default: $N}, null, null),
760
self = $.self,
761
key = $.key,
762
_default = $._default
Nov 21, 2015
763
764
try{return dict.__getitem__(self, key)}
Sep 5, 2014
765
catch(err){
766
if(err.__class__ !== _b_.KeyError){
767
throw err
768
}
769
if(_default === undefined){_default = $N}
770
var hash = key.$hash
771
key.$hash = undefined
772
dict.$setitem(self, key, _default, hash)
Sep 5, 2014
773
return _default
774
}
775
}
776
Feb 11, 2018
777
dict.update = function(self){
Nov 21, 2015
778
Mar 7, 2018
779
var $ = $B.args("update", 1, {"self": null}, ["self"], arguments,
780
{}, "args", "kw"),
781
self = $.self,
782
args = $.args,
783
kw = $.kw
784
if(args.length > 0){
785
var o = args[0]
786
if(isinstance(o, dict)){
787
if(o.$jsobj){
788
o = jsobj2dict(o.$jsobj)
789
}
792
var _keys = _b_.list.$factory($B.$call($B.$getattr(o, "keys"))())
793
for(var i = 0, len = _keys.length; i < len; 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
828
var dict_values = $B.make_view("dict_values")
829
dict_values.$iterator = $B.make_iterator_class("dict_valueiterator")
Nov 21, 2015
830
Feb 11, 2018
831
dict.values = function(self){
Mar 23, 2018
832
if(arguments.length > 1){
833
var _len = arguments.length - 1,
834
_msg = "values() takes no arguments (" + _len + " given)"
835
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
836
}
837
var it = dict_values.$factory(to_list(self, 1))
838
it.len_func = function(){return dict.__len__(self)}
839
return it
Nov 21, 2015
840
}
841
842
dict.$factory = function(){
843
var res = dict.__new__(dict)
844
var args = [res]
845
for(var i = 0, len = arguments.length; i < len ; i++){
846
args.push(arguments[i])
847
}
848
dict.__init__.apply(null, args)
Sep 5, 2014
849
return res
850
}
Sep 5, 2014
852
_b_.dict = dict
Feb 11, 2018
854
$B.set_func_names(dict, "builtins")
856
// This must be done after set_func_names, otherwise dict.fromkeys doesn't
857
// have the attribute $infos
858
dict.fromkeys = _b_.classmethod.$factory(dict.fromkeys)
859
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__)