Skip to content
Permalink
Newer
Older
100644 982 lines (880 sloc) 28.8 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
$B.set_func_names(klass, "builtins")
45
return klass
46
}
47
48
// Special version of __next__ for iterators on dict keys / values / items.
49
// Checks that the dictionary size didn't change during iteration.
50
function dict_iterator_next(self){
51
if(self.len_func() != self.len){
52
throw RuntimeError.$factory("dictionary changed size during iteration")
53
}
54
self.counter++
55
if(self.counter < self.items.length){
56
return self.items[self.counter]
57
}
58
throw _b_.StopIteration.$factory("StopIteration")
59
}
60
Feb 11, 2018
61
var dict = {
Feb 11, 2018
62
__class__: _b_.type,
63
__mro__: [object],
64
$infos: {
65
__module__: "builtins",
66
__name__: "dict"
67
},
Feb 11, 2018
68
$is_class: true,
69
$native: true
Sep 5, 2014
70
}
71
72
dict.$to_obj = function(d){
73
// Function applied to dictionary that only have string keys,
74
// return a Javascript objects with the kays mapped to the value,
75
// excluding the insertion rank
76
var res = {}
77
for(var key in d.$string_dict){
78
res[key] = d.$string_dict[key][0]
79
}
80
return res
81
}
82
83
function to_list(d, ix){
84
var items = [],
85
item
87
if(d.$jsobj){
Mar 7, 2018
90
if(attr.charAt(0) != "$"){
91
var val = d.$jsobj[attr]
92
if(val === undefined){val = _b_.NotImplemented}
93
else if(val === null){val = $N}
97
}else{
98
for(var k in d.$numeric_dict){
99
items.push([parseFloat(k), d.$numeric_dict[k]])
100
}
102
for(var k in d.$string_dict){items.push([k, d.$string_dict[k]])}
104
for(var k in d.$object_dict){
105
d.$object_dict[k].forEach(function(item){
106
items.push(item)
107
})
108
}
109
// sort by insertion order
110
items.sort(function(a, b){
111
return a[1][1] - b[1][1]
112
})
113
items = items.map(function(item){return [item[0], item[1][0]]})
116
if(ix !== undefined){
117
return items.map(function(item){return item[ix]})
118
}else{
119
items.__class__ = _b_.tuple
120
return items.map(function(item){
121
item.__class__ = _b_.tuple; return item}
122
)
123
}
Feb 9, 2015
125
126
$B.dict_to_list = to_list // used in py_types.js
127
128
// Special version of __next__ for iterators on dict keys / values / items.
129
// Checks that the dictionary size didn't change during iteration.
130
function dict_iterator_next(self){
131
if(self.len_func() != self.len){
132
throw RuntimeError.$factory("dictionary changed size during iteration")
133
}
134
self.counter++
135
if(self.counter < self.items.length){
136
return self.items[self.counter]
138
throw _b_.StopIteration.$factory("StopIteration")
142
var $copy_dict = function(left, right){
144
si = dict.$setitem
145
right.$version = right.$version || 0
146
var right_version = right.$version || 0
147
for(var i = 0, len = _l.length; i < len; i++){
148
si(left, _l[i][0], _l[i][1])
149
if(right.$version != right_version){
150
throw _b_.RuntimeError.$factory("dict mutated during update")
151
}
152
}
155
function rank(self, hash, key){
156
// Search if object key, with hash = hash(key), is in
157
// self.$object_dict
158
var pairs = self.$object_dict[hash]
159
if(pairs !== undefined){
160
for(var i = 0, len = pairs.length; i < len; i++){
161
if($B.rich_comp("__eq__", key, pairs[i][0])){
162
return i
163
}
164
}
165
}
166
return -1
167
}
168
Feb 11, 2018
169
dict.__bool__ = function () {
Mar 7, 2018
170
var $ = $B.args("__bool__", 1, {self: null}, ["self"],
171
arguments, {}, null, null)
Feb 11, 2018
172
return dict.__len__($.self) > 0
Feb 11, 2018
175
dict.__contains__ = function(){
Nov 21, 2015
176
177
var $ = $B.args("__contains__", 2, {self: null, key: null},
178
["self", "key"], arguments, {}, null, null),
179
self = $.self,
181
if(self.$is_namespace){key = $B.to_alias(key)} // issue 1244
182
183
if(self.$jsobj){
184
return self.$jsobj[key] !== undefined
185
}
187
switch(typeof key) {
189
return self.$string_dict[key] !== undefined
191
return self.$numeric_dict[key] !== undefined
192
}
193
194
var hash = _b_.hash(key)
195
if(self.$str_hash[hash] !== undefined &&
196
$B.rich_comp("__eq__", key, self.$str_hash[hash])){return true}
197
if(self.$numeric_dict[hash] !== undefined &&
198
$B.rich_comp("__eq__", key, hash)){return true}
199
return rank(self, hash, key) > -1
Sep 5, 2014
200
}
201
Feb 11, 2018
202
dict.__delitem__ = function(){
Nov 21, 2015
203
204
var $ = $B.args("__eq__", 2, {self: null, arg: null},
205
["self", "arg"], arguments, {}, null, null),
206
self = $.self,
Nov 21, 2015
208
209
if(self.$jsobj){
210
if(self.$jsobj[arg] === undefined){throw KeyError.$factory(arg)}
211
delete self.$jsobj[arg]
214
switch(typeof arg){
215
case "string":
216
if(self.$string_dict[arg] === undefined){
217
throw KeyError.$factory(_b_.str.$factory(arg))
218
}
219
delete self.$string_dict[arg]
220
delete self.$str_hash[str_hash(arg)]
222
return $N
223
case "number":
224
if(self.$numeric_dict[arg] === undefined){
225
throw KeyError.$factory(_b_.str.$factory(arg))
227
delete self.$numeric_dict[arg]
231
// go with defaults
232
233
var hash = _b_.hash(arg),
234
ix
236
if((ix = rank(self, hash, arg)) > -1){
237
self.$object_dict[hash].splice(ix, 1)
238
}else{
239
throw KeyError.$factory(_b_.str.$factory(arg))
Sep 5, 2014
244
}
245
Feb 11, 2018
246
dict.__eq__ = function(){
Mar 7, 2018
247
var $ = $B.args("__eq__", 2, {self: null, other: null},
248
["self", "other"], arguments, {}, null, null),
249
self = $.self,
250
other = $.other
Mar 7, 2018
252
if(! isinstance(other, dict)){return false}
254
if(self.$jsobj){self = jsobj2dict(self.$jsobj)}
255
if(other.$jsobj){other = jsobj2dict(other.$jsobj)}
256
if(dict.__len__(self) != dict.__len__(other)){
257
return false
258
}
260
if(self.$string_dict.length != other.$string_dict.length){
264
for(var k in self.$numeric_dict){
265
if(other.$numeric_dict.hasOwnProperty(k)){
266
if(!$B.rich_comp("__eq__", other.$numeric_dict[k][0],
267
self.$numeric_dict[k][0])){
268
return false
269
}
270
}else if(other.$object_dict.hasOwnProperty(k)){
271
var pairs = other.$object_dict[k],
272
flag = false
273
for(var i = 0, len = pairs.length; i < len; i++){
274
if($B.rich_comp("__eq__", k, pairs[i][0]) &&
275
$B.rich_comp("__eq__", self.$numeric_dict[k],
276
pairs[i][1])){
277
flag = true
278
break
279
}
281
if(! flag){return false}
Nov 21, 2015
284
}
285
}
286
for(var k in self.$string_dict){
287
if(!other.$string_dict.hasOwnProperty(k) ||
288
!$B.rich_comp("__eq__", other.$string_dict[k][0],
289
self.$string_dict[k][0])){
Nov 21, 2015
291
}
292
}
293
for(var hash in self.$object_dict){
294
var pairs = self.$object_dict[hash]
295
// Get all (key, value) pairs in other that have the same hash
296
var other_pairs = []
297
if(other.$numeric_dict[hash] !== undefined){
298
other_pairs.push([hash, other.$numeric_dict[hash]])
299
}
300
if(other.$object_dict[hash] !== undefined){
301
other_pairs = other_pairs.concat(other.$object_dict[hash])
302
}
303
if(other_pairs.length == 0){
304
return false
305
}
306
for(var i = 0, len_i = pairs.length; i < len_i; i++){
307
var flag = false
308
var key = pairs[i][0],
309
value = pairs[i][1][0]
310
for(var j = 0, len_j = other_pairs.length; j < len_j; j++){
311
if($B.rich_comp("__eq__", key, other_pairs[j][0]) &&
312
$B.rich_comp("__eq__", value, other_pairs[j][1][0])){
313
flag = true
314
break
320
}
321
}
322
return true
Sep 5, 2014
323
}
324
Feb 11, 2018
325
dict.__getitem__ = function(){
326
var $ = $B.args("__getitem__", 2, {self: null, arg: null},
327
["self", "arg"], arguments, {}, null, null),
328
self = $.self,
330
return dict.$getitem(self, arg)
331
}
332
333
dict.$getitem = function(self, arg){
334
if(self.$jsobj){
335
if(!self.$jsobj.hasOwnProperty(arg)){
336
throw _b_.KeyError.$factory(str.$factory(arg))
337
}else if(self.$jsobj[arg] === undefined){
338
return _b_.NotImplemented
339
}else if(self.$jsobj[arg] === null){return $N}
340
return self.$jsobj[arg]
342
343
switch(typeof arg){
344
case "string":
345
if(self.$string_dict[arg] !== undefined){
346
return self.$string_dict[arg][0]
348
break
349
case "number":
350
if(self.$numeric_dict[arg] !== undefined){
351
return self.$numeric_dict[arg][0]
353
break
354
}
355
356
// since the key is more complex use 'default' method of getting item
357
358
var hash = _b_.hash(arg),
359
_eq = function(other){return $B.rich_comp("__eq__", arg, other)}
360
361
if(typeof arg == "object"){
362
arg.$hash = hash // cache for setdefault
363
}
364
var sk = self.$str_hash[hash]
365
if(sk !== undefined && _eq(sk)){
366
return self.$string_dict[sk][0]
368
if(self.$numeric_dict[hash] !== undefined && _eq(hash)){
369
return self.$numeric_dict[hash][0]
370
}
371
if(isinstance(arg, _b_.str)){
372
// string subclass
373
var res = self.$string_dict[arg.valueOf()]
374
if(res !== undefined){return res[0]}
377
var ix = rank(self, hash, arg)
378
if(ix > -1){
379
return self.$object_dict[hash][ix][1][0]
382
if(self.__class__ !== dict){
384
var missing_method = getattr(self.__class__, "__missing__",
385
_b_.None)
386
}catch(err){
387
console.log(err)
388
389
}
390
if(missing_method !== _b_.None){
391
return missing_method(self, arg)
Sep 5, 2014
395
}
396
397
dict.__hash__ = _b_.None
Sep 5, 2014
398
399
function init_from_list(self, args){
400
var i = -1,
401
stop = args.length - 1,
402
si = dict.__setitem__
403
while(i++ < stop){
404
var item = args[i]
405
switch(typeof item[0]) {
406
case 'string':
407
self.$string_dict[item[0]] = [item[1], self.$version]
408
self.$str_hash[str_hash(item[0])] = item[0]
409
self.$version++
410
break
411
case 'number':
412
self.$numeric_dict[item[0]] = [item[1], self.$version]
413
self.$version++
414
break
415
default:
416
si(self, item[0], item[1])
417
break
418
}
419
}
420
}
421
422
dict.__init__ = function(self, first, second){
424
if(first === undefined){return $N}
425
if(second === undefined){
426
if(first.__class__ === $B.JSObject){
427
self.$jsobj = first.js
428
return $N
429
}else if(first.$jsobj){
430
self.$jsobj = {}
431
for(var attr in first.$jsobj){
432
self.$jsobj[attr] = first.$jsobj[attr]
435
}else if(Array.isArray(first)){
436
init_from_list(self, first)
437
return $N
Sep 5, 2014
438
}
441
$ = $ || $B.args("dict", 1, {self:null}, ["self"],
442
arguments, {}, "first", "second")
443
var args = $.first
444
if(args.length > 1){
445
throw _b_.TypeError.$factory("dict expected at most 1 argument" +
446
", got 2")
447
}else if(args.length == 1){
448
args = args[0]
449
if(args.__class__ === dict){
450
['$string_dict', '$str_hash', '$numeric_dict', '$object_dict'].
451
forEach(function(d){
452
for(key in args[d]){self[d][key] = args[d][key]}
453
})
454
}else if(isinstance(args, dict)){
455
$copy_dict(self, args)
457
var keys = $B.$getattr(args, "keys", null)
458
if(keys !== null){
459
var gi = $B.$getattr(args, "__getitem__", null)
460
if(gi !== null){
461
// has keys and __getitem__ : it's a mapping, iterate on
462
// keys and values
463
gi = $B.$call(gi)
464
var kiter = _b_.iter($B.$call(keys)())
465
while(true){
466
try{
467
var key = _b_.next(kiter),
468
value = gi(key)
469
dict.__setitem__(self, key, value)
470
}catch(err){
471
if(err.__class__ === _b_.StopIteration){
472
break
473
}
474
throw err
475
}
476
}
477
return $N
478
}
479
}
480
if(! Array.isArray(args)){
481
args = _b_.list.$factory(args)
482
}
483
// Form "dict([[key1, value1], [key2,value2], ...])"
484
init_from_list(self, args)
Sep 5, 2014
485
}
487
var kw = $.second.$string_dict
488
for(var attr in kw){
489
switch(typeof attr){
490
case "string":
491
self.$string_dict[attr] = kw[attr]
492
self.$str_hash[str_hash(attr)] = attr
493
break
494
case "number":
495
self.$numeric_dict[attr] = kw[attr]
496
break
497
default:
498
si(self, attr, kw[attr])
499
break
500
}
Sep 5, 2014
503
}
504
Feb 11, 2018
505
dict.__iter__ = function(self) {
506
return _b_.iter(dict.$$keys(self))
Sep 5, 2014
507
}
508
Feb 11, 2018
509
dict.__len__ = function(self) {
512
if(self.$jsobj){
Mar 7, 2018
513
for(var attr in self.$jsobj){if(attr.charAt(0) != "$"){_count++}}
514
return _count
515
}
517
for(var k in self.$numeric_dict){_count++}
518
for(var k in self.$string_dict){_count++}
519
for(var hash in self.$object_dict){
520
_count += self.$object_dict[hash].length
521
}
Sep 5, 2014
525
Mar 7, 2018
526
dict.__ne__ = function(self, other){return ! dict.__eq__(self, other)}
Sep 5, 2014
527
Feb 11, 2018
528
dict.__new__ = function(cls){
529
if(cls === undefined){
Mar 7, 2018
530
throw _b_.TypeError.$factory("int.__new__(): not enough arguments")
532
var instance = {
534
$numeric_dict : {},
535
$object_dict : {},
537
$str_hash: {},
538
$version: 0
540
if(cls !== dict){
541
instance.__dict__ = _b_.dict.$factory()
542
}
543
return instance
Feb 11, 2018
546
dict.__repr__ = function(self){
547
if(self.$jsobj){ // wrapper around Javascript object
Feb 11, 2018
548
return dict.__repr__(jsobj2dict(self.$jsobj))
550
var res = [],
552
items.forEach(function(item){
553
if((!self.$jsobj && item[1] === self) ||
554
(self.$jsobj && item[1] === self.$jsobj)){
Mar 7, 2018
555
res.push(repr(item[0]) + ": {...}")
557
res.push(repr(item[0]) + ": " + repr(item[1]))
Mar 7, 2018
560
return "{" + res.join(", ") + "}"
Sep 5, 2014
561
}
562
563
dict.__setitem__ = function(self, key, value){
Mar 7, 2018
564
var $ = $B.args("__setitem__", 3, {self: null, key: null, value: null},
565
["self", "key", "value"], arguments, {}, null, null)
566
return dict.$setitem($.self, $.key, $.value)
567
}
Nov 21, 2015
568
569
dict.$setitem = function(self, key, value, $hash){
570
// Set a dictionary item mapping key and value.
571
//
572
// If key is a string, set $string_dict[key] = value and
573
// $str_hash[hash(key)] to key
574
//
575
// If key is a number, set $numeric_dict[key] = value
576
//
577
// If key is another object, compute its hash value:
578
// - if the hash is a key of $str_hash, and key == $str_hash[hash],
579
// replace $string_dict[$str_hash[hash]] by value
580
// - if the hash is a key of $numeric_dict, and hash == key, replace
581
// $numeric_dict[hash] by value
582
// - if the hash is a key of $object_dict: $object_dict[hash] is a list
583
// of [k, v] pairs. If key is equal to one of the "k", replace the
584
// matching v by value. Otherwise, add [key, value] to the list
585
// - else set $object_dict[hash] = [[key, value]]
586
//
587
// In all cases, increment attribute $version, used to detect dictionary
588
// cahnges during an iteration.
589
//
590
// Parameter $hash is only set if this method is called by setdefault.
591
// In this case the hash of key has already been computed and we
592
// know that the key is not present in the dictionary, so it's no
593
// use computing hash(key) again, nor testing equality of keys
595
if(self.$from_js){
596
// dictionary created by method to_dict of JSObject instances
597
value = $B.pyobj2jsobj(value)
598
}
599
if(self.$jsobj.__class__ === _b_.type){
600
self.$jsobj[key] = value
601
if(key == "__init__" || key == "__new__"){
602
// If class attribute __init__ or __new__ are reset,
603
// the factory function has to change
604
self.$jsobj.$factory = $B.$instance_creator(self.$jsobj)
605
}
606
}else{
607
self.$jsobj[key] = value
612
switch(typeof key){
613
case "string":
614
if(self.$string_dict === undefined){
615
console.log("pas de string dict", self, key, value)
616
}
617
self.$string_dict[key] = [value, self.$version]
618
self.$str_hash[str_hash(key)] = key
620
return $N
621
case "number":
622
self.$numeric_dict[key] = [value, self.$version]
624
return $N
627
// if we got here the key is more complex, use default method
628
629
var hash = $hash === undefined ? _b_.hash(key) : $hash,
630
_eq = function(other){return $B.rich_comp("__eq__", key, other)}
631
632
if(self.$numeric_dict[hash] !== undefined && _eq(hash)){
633
self.$numeric_dict[hash] = [value, self.$numeric_dict[hash][1]]
637
var sk = self.$str_hash[hash]
638
if(sk !== undefined && _eq(sk)){
639
self.$string_dict[sk] = [value, self.$string_dict[sk][1]]
644
// If $setitem is called from setdefault, don't test equality of key
645
// with any object
646
if($hash){
647
if(self.$object_dict[$hash] !== undefined){
648
self.$object_dict[$hash].push([key, [value, self.$version]])
650
self.$object_dict[$hash] = [[key, [value, self.$version]]]
651
}
652
self.$version++
653
return $N
654
}
655
var ix = rank(self, hash, key)
656
if(ix > -1){
657
// reset value
658
self.$object_dict[hash][ix][1] = [value,
659
self.$object_dict[hash][ix][1][1]]
660
return $N
661
}else if(self.$object_dict.hasOwnProperty(hash)){
662
self.$object_dict[hash].push([key, [value, self.$version]])
664
self.$object_dict[hash] = [[key, [value, self.$version]]]
Sep 5, 2014
668
}
669
670
dict.__str__ = function(){
671
return dict.__repr__.apply(null, arguments)
672
}
Sep 5, 2014
673
674
// add "reflected" methods
Feb 11, 2018
675
$B.make_rmethods(dict)
Sep 5, 2014
676
Feb 11, 2018
677
dict.clear = function(){
Sep 5, 2014
678
// Remove all items from the dictionary.
Mar 7, 2018
679
var $ = $B.args("clear", 1, {self: null}, ["self"], arguments, {},
680
null, null),
681
self = $.self
683
self.$numeric_dict = {}
684
self.$string_dict = {}
685
self.$str_hash = {}
686
self.$object_dict = {}
688
if(self.$jsobj){
689
for(var attr in self.$jsobj){
Mar 7, 2018
690
if(attr.charAt(0) !== "$" && attr !== "__class__"){
691
delete self.$jsobj[attr]
692
}
693
}
694
}
Sep 5, 2014
697
}
698
Feb 11, 2018
699
dict.copy = function(self){
Sep 5, 2014
700
// Return a shallow copy of the dictionary
Mar 7, 2018
701
var $ = $B.args("copy", 1, {self: null},["self"], arguments,{},
702
null, null),
703
self = $.self,
Feb 11, 2018
704
res = _b_.dict.$factory()
Sep 5, 2014
706
return res
707
}
708
Feb 11, 2018
709
dict.fromkeys = function(){
Nov 21, 2015
710
Mar 7, 2018
711
var $ = $B.args("fromkeys", 3, {cls: null, keys: null, value: null},
712
["cls", "keys", "value"], arguments, {value: _b_.None}, null, null),
713
keys = $.keys,
714
value = $.value
Sep 5, 2014
716
// class method
717
var klass = $.cls,
Sep 5, 2014
721
while(1){
722
try{
723
var key = _b_.next(keys_iter)
724
if(klass === dict){dict.$setitem(res, key, value)}
725
else{$B.$getattr(res, "__setitem__")(key, value)}
Sep 5, 2014
726
}catch(err){
727
if($B.is_exc(err, [_b_.StopIteration])){
Sep 5, 2014
728
return res
729
}
730
throw err
731
}
732
}
733
}
734
Feb 11, 2018
735
dict.get = function(){
Mar 7, 2018
736
var $ = $B.args("get", 3, {self: null, key: null, _default: null},
737
["self", "key", "_default"], arguments, {_default: $N}, null, null)
Feb 11, 2018
739
try{return dict.__getitem__($.self, $.key)}
740
catch(err){
741
if(_b_.isinstance(err, _b_.KeyError)){return $._default}
742
else{throw err}
743
}
744
}
745
746
var dict_items = $B.make_view("dict_items", true)
747
dict_items.$iterator = $B.make_iterator_class("dict_itemiterator")
748
Feb 11, 2018
749
dict.items = function(self){
Mar 23, 2018
750
if(arguments.length > 1){
751
var _len = arguments.length - 1,
752
_msg = "items() takes no arguments (" + _len + " given)"
753
throw _b_.TypeError.$factory(_msg)
754
}
755
var it = dict_items.$factory(to_list(self))
756
it.len_func = function(){return dict.__len__(self)}
757
return it
758
}
759
760
var dict_keys = $B.make_view("dict_keys", true)
761
dict_keys.$iterator = $B.make_iterator_class("dict_keyiterator")
Nov 21, 2015
762
Mar 23, 2018
764
if(arguments.length > 1){
765
var _len = arguments.length - 1,
766
_msg = "keys() takes no arguments (" + _len + " given)"
767
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
768
}
769
var it = dict_keys.$factory(to_list(self, 0))
770
it.len_func = function(){return dict.__len__(self)}
771
return it
Nov 21, 2015
772
}
773
Feb 11, 2018
774
dict.pop = function(){
Nov 21, 2015
775
776
var missing = {},
777
$ = $B.args("pop", 3, {self: null, key: null, _default: null},
778
["self", "key", "_default"], arguments, {_default: missing}, null, null),
779
self = $.self,
780
key = $.key,
781
_default = $._default
Nov 21, 2015
782
Sep 5, 2014
783
try{
784
var res = dict.__getitem__(self, key)
785
dict.__delitem__(self, key)
Sep 5, 2014
786
return res
787
}catch(err){
788
if(err.__class__ === _b_.KeyError){
789
if(_default !== missing){return _default}
Sep 5, 2014
790
throw err
791
}
792
throw err
793
}
794
}
795
Feb 11, 2018
796
dict.popitem = function(self){
798
var itm = _b_.next(_b_.iter(dict.items(self)))
799
dict.__delitem__(self, itm[0])
Feb 11, 2018
800
return _b_.tuple.$factory(itm)
802
if (err.__class__ == _b_.StopIteration) {
803
throw KeyError.$factory("'popitem(): dictionary is empty'")
Sep 5, 2014
806
}
807
Feb 11, 2018
808
dict.setdefault = function(){
Nov 21, 2015
809
Mar 7, 2018
810
var $ = $B.args("setdefault", 3, {self: null, key: null, _default: null},
811
["self", "key", "_default"], arguments, {_default: $N}, null, null),
812
self = $.self,
813
key = $.key,
814
_default = $._default
Nov 21, 2015
815
816
try{return dict.__getitem__(self, key)}
Sep 5, 2014
817
catch(err){
818
if(err.__class__ !== _b_.KeyError){
819
throw err
820
}
821
if(_default === undefined){_default = $N}
822
var hash = key.$hash
823
key.$hash = undefined
824
dict.$setitem(self, key, _default, hash)
Sep 5, 2014
825
return _default
826
}
827
}
828
Feb 11, 2018
829
dict.update = function(self){
Nov 21, 2015
830
Mar 7, 2018
831
var $ = $B.args("update", 1, {"self": null}, ["self"], arguments,
832
{}, "args", "kw"),
833
self = $.self,
834
args = $.args,
835
kw = $.kw
836
if(args.length > 0){
837
var o = args[0]
838
if(isinstance(o, dict)){
839
if(o.$jsobj){
840
o = jsobj2dict(o.$jsobj)
841
}
844
var _keys = _b_.list.$factory($B.$call($B.$getattr(o, "keys"))())
845
for(var i = 0, len = _keys.length; i < len; i++){
846
var _value = getattr(o, "__getitem__")(_keys[i])
847
dict.$setitem(self, _keys[i], _value)
848
}
849
}else{
850
var it = _b_.iter(o),
851
i = 0
852
while(true){
853
try{
854
var item = _b_.next(it)
855
}catch(err){
856
if(err.__class__ === _b_.StopIteration){break}
857
throw err
858
}
859
try{
860
key_value = _b_.list.$factory(item)
861
}catch(err){
862
throw _b_.TypeError.$factory("cannot convert dictionary" +
863
" update sequence element #" + i + " to a sequence")
864
}
865
if(key_value.length !== 2){
866
throw _b_.ValueError.$factory("dictionary update " +
867
"sequence element #" + i + " has length " +
868
key_value.length + "; 2 is required")
869
}
870
dict.$setitem(self, key_value[0], key_value[1])
871
i++
Sep 5, 2014
874
}
Sep 5, 2014
878
}
879
880
var dict_values = $B.make_view("dict_values")
881
dict_values.$iterator = $B.make_iterator_class("dict_valueiterator")
Nov 21, 2015
882
Feb 11, 2018
883
dict.values = function(self){
Mar 23, 2018
884
if(arguments.length > 1){
885
var _len = arguments.length - 1,
886
_msg = "values() takes no arguments (" + _len + " given)"
887
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
888
}
889
var it = dict_values.$factory(to_list(self, 1))
890
it.len_func = function(){return dict.__len__(self)}
891
return it
Nov 21, 2015
892
}
893
894
dict.$factory = function(){
895
var res = dict.__new__(dict)
896
var args = [res]
897
for(var i = 0, len = arguments.length; i < len ; i++){
898
args.push(arguments[i])
899
}
900
dict.__init__.apply(null, args)
Sep 5, 2014
901
return res
902
}
Sep 5, 2014
904
_b_.dict = dict
Feb 11, 2018
906
$B.set_func_names(dict, "builtins")
908
// This must be done after set_func_names, otherwise dict.fromkeys doesn't
909
// have the attribute $infos
910
dict.fromkeys = _b_.classmethod.$factory(dict.fromkeys)
911
912
// Class for attribute __dict__ of classes
913
var mappingproxy = $B.mappingproxy = $B.make_class("mappingproxy",
Feb 12, 2018
914
function(obj){
915
if(_b_.isinstance(obj, dict)){
916
// obj is a dictionary, with $string_dict table such that
917
// obj.$string_dict[key] = [value, rank]
918
// Transform it into an object with attribute $jsobj such that
919
// res.$jsobj[key] = value
920
var res = $B.obj_dict(dict.$to_obj(obj))
921
}else{
922
var res = $B.obj_dict(obj)
923
}
Feb 12, 2018
924
res.__class__ = mappingproxy
925
return res
926
}
927
)
Feb 12, 2018
929
mappingproxy.__setitem__ = function(){
Mar 7, 2018
930
throw _b_.TypeError.$factory("'mappingproxy' object does not support " +
931
"item assignment")
934
for(var attr in dict){
935
if(mappingproxy[attr] !== undefined ||
936
["__class__", "__mro__", "__new__", "__init__", "__delitem__",
937
"clear", "fromkeys", "pop", "popitem", "setdefault",
938
"update"].indexOf(attr) > -1){
939
continue
940
}
941
if(typeof dict[attr] == "function"){
942
mappingproxy[attr] = (function(key){
943
return function(){
944
return dict[key].apply(null, arguments)
945
}
946
})(attr)
947
}else{
948
mappingproxy[attr] = dict[attr]
949
}
950
}
951
Feb 12, 2018
952
$B.set_func_names(mappingproxy, "builtins")
Feb 11, 2018
955
var d = dict.$factory()
Mar 7, 2018
957
if(attr.charAt(0) != "$" && attr !== "__class__"){
958
if(x[attr] === undefined){
959
continue
960
}else if(x[attr].$jsobj === x){
961
d.$string_dict[attr] = [d, d.$version]
963
d.$string_dict[attr] = [x[attr], d.$version]
965
d.$version++
971
$B.obj_dict = function(obj, from_js){
972
var klass = obj.__class__ || $B.get_class(obj)
973
if(klass !== undefined && klass.$native){
974
throw _b_.AttributeError.$factory(klass.__name__ +
975
" has no attribute '__dict__'")}
Feb 11, 2018
976
var res = dict.$factory()
977
res.$jsobj = obj
978
res.$from_js = from_js // set to true if
979
return res
980
}
981
Sep 5, 2014
982
})(__BRYTHON__)