Skip to content
Permalink
Newer
Older
100644 876 lines (789 sloc) 25.1 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
this.items = []
51
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
if(d.$str_keys){
64
for(var key in d.$string_dict){
65
this.items.push([key, d.$string_dict[key]])
66
}
67
}else{
68
this.items = d.$items
Feb 9, 2015
71
72
$item_generator.prototype.next = function() {
Mar 23, 2018
73
if(this.i < this.items.length){
74
return this.items[this.i++]
76
throw _b_.StopIteration.$factory("StopIteration")
77
}
78
$item_generator.prototype.as_list = function() {
79
return this.items
80
}
81
82
var $item_iterator = function(d) {
83
this.d = d
84
this.current = 0
85
this.iter = new $item_generator(d)
86
}
87
$item_iterator.prototype.length = function(){return this.iter.items.length}
88
$item_iterator.prototype.next = function(){
89
return _b_.tuple.$factory(this.iter.next())
90
}
92
var $copy_dict = function(left, right){
93
var _l = new $item_generator(right).as_list(),
94
si = dict.$setitem,
95
i = _l.length
96
while(i--){si(left, _l[i][0], _l[i][1])}
99
function toSet(items){
100
// Build a set from the iteration on items
101
var res = []
102
while(true){
103
try{res.push(items.next())}
104
catch(err){break}
105
}
Feb 11, 2018
106
return _b_.set.$factory(res)
107
}
108
109
var $iterator_wrapper = function(items, klass){
111
$items: items,
112
__class__: klass,
113
__eq__: function(other){
114
// compare set of items to other
115
return $B.rich_comp("__eq__", toSet(items), other)
117
__iter__: function(){items.iter.i = 0; return res},
118
__len__: function(){return items.length()},
119
__next__: function(){
122
__repr__:function(){
123
var s = []
124
for(var i = 0, len = items.length(); i < len; i++){
125
s.push(_b_.repr(items.next()))
126
}
Mar 7, 2018
127
return klass.__name__ + "(["+ s.join(",") + "])"
129
}
130
res.__str__ = res.toString = res.__repr__
131
klass.__reduce_ex__ = klass.__reduce__ = function(self){
132
return _b_.tuple.$factory([_b_.iter,
133
_b_.tuple.$factory([_b_.list.$factory(self)])])
134
}
138
function object_equals_string(self, hash, key){
139
// Is key hash equal to the hash of one of the string keys ?
140
for(var s in self.$string_dict){
141
if(_b_.hash(s) == hash){
142
// Does the key compare equal to the string ?
143
if($B.rich_comp("__eq__", s, key)){
144
return s
145
}
146
}
147
}
148
return $N
149
}
150
Feb 11, 2018
151
dict.__bool__ = function () {
Mar 7, 2018
152
var $ = $B.args("__bool__", 1, {self: null}, ["self"],
153
arguments, {}, null, null)
Feb 11, 2018
154
return dict.__len__($.self) > 0
Feb 11, 2018
157
dict.__contains__ = function(){
Nov 21, 2015
158
159
var $ = $B.args("__contains__", 2, {self: null, key: null},
160
["self", "key"], arguments, {}, null, null),
161
self = $.self,
162
key = $.key,
163
hash
164
165
if(self.$jsobj){return self.$jsobj[key] !== undefined}
166
167
if(self.$str_keys){
168
if(typeof key == "string"){
169
return self.$string_dict.hasOwnProperty(key)
170
}else{
171
hash = _b_.hash(key)
172
if(object_equals_string(self, hash, key) !== $N){
173
return true
174
}
175
}
176
}
177
var hash = hash === undefined ? _b_.hash(key) : hash,
178
items = self.$hash[hash]
179
if(items !== undefined){
180
for(var i = 0, len = items.length; i < len; i++){
181
var rank = items[i]
182
if(self.$items[rank] === undefined){
183
console.log("self", self, "key", key, "hash", hash,
184
"items", items, "rank", rank)
185
alert("oups")
186
}
187
if($B.rich_comp("__eq__", key, self.$items[rank][0])){
188
return true
189
}
190
}
191
}
192
return false
Sep 5, 2014
193
}
194
195
function check_string_keys(self){
196
// If all remaining keys are string, reset $str_keys
197
var all_strings = true
198
for(var k = 0, lenk = self.$items.length; k < lenk; k++){
199
if(! (typeof self.$items[k][0] == "string")){
200
all_strings = false
201
break
202
}else{
203
self.$string_dict[self.$items[k][0]] =
204
self.$items[k][1]
205
}
206
}
207
if(all_strings){
208
self.$hash = {}
209
self.$items = []
210
self.$str_keys = true
211
}else{
212
self.$string_dict = {}
213
}
214
return self
215
}
216
Feb 11, 2018
217
dict.__delitem__ = function(){
Nov 21, 2015
218
219
var $ = $B.args("__eq__", 2, {self: null, key: null},
220
["self", "key"], arguments, {}, null, null),
221
self = $.self,
222
key = $.key
Nov 21, 2015
223
224
if(self.$jsobj){
225
if(self.$jsobj[key] === undefined){throw KeyError.$factory(key)}
226
delete self.$jsobj[key]
229
230
if(self.$str_keys){
231
if(self.$string_dict.hasOwnProperty(key)){
232
delete self.$string_dict[key]
233
return $N
234
}
235
}else{
236
var hash = _b_.hash(key),
237
items = self.$hash[hash]
238
if(items !== undefined){
239
for(var i = 0, len = items.length; i < len; i++){
240
var rank = items[i]
241
if($B.rich_comp("__eq__", key, self.$items[rank][0])){
242
self.$items.splice(rank, 1)
243
items.splice(i, 1)
244
if(items.length == 0){
245
delete self.$hash[hash]
246
}
247
// If all remaining keys are string, reset $str_keys
248
self = check_string_keys(self)
249
if(!self.$str_keys){
250
self.$string_dict = {}
251
// decrease all indices > rank
252
for(var hash in self.$hash){
253
for(var j = 0, lenj = self.$hash[hash].length;
254
j < lenj; j++){
255
if(self.$hash[hash][j] > rank){
256
self.$hash[hash][j] -= 1
257
}
258
}
259
}
260
}
261
return $N
262
}
264
}
266
throw KeyError.$factory(_b_.str.$factory(arg))
Sep 5, 2014
267
}
268
Feb 11, 2018
269
dict.__eq__ = function(){
Mar 7, 2018
270
var $ = $B.args("__eq__", 2, {self: null, other: null},
271
["self", "other"], arguments, {}, null, null),
272
self = $.self,
273
other = $.other
Mar 7, 2018
274
if(! isinstance(other, dict)){return false}
276
if(self.$jsobj){self = jsobj2dict(self.$jsobj)}
277
if(other.$jsobj){other = jsobj2dict(other.$jsobj)}
279
if(dict.__len__(self) != dict.__len__(other)){return false}
280
//if(self.$str_keys != other.$str_keys){return false}
282
if(self.$str_keys){
283
for(var s in self.$string_dict){
284
if(! $B.rich_comp("__eq__", self.$string_dict[s],
285
other.$string_dict[s])){
286
return false
287
}
Nov 21, 2015
288
}
289
return true
290
}else{
291
for(var hash in self.$hash){
292
var ranks = self.$hash[hash]
293
if(! other.$hash.hasOwnProperty(hash)){
294
return false
295
}else if(other.$hash[hash].length !== ranks.length){
296
return false
297
}else{
298
for(var i = 0, leni = ranks.length; i < leni; i++){
299
var item1 = self.$items[ranks[i]],
300
flag = false
301
for(var j = 0, lenj = other.$hash[hash].length; j < lenj;
302
j++){
303
var item2 = other.$items[other.$hash[hash][j]]
304
if($B.rich_comp("__eq__", item1[0], item2[0]) &&
305
$B.rich_comp("__eq__", item1[1], item2[1])){
306
flag = true
307
break
308
}
309
}
310
if(! flag){return false}
311
}
312
}
Nov 21, 2015
313
}
314
return true
Nov 21, 2015
315
}
Sep 5, 2014
316
}
317
Feb 11, 2018
318
dict.__getitem__ = function(){
319
var $ = $B.args("__getitem__", 2, {self: null, key: null},
320
["self", "key"], arguments, {}, null, null),
321
self = $.self,
322
key = $.key,
323
hash
324
if(self.$jsobj){
325
if(!self.$jsobj.hasOwnProperty(key)){
326
throw _b_.KeyError.$factory(str.$factory(key))
327
}else if(self.$jsobj[key] === undefined){
328
return _b_.NotImplemented
329
}else if(self.$jsobj[key] === null){return $N}
330
return self.$jsobj[key]
332
if(self.$str_keys){
333
if(typeof key == "string"){
334
var res = self.$string_dict[key]
335
if(res !== undefined){return res}
336
}else{
337
var hash = _b_.hash(key),
338
s = object_equals_string(self, hash, key)
339
if(s !== $N){
340
return self.$string_dict[s]
342
}
343
}else{
344
var hash = _b_.hash(key),
345
items = self.$hash[hash]
346
if(items !== undefined){
347
for(var i = 0, len = items.length; i < len; i++){
348
var rank = items[i]
349
if($B.rich_comp("__eq__", key, self.$items[rank][0])){
350
return self.$items[rank][1]
351
}
353
}
355
if(self.__class__ !== dict){
Mar 7, 2018
357
var missing_method = getattr(self.__class__, "__missing__")
358
return missing_method(self, key)
361
throw KeyError.$factory(_b_.str.$factory(key))
Sep 5, 2014
362
}
363
Feb 11, 2018
364
dict.__hash__ = None
Sep 5, 2014
365
366
function init_from_list(self, args){
367
var i = -1,
368
stop = args.length - 1,
369
si = dict.$setitem
370
while(i++ < stop){
371
var item = args[i]
372
si(self, item[0], item[1])
373
}
374
}
375
376
dict.__init__ = function(self, first, second){
378
if(first === undefined){return $N}
379
if(second === undefined){
380
if(first.__class__ === $B.JSObject){
381
self.$jsobj = first.js
382
return $N
383
}else if(first.$jsobj){
384
self.$jsobj = {}
385
for(var attr in first.$jsobj){
386
self.$jsobj[attr] = first.$jsobj[attr]
389
}else if(Array.isArray(first)){
390
init_from_list(self, first)
391
return $N
Sep 5, 2014
392
}
395
$ = $ || $B.args("dict", 1, {self:null}, ["self"],
396
arguments, {}, "first", "second")
397
var args = $.first
398
if(args.length > 1){
399
throw _b_.TypeError.$factory("dict expected at most 1 argument" +
400
", got 2")
401
}else if(args.length == 1){
402
args = args[0]
403
if(args.__class__ === dict){
404
self.$str_keys = args.$str_keys
405
if(args.$str_keys){
406
for(var key in args.$string_dict){
407
self.$string_dict[key] = args.$string_dict[key]
408
}
409
}else{
410
self.$items = args.$items.slice()
411
for(var hash in args.$hash){
412
self.$hash[hash] = args.$hash[hash]
413
}
414
}
415
}else if(isinstance(args, dict)){
416
$copy_dict(self, args)
418
var keys = $B.$getattr(args, "keys", null)
419
if(keys !== null){
420
var gi = $B.$getattr(args, "__getitem__", null)
421
if(gi !== null){
422
// has keys and __getitem__ : it's a mapping, iterate on
423
// keys and values
424
gi = $B.$call(gi)
425
var kiter = _b_.iter($B.$call(keys)())
426
while(true){
427
try{
428
var key = _b_.next(kiter),
429
value = gi(key)
430
dict.__setitem__(self, key, value)
431
}catch(err){
432
if(err.__class__ === _b_.StopIteration){
433
break
434
}
435
throw err
436
}
437
}
438
return $N
439
}
440
}
441
if(! Array.isArray(args)){
442
args = _b_.list.$factory(args)
443
}
444
// Form "dict([[key1, value1], [key2,value2], ...])"
445
init_from_list(self, args)
Sep 5, 2014
446
}
448
var kw = $.second.$string_dict
449
for(var attr in kw){
450
dict.$setitem(self, attr, kw[attr])
Sep 5, 2014
453
}
454
Mar 7, 2018
455
var $dict_iterator = $B.$iterator_class("dict iterator")
Feb 11, 2018
456
dict.__iter__ = function(self) {
Sep 5, 2014
458
}
459
Feb 11, 2018
460
dict.__len__ = function(self) {
462
if(self.$jsobj){
463
var _count = 0
Mar 7, 2018
464
for(var attr in self.$jsobj){if(attr.charAt(0) != "$"){_count++}}
465
return _count
466
}
468
if(self.$str_keys){
469
return Object.keys(self.$string_dict).length
470
}else{
471
return self.$items.length
472
}
Sep 5, 2014
474
Mar 7, 2018
475
dict.__ne__ = function(self, other){return ! dict.__eq__(self, other)}
Sep 5, 2014
476
Feb 11, 2018
477
dict.__new__ = function(cls){
478
if(cls === undefined){
Mar 7, 2018
479
throw _b_.TypeError.$factory("int.__new__(): not enough arguments")
481
var instance = {
483
$str_keys: true,
485
$hash: {},
486
$items: []
488
if(cls !== dict){
489
instance.__dict__ = _b_.dict.$factory()
490
}
491
return instance
Feb 11, 2018
494
dict.__next__ = function(self){
495
if(self.$iter == null){
496
self.$iter = new $item_generator(self)
498
try{
500
}catch (err){
501
if(err.__name__ !== "StopIteration"){throw err}
Sep 5, 2014
502
}
503
}
504
Feb 11, 2018
505
dict.__repr__ = function(self){
506
if(self.$jsobj){ // wrapper around Javascript object
Feb 11, 2018
507
return dict.__repr__(jsobj2dict(self.$jsobj))
509
var res = [],
510
items = new $item_generator(self).as_list()
511
items.forEach(function(item){
512
if((!self.$jsobj && item[1] === self) ||
513
(self.$jsobj && item[1] === self.$jsobj)){
Mar 7, 2018
514
res.push(repr(item[0]) + ": {...}")
Mar 7, 2018
517
res.push(repr(item[0]) + ": " + repr(item[1]))
Mar 7, 2018
519
res.push(repr(item[0]) + ": <unprintable object>")
Mar 7, 2018
523
return "{" + res.join(", ") + "}"
Sep 5, 2014
524
}
525
526
dict.__setitem__ = function(self, key, value){
Mar 7, 2018
527
var $ = $B.args("__setitem__", 3, {self: null, key: null, value: null},
528
["self", "key", "value"], arguments, {}, null, null)
529
return dict.$setitem($.self, $.key, $.value)
530
}
Nov 21, 2015
531
532
dict.$setitem = function(self, key, value){
533
var hash
535
if(self.$from_js){
536
// dictionary created by method to_dict of JSObject instances
537
value = $B.pyobj2jsobj(value)
538
}
539
if(self.$jsobj.__class__ === _b_.type){
540
self.$jsobj[key] = value
541
if(key == "__init__" || key == "__new__"){
542
// If class attribute __init__ or __new__ are reset,
543
// the factory function has to change
544
self.$jsobj.$factory = $B.$instance_creator(self.$jsobj)
545
}
546
}else{
547
self.$jsobj[key] = value
552
if(self.$str_keys){
553
if(typeof key == "string"){
554
self.$string_dict[key] = value
555
return $N
556
}else{
557
// Is key hash equal to the hash of one of the string keys ?
558
hash = _b_.hash(key)
559
var s = object_equals_string(self, hash, key)
560
if(s !== $N){
561
// Reset value
562
self.$string_dict[s] = value
563
return $N
564
}
565
self.$str_keys = false
566
for(var s in self.$string_dict){
567
var item = [s, self.$string_dict[s]],
568
hash = _b_.str.__hash__(s)
569
self.$items.push(item)
570
self.$hash[hash] = [self.$items.length - 1]
571
}
572
}
575
var hash = hash === undefined ? _b_.hash(key) : hash,
576
items = self.$hash[hash]
577
if(items !== undefined){
578
for(var i = 0, len = items.length; i < len; i++){
579
if($B.rich_comp("__eq__", key, self.$items[i][0])){
580
self.$items[i][1] = value
581
return $N
582
}
583
}
584
self.$items.push([key, value])
585
items.push(self.$items.length - 1)
586
}else{
587
self.$items.push([key, value])
588
self.$hash[hash] = [self.$items.length - 1]
Sep 5, 2014
590
}
591
592
dict.__str__ = function(){return dict.__repr__.apply(null, arguments)}
Sep 5, 2014
593
594
// add "reflected" methods
Feb 11, 2018
595
$B.make_rmethods(dict)
Sep 5, 2014
596
Feb 11, 2018
597
dict.clear = function(){
Sep 5, 2014
598
// Remove all items from the dictionary.
Mar 7, 2018
599
var $ = $B.args("clear", 1, {self: null}, ["self"], arguments, {},
600
null, null),
601
self = $.self
603
self.$hash = {}
604
self.$items = []
605
self.$str_keys = true
606
self.$string_dict = {}
608
if(self.$jsobj){
609
for(var attr in self.$jsobj){
Mar 7, 2018
610
if(attr.charAt(0) !== "$" && attr !== "__class__"){
611
delete self.$jsobj[attr]
612
}
613
}
614
}
Sep 5, 2014
616
}
617
Feb 11, 2018
618
dict.copy = function(self){
Sep 5, 2014
619
// Return a shallow copy of the dictionary
Mar 7, 2018
620
var $ = $B.args("copy", 1, {self: null},["self"], arguments,{},
621
null, null),
622
self = $.self,
Feb 11, 2018
623
res = _b_.dict.$factory()
Sep 5, 2014
625
return res
626
}
627
Feb 11, 2018
628
dict.fromkeys = function(){
Nov 21, 2015
629
Mar 7, 2018
630
var $ = $B.args("fromkeys", 3, {cls: null, keys: null, value: null},
631
["cls", "keys", "value"], arguments, {value: _b_.None}, null, null),
632
keys = $.keys,
633
value = $.value
Sep 5, 2014
635
// class method
636
var klass = $.cls,
Sep 5, 2014
640
while(1){
641
try{
642
var key = _b_.next(keys_iter)
643
if(klass === dict){dict.__setitem__(res, key, value)}
644
else{_b_.getattr(res, "__setitem__")(key, value)}
Sep 5, 2014
645
}catch(err){
646
if($B.is_exc(err, [_b_.StopIteration])){
Sep 5, 2014
647
return res
648
}
649
throw err
650
}
651
}
652
}
653
Feb 11, 2018
654
dict.get = function(){
Mar 7, 2018
655
var $ = $B.args("get", 3, {self: null, key: null, _default: null},
656
["self", "key", "_default"], arguments, {_default: $N}, null, null)
Feb 11, 2018
658
try{return dict.__getitem__($.self, $.key)}
659
catch(err){
660
if(_b_.isinstance(err, _b_.KeyError)){return $._default}
661
else{throw err}
662
}
663
}
664
Mar 7, 2018
665
var $dict_itemsDict = $B.$iterator_class("dict_items")
666
Feb 11, 2018
667
dict.items = function(self){
Mar 23, 2018
668
if(arguments.length > 1){
669
var _len = arguments.length - 1,
670
_msg = "items() takes no arguments (" + _len + " given)"
671
throw _b_.TypeError.$factory(_msg)
672
}
673
return $iterator_wrapper(new $item_iterator(self), $dict_itemsDict)
674
}
675
Mar 7, 2018
676
var $dict_keysDict = $B.$iterator_class("dict_keys")
Nov 21, 2015
677
Mar 23, 2018
679
if(arguments.length > 1){
680
var _len = arguments.length - 1,
681
_msg = "keys() takes no arguments (" + _len + " given)"
682
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
683
}
684
return $iterator_wrapper(new $key_iterator(self), $dict_keysDict)
Nov 21, 2015
685
}
686
Feb 11, 2018
687
dict.pop = function(){
Nov 21, 2015
688
Mar 7, 2018
689
var $ = $B.args("pop", 3, {self: null, key: null, _default: null},
690
["self", "key", "_default"], arguments, {_default: $N}, null, null),
691
self = $.self,
692
key = $.key,
693
_default = $._default
Nov 21, 2015
694
Sep 5, 2014
695
try{
696
var res = dict.__getitem__(self, key)
697
dict.__delitem__(self, key)
Sep 5, 2014
698
return res
699
}catch(err){
700
if(err.__class__ === _b_.KeyError){
701
if(_default !== undefined){return _default}
Sep 5, 2014
702
throw err
703
}
704
throw err
705
}
706
}
707
Feb 11, 2018
708
dict.popitem = function(self){
709
try{
710
var itm = new $item_iterator(self).next()
711
dict.__delitem__(self, itm[0])
Feb 11, 2018
712
return _b_.tuple.$factory(itm)
714
if (err.__class__ == _b_.StopIteration) {
715
throw KeyError.$factory("'popitem(): dictionary is empty'")
Sep 5, 2014
718
}
719
Feb 11, 2018
720
dict.setdefault = function(){
Nov 21, 2015
721
Mar 7, 2018
722
var $ = $B.args("setdefault", 3, {self: null, key: null, _default: null},
723
["self", "key", "_default"], arguments, {_default: $N}, null, null),
724
self = $.self,
725
key = $.key,
726
_default = $._default
Nov 21, 2015
727
728
try{return dict.__getitem__(self, key)}
Sep 5, 2014
729
catch(err){
730
if(_default === undefined){_default = $N}
731
dict.__setitem__(self, key, _default)
Sep 5, 2014
732
return _default
733
}
734
}
735
Feb 11, 2018
736
dict.update = function(self){
Nov 21, 2015
737
Mar 7, 2018
738
var $ = $B.args("update", 1, {"self": null}, ["self"], arguments,
739
{}, "args", "kw"),
740
self = $.self,
741
args = $.args,
742
kw = $.kw
743
if(args.length > 0){
744
var o = args[0]
745
if(isinstance(o, dict)){
746
if(o.$jsobj){o = jsobj2dict(o)}
747
$copy_dict(self, o)
Mar 7, 2018
748
}else if(hasattr(o, "__getitem__") && hasattr(o, "keys")){
749
var _keys = _b_.list.$factory(getattr(o, "keys")()),
750
i = _keys.length
751
while(i--){
752
var _value = getattr(o, "__getitem__")(_keys[i])
753
dict.$setitem(self, _keys[i], _value)
Sep 5, 2014
756
}
Sep 5, 2014
759
}
760
Mar 7, 2018
761
var $dict_valuesDict = $B.$iterator_class("dict_values")
Nov 21, 2015
762
Feb 11, 2018
763
dict.values = function(self){
Mar 23, 2018
764
if(arguments.length > 1){
765
var _len = arguments.length - 1,
766
_msg = "values() takes no arguments (" + _len + " given)"
767
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
768
}
769
return $iterator_wrapper(new $value_iterator(self), $dict_valuesDict)
770
}
771
772
dict.$factory = function(){
773
var res = dict.__new__(dict)
774
var args = [res]
775
for(var i = 0, len = arguments.length; i < len ; i++){
776
args.push(arguments[i])
777
}
778
dict.__init__.apply(null, args)
Sep 5, 2014
779
return res
780
}
Sep 5, 2014
782
_b_.dict = dict
Feb 11, 2018
784
$B.set_func_names(dict, "builtins")
786
// This must be done after set_func_names, otherwise dict.fromkeys doesn't
787
// have the attribute $infos
788
dict.fromkeys = _b_.classmethod.$factory(dict.fromkeys)
789
790
// following are used for faster access elsewhere
791
$B.$dict_iterator = function(d){return new $item_generator(d)}
Feb 11, 2018
792
$B.$dict_length = dict.__len__
793
$B.$dict_getitem = dict.__getitem__
794
$B.$dict_get = dict.get
795
$B.$dict_set = dict.__setitem__
796
$B.$dict_contains = dict.__contains__
797
$B.$dict_items = function(d) { return new $item_generator(d).as_list() }
798
$B.$copy_dict = $copy_dict // copy from right to left
Feb 11, 2018
799
$B.$dict_get_copy = dict.copy // return a shallow copy
802
// Class for attribute __dict__ of classes
803
var mappingproxy = $B.mappingproxy = $B.make_class("mappingproxy",
Feb 12, 2018
804
function(obj){
805
if(_b_.isinstance(obj, dict)){
806
// Should be a dictionary
807
var res = {
808
$hash: {},
809
$items: obj.$items.slice(),
810
$str_keys: obj.$str_keys,
811
$string_dict: {}
812
}
813
for(var hash in obj.$hash){res.$hash[hash] = obj.$hash[hash]}
814
for(var key in obj.$string_dict){
815
res.$string_dict[key] = obj.$string_dict[key]
816
}
817
}else{
818
var res = $B.obj_dict(obj)
819
}
Feb 12, 2018
820
res.__class__ = mappingproxy
821
return res
822
}
823
)
Feb 12, 2018
825
mappingproxy.__setitem__ = function(){
Mar 7, 2018
826
throw _b_.TypeError.$factory("'mappingproxy' object does not support " +
827
"item assignment")
830
for(var attr in dict){
831
if(mappingproxy[attr] !== undefined ||
832
["__class__", "__mro__", "__new__", "__init__", "__delitem__",
833
"clear", "fromkeys", "pop", "popitem", "setdefault",
834
"update"].indexOf(attr) > -1){
835
continue
836
}
837
if(typeof dict[attr] == "function"){
838
mappingproxy[attr] = (function(key){
839
return function(){
840
return dict[key].apply(null, arguments)
841
}
842
})(attr)
843
}else{
844
mappingproxy[attr] = dict[attr]
845
}
846
}
847
Feb 12, 2018
848
$B.set_func_names(mappingproxy, "builtins")
Feb 11, 2018
851
var d = dict.$factory()
Mar 7, 2018
853
if(attr.charAt(0) != "$" && attr !== "__class__"){
854
if(x[attr] === undefined){
855
continue
856
}else if(x[attr].$jsobj === x){
857
d.$string_dict[attr] = d
858
}else{
859
d.$string_dict[attr] = x[attr]
860
}
865
$B.obj_dict = function(obj, from_js){
866
var klass = obj.__class__ || $B.get_class(obj)
867
if(klass !== undefined && klass.$native){
868
throw _b_.AttributeError.$factory(klass.__name__ +
869
" has no attribute '__dict__'")}
Feb 11, 2018
870
var res = dict.$factory()
871
res.$jsobj = obj
872
res.$from_js = from_js // set to true if created by JSObject.to_dict()
873
return res
874
}
875
Sep 5, 2014
876
})(__BRYTHON__)