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