Skip to content
Permalink
Newer
Older
100644 889 lines (789 sloc) 25.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
function to_list(d, ix){
22
var items = [],
23
item
25
if(d.$jsobj){
Mar 7, 2018
28
if(attr.charAt(0) != "$"){
29
var val = d.$jsobj[attr]
30
if(val === undefined){val = _b_.NotImplemented}
31
else if(val === null){val = $N}
35
}else{
36
for(var k in d.$numeric_dict){
37
items.push([parseFloat(k), d.$numeric_dict[k]])
38
}
40
for(var k in d.$string_dict){items.push([k, d.$string_dict[k]])}
42
for(var k in d.$object_dict){
43
d.$object_dict[k].forEach(function(item){
44
items.push(item)
45
})
46
}
49
if(ix !== undefined){
50
return items.map(function(item){return item[ix]})
51
}else{
52
items.__class__ = _b_.tuple
53
return items.map(function(item){
54
item.__class__ = _b_.tuple; return item}
55
)
56
}
Feb 9, 2015
58
59
$B.dict_to_list = to_list // used in py_types.js
60
61
// Special version of __next__ for iterators on dict keys / values / items.
62
// Checks that the dictionary size didn't change during iteration.
63
function dict_iterator_next(self){
64
if(self.len_func() != self.len){
65
throw RuntimeError.$factory("dictionary changed size during iteration")
66
}
67
self.counter++
68
if(self.counter < self.items.length){
69
return self.items[self.counter]
71
throw _b_.StopIteration.$factory("StopIteration")
75
var $copy_dict = function(left, right){
77
si = dict.$setitem
78
right.$version = right.$version || 0
79
var right_version = right.$version || 0
80
for(var i = 0, len = _l.length; i < len; i++){
81
si(left, _l[i][0], _l[i][1])
82
if(right.$version != right_version){
83
throw _b_.RuntimeError.$factory("dict mutated during update")
84
}
85
}
88
function rank(self, hash, key){
89
// Search if object key, with hash = hash(key), is in
90
// self.$object_dict
91
var pairs = self.$object_dict[hash]
92
if(pairs !== undefined){
93
for(var i = 0, len = pairs.length; i < len; i++){
94
if($B.rich_comp("__eq__", key, pairs[i][0])){
95
return i
96
}
97
}
98
}
99
return -1
100
}
101
Feb 11, 2018
102
dict.__bool__ = function () {
Mar 7, 2018
103
var $ = $B.args("__bool__", 1, {self: null}, ["self"],
104
arguments, {}, null, null)
Feb 11, 2018
105
return dict.__len__($.self) > 0
Feb 11, 2018
108
dict.__contains__ = function(){
Nov 21, 2015
109
110
var $ = $B.args("__contains__", 2, {self: null, key: null},
111
["self", "key"], arguments, {}, null, null),
112
self = $.self,
115
if(self.$jsobj){return self.$jsobj[key] !== undefined}
117
switch(typeof key) {
119
return self.$string_dict[key] !== undefined
121
return self.$numeric_dict[key] !== undefined
122
}
123
124
var hash = _b_.hash(key)
125
if(self.$str_hash[hash] !== undefined &&
126
$B.rich_comp("__eq__", key, self.$str_hash[hash])){return true}
127
if(self.$numeric_dict[hash] !== undefined &&
128
$B.rich_comp("__eq__", key, hash)){return true}
129
return rank(self, hash, key) > -1
Sep 5, 2014
130
}
131
Feb 11, 2018
132
dict.__delitem__ = function(){
Nov 21, 2015
133
134
var $ = $B.args("__eq__", 2, {self: null, arg: null},
135
["self", "arg"], arguments, {}, null, null),
136
self = $.self,
Nov 21, 2015
138
139
if(self.$jsobj){
140
if(self.$jsobj[arg] === undefined){throw KeyError.$factory(arg)}
141
delete self.$jsobj[arg]
144
switch(typeof arg){
145
case "string":
146
if(self.$string_dict[arg] === undefined){
147
throw KeyError.$factory(_b_.str.$factory(arg))
148
}
149
delete self.$string_dict[arg]
150
delete self.$str_hash[str_hash(arg)]
152
return $N
153
case "number":
154
if(self.$numeric_dict[arg] === undefined){
155
throw KeyError.$factory(_b_.str.$factory(arg))
157
delete self.$numeric_dict[arg]
161
// go with defaults
162
163
var hash = _b_.hash(arg),
164
ix
166
if((ix = rank(self, hash, arg)) > -1){
167
self.$object_dict[hash].splice(ix, 1)
168
}else{
169
throw KeyError.$factory(_b_.str.$factory(arg))
Sep 5, 2014
174
}
175
Feb 11, 2018
176
dict.__eq__ = function(){
Mar 7, 2018
177
var $ = $B.args("__eq__", 2, {self: null, other: null},
178
["self", "other"], arguments, {}, null, null),
179
self = $.self,
180
other = $.other
Mar 7, 2018
182
if(! isinstance(other, dict)){return false}
184
if(self.$jsobj){self = jsobj2dict(self.$jsobj)}
185
if(other.$jsobj){other = jsobj2dict(other.$jsobj)}
186
if(dict.__len__(self) != dict.__len__(other)){
187
return false
188
}
190
if(self.$string_dict.length != other.$string_dict.length){
194
for(var k in self.$numeric_dict){
195
if(other.$numeric_dict.hasOwnProperty(k)){
196
if(!$B.rich_comp("__eq__", other.$numeric_dict[k],
197
self.$numeric_dict[k])){
198
return false
199
}
200
}else if(other.$object_dict.hasOwnProperty(k)){
201
var pairs = other.$object_dict[k],
202
flag = false
203
for(var i = 0, len = pairs.length; i < len; i++){
204
if($B.rich_comp("__eq__", k, pairs[i][0]) &&
205
$B.rich_comp("__eq__", self.$numeric_dict[k],
206
pairs[i][1])){
207
flag = true
208
break
209
}
211
if(! flag){return false}
Nov 21, 2015
214
}
215
}
216
for(var k in self.$string_dict){
217
if(!other.$string_dict.hasOwnProperty(k) ||
218
!$B.rich_comp("__eq__", other.$string_dict[k],
219
self.$string_dict[k])){
220
return false
Nov 21, 2015
221
}
222
}
223
for(var hash in self.$object_dict){
224
var pairs = self.$object_dict[hash]
225
// Get all (key, value) pairs in other that have the same hash
226
var other_pairs = []
227
if(other.$numeric_dict[hash] !== undefined){
228
other_pairs.push([hash, other.$numeric_dict[hash]])
229
}
230
if(other.$object_dict[hash] !== undefined){
231
other_pairs = other_pairs.concat(other.$object_dict[hash])
232
}
233
if(other_pairs.length == 0){
234
return false
235
}
236
for(var i = 0, len_i = pairs.length; i < len_i; i++){
237
var flag = false
238
var key = pairs[i][0],
239
value = pairs[i][1]
240
for(var j = 0, len_j = other_pairs.length; j < len_j; j++){
241
if($B.rich_comp("__eq__", key, other_pairs[j][0]) &&
242
$B.rich_comp("__eq__", value, other_pairs[j][1])){
243
flag = true
244
break
250
}
251
}
252
return true
Sep 5, 2014
253
}
254
Feb 11, 2018
255
dict.__getitem__ = function(){
256
var $ = $B.args("__getitem__", 2, {self: null, arg: null},
257
["self", "arg"], arguments, {}, null, null),
258
self = $.self,
260
if(self.$jsobj){
261
if(!self.$jsobj.hasOwnProperty(arg)){
262
throw _b_.KeyError.$factory(str.$factory(arg))
263
}else if(self.$jsobj[arg] === undefined){
264
return _b_.NotImplemented
265
}else if(self.$jsobj[arg] === null){return $N}
266
return self.$jsobj[arg]
268
269
switch(typeof arg){
270
case "string":
271
if(self.$string_dict[arg] !== undefined){
272
return self.$string_dict[arg]
274
break
275
case "number":
276
if(self.$numeric_dict[arg] !== undefined){
277
return self.$numeric_dict[arg]
279
break
280
}
281
282
// since the key is more complex use 'default' method of getting item
283
284
var hash = _b_.hash(arg),
285
_eq = function(other){return $B.rich_comp("__eq__", arg, other)}
286
287
arg.$hash = hash // cache for setdefault
288
var sk = self.$str_hash[hash]
289
if(sk !== undefined && _eq(sk)){
290
return self.$string_dict[sk]
291
}
292
if(self.$numeric_dict[hash] !== undefined && _eq(hash)){
293
return self.$numeric_dict[hash]
294
}
295
if(isinstance(arg, _b_.str)){
296
// string subclass
297
var res = self.$string_dict[arg.valueOf()]
298
if(res !== undefined){return res}
299
}
300
301
var ix = rank(self, hash, arg)
302
if(ix > -1){
303
return self.$object_dict[hash][ix][1]
306
if(self.__class__ !== dict){
308
var missing_method = getattr(self.__class__, "__missing__",
309
_b_.None)
310
}catch(err){
311
console.log(err)
312
313
}
314
if(missing_method !== _b_.None){
315
return missing_method(self, arg)
Sep 5, 2014
319
}
320
321
dict.__hash__ = _b_.None
Sep 5, 2014
322
323
function init_from_list(self, args){
324
var i = -1,
325
stop = args.length - 1,
326
si = dict.__setitem__
327
while(i++ < stop){
328
var item = args[i]
329
switch(typeof item[0]) {
330
case 'string':
331
self.$string_dict[item[0]] = item[1]
332
self.$str_hash[str_hash(item[0])] = item[0]
333
break
334
case 'number':
335
self.$numeric_dict[item[0]] = item[1]
336
break
337
default:
338
si(self, item[0], item[1])
339
break
340
}
341
}
342
}
343
344
dict.__init__ = function(self, first, second){
346
if(first === undefined){return $N}
347
if(second === undefined){
348
if(first.__class__ === $B.JSObject){
349
self.$jsobj = first.js
350
return $N
351
}else if(first.$jsobj){
352
self.$jsobj = {}
353
for(var attr in first.$jsobj){
354
self.$jsobj[attr] = first.$jsobj[attr]
357
}else if(Array.isArray(first)){
358
init_from_list(self, first)
359
return $N
Sep 5, 2014
360
}
363
$ = $ || $B.args("dict", 1, {self:null}, ["self"],
364
arguments, {}, "first", "second")
365
var args = $.first
366
if(args.length > 1){
367
throw _b_.TypeError.$factory("dict expected at most 1 argument" +
368
", got 2")
369
}else if(args.length == 1){
370
args = args[0]
371
if(args.__class__ === dict){
372
['$string_dict', '$str_hash', '$numeric_dict', '$object_dict'].
373
forEach(function(d){
374
for(key in args[d]){self[d][key] = args[d][key]}
375
})
376
}else if(isinstance(args, dict)){
377
$copy_dict(self, args)
379
var keys = $B.$getattr(args, "keys", null)
380
if(keys !== null){
381
var gi = $B.$getattr(args, "__getitem__", null)
382
if(gi !== null){
383
// has keys and __getitem__ : it's a mapping, iterate on
384
// keys and values
385
gi = $B.$call(gi)
386
var kiter = _b_.iter($B.$call(keys)())
387
while(true){
388
try{
389
var key = _b_.next(kiter),
390
value = gi(key)
391
dict.__setitem__(self, key, value)
392
}catch(err){
393
if(err.__class__ === _b_.StopIteration){
394
break
395
}
396
throw err
397
}
398
}
399
return $N
400
}
401
}
402
if(! Array.isArray(args)){
403
args = _b_.list.$factory(args)
404
}
405
// Form "dict([[key1, value1], [key2,value2], ...])"
406
init_from_list(self, args)
Sep 5, 2014
407
}
409
var kw = $.second.$string_dict
410
for(var attr in kw){
411
switch(typeof attr){
412
case "string":
413
self.$string_dict[attr] = kw[attr]
414
self.$str_hash[str_hash(attr)] = attr
415
break
416
case "number":
417
self.$numeric_dict[attr] = kw[attr]
418
break
419
default:
420
si(self, attr, kw[attr])
421
break
422
}
Sep 5, 2014
425
}
426
Feb 11, 2018
427
dict.__iter__ = function(self) {
Sep 5, 2014
429
}
430
Feb 11, 2018
431
dict.__len__ = function(self) {
434
if(self.$jsobj){
Mar 7, 2018
435
for(var attr in self.$jsobj){if(attr.charAt(0) != "$"){_count++}}
436
return _count
437
}
439
for(var k in self.$numeric_dict){_count++}
440
for(var k in self.$string_dict){_count++}
441
for(var hash in self.$object_dict){
442
_count += self.$object_dict[hash].length
443
}
Sep 5, 2014
447
Mar 7, 2018
448
dict.__ne__ = function(self, other){return ! dict.__eq__(self, other)}
Sep 5, 2014
449
Feb 11, 2018
450
dict.__new__ = function(cls){
451
if(cls === undefined){
Mar 7, 2018
452
throw _b_.TypeError.$factory("int.__new__(): not enough arguments")
454
var instance = {
456
$numeric_dict : {},
457
$object_dict : {},
459
$str_hash: {},
460
$version: 0
462
if(cls !== dict){
463
instance.__dict__ = _b_.dict.$factory()
464
}
465
return instance
Feb 11, 2018
468
dict.__repr__ = function(self){
469
if(self.$jsobj){ // wrapper around Javascript object
Feb 11, 2018
470
return dict.__repr__(jsobj2dict(self.$jsobj))
472
var res = [],
474
items.forEach(function(item){
475
if((!self.$jsobj && item[1] === self) ||
476
(self.$jsobj && item[1] === self.$jsobj)){
Mar 7, 2018
477
res.push(repr(item[0]) + ": {...}")
479
res.push(repr(item[0]) + ": " + repr(item[1]))
Mar 7, 2018
482
return "{" + res.join(", ") + "}"
Sep 5, 2014
483
}
484
485
dict.__setitem__ = function(self, key, value){
Mar 7, 2018
486
var $ = $B.args("__setitem__", 3, {self: null, key: null, value: null},
487
["self", "key", "value"], arguments, {}, null, null)
488
return dict.$setitem($.self, $.key, $.value)
489
}
Nov 21, 2015
490
491
dict.$setitem = function(self, key, value, $hash){
492
// Parameter $hash is only set if this method is called by setdefault.
493
// In this case the hash of key has already been computed and we
494
// know that the key is not present in the dictionary, so it's no
495
// use computing hash(key) again, nor testing equality of keys
497
if(self.$from_js){
498
// dictionary created by method to_dict of JSObject instances
499
value = $B.pyobj2jsobj(value)
500
}
501
if(self.$jsobj.__class__ === _b_.type){
502
self.$jsobj[key] = value
503
if(key == "__init__" || key == "__new__"){
504
// If class attribute __init__ or __new__ are reset,
505
// the factory function has to change
506
self.$jsobj.$factory = $B.$instance_creator(self.$jsobj)
507
}
508
}else{
509
self.$jsobj[key] = value
514
switch(typeof key){
515
case "string":
516
self.$string_dict[key] = value
517
self.$str_hash[str_hash(key)] = key
519
return $N
520
case "number":
521
self.$numeric_dict[key] = value
523
return $N
526
// if we got here the key is more complex, use default method
527
528
var hash = $hash === undefined ? _b_.hash(key) : $hash,
529
_eq = function(other){return $B.rich_comp("__eq__", key, other)}
530
531
if(self.$numeric_dict[hash] !== undefined && _eq(hash)){
532
self.$numeric_dict[hash] = value
536
var sk = self.$str_hash[hash]
537
if(sk !== undefined && _eq(sk)){
538
self.$string_dict[sk] = value
543
// If $setitem is called from setdefault, don't test equality of key
544
// with any object
545
if($hash){
546
if(self.$object_dict[$hash] !== undefined){
547
self.$object_dict[$hash].push([key, value])
548
}else{
549
self.$object_dict[$hash] = [[key, value]]
550
}
551
self.$version++
552
return $N
553
}
554
var ix = rank(self, hash, key)
555
if(ix > -1){
556
// reset value
557
self.$object_dict[hash][ix][1] = value
558
return $N
559
}else if(self.$object_dict.hasOwnProperty(hash)){
560
self.$object_dict[hash].push([key, value])
561
}else{
562
self.$object_dict[hash] = [[key, value]]
Sep 5, 2014
566
}
567
568
dict.__str__ = function(){return dict.__repr__.apply(null, arguments)}
Sep 5, 2014
569
570
// add "reflected" methods
Feb 11, 2018
571
$B.make_rmethods(dict)
Sep 5, 2014
572
Feb 11, 2018
573
dict.clear = function(){
Sep 5, 2014
574
// Remove all items from the dictionary.
Mar 7, 2018
575
var $ = $B.args("clear", 1, {self: null}, ["self"], arguments, {},
576
null, null),
577
self = $.self
579
self.$numeric_dict = {}
580
self.$string_dict = {}
581
self.$str_hash = {}
582
self.$object_dict = {}
584
if(self.$jsobj){
585
for(var attr in self.$jsobj){
Mar 7, 2018
586
if(attr.charAt(0) !== "$" && attr !== "__class__"){
587
delete self.$jsobj[attr]
588
}
589
}
590
}
Sep 5, 2014
593
}
594
Feb 11, 2018
595
dict.copy = function(self){
Sep 5, 2014
596
// Return a shallow copy of the dictionary
Mar 7, 2018
597
var $ = $B.args("copy", 1, {self: null},["self"], arguments,{},
598
null, null),
599
self = $.self,
Feb 11, 2018
600
res = _b_.dict.$factory()
Sep 5, 2014
602
return res
603
}
604
Feb 11, 2018
605
dict.fromkeys = function(){
Nov 21, 2015
606
Mar 7, 2018
607
var $ = $B.args("fromkeys", 3, {cls: null, keys: null, value: null},
608
["cls", "keys", "value"], arguments, {value: _b_.None}, null, null),
609
keys = $.keys,
610
value = $.value
Sep 5, 2014
612
// class method
613
var klass = $.cls,
Sep 5, 2014
617
while(1){
618
try{
619
var key = _b_.next(keys_iter)
620
if(klass === dict){dict.$setitem(res, key, value)}
621
else{$B.$getattr(res, "__setitem__")(key, value)}
Sep 5, 2014
622
}catch(err){
623
if($B.is_exc(err, [_b_.StopIteration])){
Sep 5, 2014
624
return res
625
}
626
throw err
627
}
628
}
629
}
630
Feb 11, 2018
631
dict.get = function(){
Mar 7, 2018
632
var $ = $B.args("get", 3, {self: null, key: null, _default: null},
633
["self", "key", "_default"], arguments, {_default: $N}, null, null)
Feb 11, 2018
635
try{return dict.__getitem__($.self, $.key)}
636
catch(err){
637
if(_b_.isinstance(err, _b_.KeyError)){return $._default}
638
else{throw err}
639
}
640
}
641
642
var dict_items = $B.make_iterator_class("dict_items")
643
644
dict_items.__eq__ = function(self, other){
645
// compare set of items to other
646
return $B.rich_comp("__eq__", _b_.set.$factory(self),
647
_b_.set.$factory(other))
648
}
649
650
dict_items.__next__ = dict_iterator_next
651
Feb 11, 2018
652
dict.items = function(self){
Mar 23, 2018
653
if(arguments.length > 1){
654
var _len = arguments.length - 1,
655
_msg = "items() takes no arguments (" + _len + " given)"
656
throw _b_.TypeError.$factory(_msg)
657
}
658
var it = dict_items.$factory(to_list(self))
659
it.len_func = function(){return dict.__len__(self)}
660
return it
661
}
662
663
var dict_keys = $B.make_iterator_class("dict_keys")
664
665
dict_keys.__eq__ = function(self, other){
666
// compare set of items to other
667
return $B.rich_comp("__eq__", _b_.set.$factory(self),
668
_b_.set.$factory(other))
669
}
670
671
dict_keys.__next__ = dict_iterator_next
Nov 21, 2015
672
Mar 23, 2018
674
if(arguments.length > 1){
675
var _len = arguments.length - 1,
676
_msg = "keys() takes no arguments (" + _len + " given)"
677
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
678
}
679
var it = dict_keys.$factory(to_list(self, 0))
680
it.len_func = function(){return dict.__len__(self)}
681
return it
Nov 21, 2015
682
}
683
Feb 11, 2018
684
dict.pop = function(){
Nov 21, 2015
685
686
var missing = {},
687
$ = $B.args("pop", 3, {self: null, key: null, _default: null},
688
["self", "key", "_default"], arguments, {_default: missing}, null, null),
689
self = $.self,
690
key = $.key,
691
_default = $._default
Nov 21, 2015
692
Sep 5, 2014
693
try{
694
var res = dict.__getitem__(self, key)
695
dict.__delitem__(self, key)
Sep 5, 2014
696
return res
697
}catch(err){
698
if(err.__class__ === _b_.KeyError){
699
if(_default !== missing){return _default}
Sep 5, 2014
700
throw err
701
}
702
throw err
703
}
704
}
705
Feb 11, 2018
706
dict.popitem = function(self){
708
var itm = _b_.next(dict.items(self))
709
dict.__delitem__(self, itm[0])
Feb 11, 2018
710
return _b_.tuple.$factory(itm)
712
if (err.__class__ == _b_.StopIteration) {
713
throw KeyError.$factory("'popitem(): dictionary is empty'")
Sep 5, 2014
716
}
717
Feb 11, 2018
718
dict.setdefault = function(){
Nov 21, 2015
719
Mar 7, 2018
720
var $ = $B.args("setdefault", 3, {self: null, key: null, _default: null},
721
["self", "key", "_default"], arguments, {_default: $N}, null, null),
722
self = $.self,
723
key = $.key,
724
_default = $._default
Nov 21, 2015
725
726
try{return dict.__getitem__(self, key)}
Sep 5, 2014
727
catch(err){
728
if(err.__class__ !== _b_.KeyError){
729
throw err
730
}
731
if(_default === undefined){_default = $N}
732
var hash = key.$hash
733
key.$hash = undefined
734
dict.$setitem(self, key, _default, hash)
Sep 5, 2014
735
return _default
736
}
737
}
738
Feb 11, 2018
739
dict.update = function(self){
Nov 21, 2015
740
Mar 7, 2018
741
var $ = $B.args("update", 1, {"self": null}, ["self"], arguments,
742
{}, "args", "kw"),
743
self = $.self,
744
args = $.args,
745
kw = $.kw
746
if(args.length > 0){
747
var o = args[0]
748
if(isinstance(o, dict)){
749
if(o.$jsobj){
750
o = jsobj2dict(o.$jsobj)
751
}
754
var _keys = _b_.list.$factory($B.$call($B.$getattr(o, "keys"))())
755
for(var i = 0, len = _keys.length; i < len; i++){
756
var _value = getattr(o, "__getitem__")(_keys[i])
757
dict.$setitem(self, _keys[i], _value)
758
}
759
}else{
760
var it = _b_.iter(o),
761
i = 0
762
while(true){
763
try{
764
var item = _b_.next(it)
765
}catch(err){
766
if(err.__class__ === _b_.StopIteration){break}
767
throw err
768
}
769
try{
770
key_value = _b_.list.$factory(item)
771
}catch(err){
772
throw _b_.TypeError.$factory("cannot convert dictionary" +
773
" update sequence element #" + i + " to a sequence")
774
}
775
if(key_value.length !== 2){
776
throw _b_.ValueError.$factory("dictionary update " +
777
"sequence element #" + i + " has length " +
778
key_value.length + "; 2 is required")
779
}
780
dict.$setitem(self, key_value[0], key_value[1])
781
i++
Sep 5, 2014
784
}
Sep 5, 2014
788
}
789
790
var dict_values = $B.make_iterator_class("dict_values")
791
792
dict_values.__next__ = dict_iterator_next
Nov 21, 2015
793
Feb 11, 2018
794
dict.values = function(self){
Mar 23, 2018
795
if(arguments.length > 1){
796
var _len = arguments.length - 1,
797
_msg = "values() takes no arguments (" + _len + " given)"
798
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
799
}
800
var it = dict_values.$factory(to_list(self, 1))
801
it.len_func = function(){return dict.__len__(self)}
802
return it
Nov 21, 2015
803
}
804
805
dict.$factory = function(){
806
var res = dict.__new__(dict)
807
var args = [res]
808
for(var i = 0, len = arguments.length; i < len ; i++){
809
args.push(arguments[i])
810
}
811
dict.__init__.apply(null, args)
Sep 5, 2014
812
return res
813
}
Sep 5, 2014
815
_b_.dict = dict
Feb 11, 2018
817
$B.set_func_names(dict, "builtins")
819
// This must be done after set_func_names, otherwise dict.fromkeys doesn't
820
// have the attribute $infos
821
dict.fromkeys = _b_.classmethod.$factory(dict.fromkeys)
822
823
// Class for attribute __dict__ of classes
824
var mappingproxy = $B.mappingproxy = $B.make_class("mappingproxy",
Feb 12, 2018
825
function(obj){
826
if(_b_.isinstance(obj, dict)){
827
// Should be a dictionary
828
var res = $B.obj_dict(obj.$string_dict)
829
}else{
830
var res = $B.obj_dict(obj)
831
}
Feb 12, 2018
832
res.__class__ = mappingproxy
833
return res
834
}
835
)
Feb 12, 2018
837
mappingproxy.__setitem__ = function(){
Mar 7, 2018
838
throw _b_.TypeError.$factory("'mappingproxy' object does not support " +
839
"item assignment")
842
for(var attr in dict){
843
if(mappingproxy[attr] !== undefined ||
844
["__class__", "__mro__", "__new__", "__init__", "__delitem__",
845
"clear", "fromkeys", "pop", "popitem", "setdefault",
846
"update"].indexOf(attr) > -1){
847
continue
848
}
849
if(typeof dict[attr] == "function"){
850
mappingproxy[attr] = (function(key){
851
return function(){
852
return dict[key].apply(null, arguments)
853
}
854
})(attr)
855
}else{
856
mappingproxy[attr] = dict[attr]
857
}
858
}
859
Feb 12, 2018
860
$B.set_func_names(mappingproxy, "builtins")
Feb 11, 2018
863
var d = dict.$factory()
Mar 7, 2018
865
if(attr.charAt(0) != "$" && attr !== "__class__"){
866
if(x[attr] === undefined){
867
continue
868
}else if(x[attr].$jsobj === x){
869
d.$string_dict[attr] = d
870
}else{
871
d.$string_dict[attr] = x[attr]
872
}
878
$B.obj_dict = function(obj, from_js){
879
var klass = obj.__class__ || $B.get_class(obj)
880
if(klass !== undefined && klass.$native){
881
throw _b_.AttributeError.$factory(klass.__name__ +
882
" has no attribute '__dict__'")}
Feb 11, 2018
883
var res = dict.$factory()
884
res.$jsobj = obj
885
res.$from_js = from_js // set to true if created by JSObject.to_dict()
886
return res
887
}
888
Sep 5, 2014
889
})(__BRYTHON__)