Skip to content
Permalink
Newer
Older
100644 857 lines (753 sloc) 24.2 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
klass.__reduce_ex__ = klass.__reduce__ = function(self){
134
return _b_.tuple.$factory([_b_.iter,
135
_b_.tuple.$factory([_b_.list.$factory(self)])])
136
}
Feb 11, 2018
140
dict.__bool__ = function () {
Mar 7, 2018
141
var $ = $B.args("__bool__", 1, {self: null}, ["self"],
142
arguments, {}, null, null)
Feb 11, 2018
143
return dict.__len__($.self) > 0
Feb 11, 2018
146
dict.__contains__ = function(){
Nov 21, 2015
147
148
var $ = $B.args("__contains__", 2, {self: null, item: null},
149
["self", "item"], arguments, {}, null, null),
150
self = $.self,
151
item = $.item
152
153
if(self.$jsobj){return self.$jsobj[item] !== undefined}
154
155
switch(typeof item) {
156
case "string":
157
return self.$string_dict[item] !== undefined
158
case "number":
159
return self.$numeric_dict[item] !== undefined
160
}
161
162
var _key = hash(item)
163
if(self.$str_hash[_key] !== undefined &&
164
$B.rich_comp("__eq__", item, self.$str_hash[_key])){return true}
165
if(self.$numeric_dict[_key] !== undefined &&
166
$B.rich_comp("__eq__", item, _key)){return true}
167
if(self.$object_dict[_key] !== undefined){
168
// If the key is an object, its hash must be in the dict keys but the
169
// key itself must compare equal to the key associated with the hash
170
// For instance :
171
//
172
// class X:
173
// def __hash__(self): return hash('u')
174
//
175
// a = {'u': 'a', X(): 'b'}
176
// assert set(a.values()) == {'a', 'b'}
177
// assert not X() in a
178
return $B.rich_comp("__eq__", item, self.$object_dict[_key][0])
179
}
180
return false
Sep 5, 2014
181
}
182
Feb 11, 2018
183
dict.__delitem__ = function(){
Nov 21, 2015
184
185
var $ = $B.args("__eq__", 2, {self: null, arg: null},
186
["self", "arg"], arguments, {}, null, null),
187
self = $.self,
Nov 21, 2015
189
190
if(self.$jsobj){
191
if(self.$jsobj[arg] === undefined){throw KeyError.$factory(arg)}
192
delete self.$jsobj[arg]
195
switch(typeof arg){
196
case "string":
197
if(self.$string_dict[arg] === undefined){
198
throw KeyError.$factory(_b_.str.$factory(arg))
199
}
200
delete self.$string_dict[arg]
201
delete self.$str_hash[str_hash(arg)]
202
return $N
203
case "number":
204
if(self.$numeric_dict[arg] === undefined){
205
throw KeyError.$factory(_b_.str.$factory(arg))
207
delete self.$numeric_dict[arg]
208
return $N
210
// go with defaults
211
212
var _key = hash(arg)
213
214
if(self.$object_dict[_key] !== undefined){
215
delete self.$object_dict[_key]
216
}
217
218
if(self.$jsobj){delete self.$jsobj[arg]}
219
return $N
Sep 5, 2014
220
}
221
Feb 11, 2018
222
dict.__eq__ = function(){
Mar 7, 2018
223
var $ = $B.args("__eq__", 2, {self: null, other: null},
224
["self", "other"], arguments, {}, null, null),
225
self = $.self,
226
other = $.other
Mar 7, 2018
228
if(! isinstance(other, dict)){return false}
230
if(self.$jsobj){self = jsobj2dict(self.$jsobj)}
231
if(other.$jsobj){other = jsobj2dict(other.$jsobj)}
233
if(dict.__len__(self) != dict.__len__(other)){return false}
235
if((self.$numeric_dict.length != other.$numeric_dict.length) ||
236
(self.$string_dict.length != other.$string_dict.length) ||
237
(self.$object_dict.length != other.$object_dict.length)){
238
return false
239
}
240
for(var k in self.$numeric_dict){
241
if(!$B.rich_comp("__eq__", other.$numeric_dict[k],
242
self.$numeric_dict[k])){
243
return false
Nov 21, 2015
244
}
245
}
246
for(var k in self.$string_dict){
247
if(!$B.rich_comp("__eq__", other.$string_dict[k],
248
self.$string_dict[k])){
249
return false
Nov 21, 2015
250
}
251
}
252
for(var hash in self.$object_dict){
253
self_obj = self.$object_dict[hash][0]
254
self_value = self.$object_dict[hash][1]
255
if(other.$object_dict[hash] !== undefined){
256
if(!$B.rich_comp("__eq__", other.$object_dict[hash][1],
257
self_value)){
258
return false
259
}
260
}else{
261
// Is hash of object a key of numeric dict ?
262
var num_value = other.$numeric_dict[hash]
263
if(num_value !== undefined){
264
if($B.rich_comp("__eq__", self_obj, hash) &&
265
! $B.rich_comp("__eq__", num_value, self_value)){
266
return false
267
}
268
}else{
269
return false
270
}
271
}
272
}
273
274
return true
275
Sep 5, 2014
276
}
277
Feb 11, 2018
278
dict.__getitem__ = function(){
279
var $ = $B.args("__getitem__", 2, {self: null, arg: null},
280
["self", "arg"], arguments, {}, null, null),
281
self = $.self,
283
if(self.$jsobj){
284
if(!self.$jsobj.hasOwnProperty(arg)){
285
throw _b_.KeyError.$factory(str.$factory(arg))
286
}else if(self.$jsobj[arg] === undefined){
287
return _b_.NotImplemented
288
}else if(self.$jsobj[arg] === null){return $N}
289
return self.$jsobj[arg]
291
292
switch(typeof arg){
293
case "string":
294
if(self.$string_dict[arg] !== undefined){
295
return self.$string_dict[arg]
297
break
298
case "number":
299
if(self.$numeric_dict[arg] !== undefined){
300
return self.$numeric_dict[arg]
302
break
303
}
304
305
// since the key is more complex use 'default' method of getting item
306
307
var _key = _b_.hash(arg),
308
_eq = function(other){return $B.rich_comp("__eq__", arg, other)}
309
310
var sk = self.$str_hash[_key]
311
if(sk !== undefined && _eq(sk)){
312
return self.$string_dict[sk]
313
}
314
if(self.$numeric_dict[_key] !== undefined && _eq(_key)){
315
return self.$numeric_dict[_key]
316
}
317
if(isinstance(arg, _b_.str)){
318
// string subclass
319
var res = self.$string_dict[arg.valueOf()]
320
if(res !== undefined){return res}
321
}
322
323
var obj_ref = self.$object_dict[_key]
324
if(obj_ref !== undefined){
325
// An object with the same hash is already stored
326
// Lookup should fail if equality raises an exception
327
_eq(self.$object_dict[_key][0])
328
return self.$object_dict[_key][1]
330
if(self.__class__ !== dict){
332
var missing_method = getattr(self.__class__, "__missing__", _b_.None)
333
}catch(err){
334
console.log(err)
335
336
}
337
if(missing_method !== _b_.None){
338
return missing_method(self, arg)
341
throw KeyError.$factory(_b_.str.$factory(arg))
Sep 5, 2014
342
}
343
Feb 11, 2018
344
dict.__hash__ = None
Sep 5, 2014
345
346
function init_from_list(self, args){
347
var i = -1,
348
stop = args.length - 1,
349
si = dict.__setitem__
350
while(i++ < stop){
351
var item = args[i]
352
switch(typeof item[0]) {
353
case 'string':
354
self.$string_dict[item[0]] = item[1]
355
self.$str_hash[str_hash(item[0])] = item[0]
356
break
357
case 'number':
358
self.$numeric_dict[item[0]] = item[1]
359
break
360
default:
361
si(self, item[0], item[1])
362
break
363
}
364
}
365
}
366
367
dict.__init__ = function(self, first, second){
369
if(first === undefined){return $N}
370
if(second === undefined){
371
if(first.__class__ === $B.JSObject){
372
self.$jsobj = first.js
373
return $N
374
}else if(first.$jsobj){
375
self.$jsobj = {}
376
for(var attr in first.$jsobj){
377
self.$jsobj[attr] = first.$jsobj[attr]
380
}else if(Array.isArray(first)){
381
init_from_list(self, first)
382
return $N
Sep 5, 2014
383
}
386
$ = $ || $B.args("dict", 1, {self:null}, ["self"],
387
arguments, {}, "first", "second")
388
var args = $.first
389
if(args.length > 1){
390
throw _b_.TypeError.$factory("dict expected at most 1 argument" +
391
", got 2")
392
}else if(args.length == 1){
393
args = args[0]
394
if(args.__class__ === dict){
395
['$string_dict', '$str_hash', '$numeric_dict', '$object_dict'].
396
forEach(function(d){
397
for(key in args[d]){self[d][key] = args[d][key]}
398
})
399
}else if(isinstance(args, dict)){
400
$copy_dict(self, args)
402
var keys = $B.$getattr(args, "keys", null)
403
if(keys !== null){
404
var gi = $B.$getattr(args, "__getitem__", null)
405
if(gi !== null){
406
// has keys and __getitem__ : it's a mapping, iterate on
407
// keys and values
408
gi = $B.$call(gi)
409
var kiter = _b_.iter($B.$call(keys)())
410
while(true){
411
try{
412
var key = _b_.next(kiter),
413
value = gi(key)
414
dict.__setitem__(self, key, value)
415
}catch(err){
416
if(err.__class__ === _b_.StopIteration){
417
break
418
}
419
throw err
420
}
421
}
422
return $N
423
}
424
}
425
if(! Array.isArray(args)){
426
args = _b_.list.$factory(args)
427
}
428
// Form "dict([[key1, value1], [key2,value2], ...])"
429
init_from_list(self, args)
Sep 5, 2014
430
}
432
var kw = $.second.$string_dict
433
for(var attr in kw){
434
switch(typeof attr){
435
case "string":
436
self.$string_dict[attr] = kw[attr]
437
self.$str_hash[str_hash(attr)] = attr
438
break
439
case "number":
440
self.$numeric_dict[attr] = kw[attr]
441
break
442
default:
443
si(self, attr, kw[attr])
444
break
445
}
Sep 5, 2014
448
}
449
Mar 7, 2018
450
var $dict_iterator = $B.$iterator_class("dict iterator")
Feb 11, 2018
451
dict.__iter__ = function(self) {
Sep 5, 2014
453
}
454
Feb 11, 2018
455
dict.__len__ = function(self) {
458
if(self.$jsobj){
Mar 7, 2018
459
for(var attr in self.$jsobj){if(attr.charAt(0) != "$"){_count++}}
460
return _count
461
}
463
for(var k in self.$numeric_dict){_count++}
464
for(var k in self.$string_dict){_count++}
465
for(var k in self.$object_dict){_count++}
466
467
return _count
Sep 5, 2014
469
Mar 7, 2018
470
dict.__ne__ = function(self, other){return ! dict.__eq__(self, other)}
Sep 5, 2014
471
Feb 11, 2018
472
dict.__new__ = function(cls){
473
if(cls === undefined){
Mar 7, 2018
474
throw _b_.TypeError.$factory("int.__new__(): not enough arguments")
476
var instance = {
478
$numeric_dict : {},
479
$object_dict : {},
483
if(cls !== dict){
484
instance.__dict__ = _b_.dict.$factory()
485
}
486
return instance
Feb 11, 2018
489
dict.__next__ = function(self){
490
if(self.$iter == null){
491
self.$iter = new $item_generator(self)
493
try{
495
}catch (err){
496
if(err.__name__ !== "StopIteration"){throw err}
Sep 5, 2014
497
}
498
}
499
Feb 11, 2018
500
dict.__repr__ = function(self){
501
if(self.$jsobj){ // wrapper around Javascript object
Feb 11, 2018
502
return dict.__repr__(jsobj2dict(self.$jsobj))
504
var res = [],
505
items = new $item_generator(self).as_list()
506
items.forEach(function(item){
507
if((!self.$jsobj && item[1] === self) ||
508
(self.$jsobj && item[1] === self.$jsobj)){
Mar 7, 2018
509
res.push(repr(item[0]) + ": {...}")
Mar 7, 2018
512
res.push(repr(item[0]) + ": " + repr(item[1]))
Mar 7, 2018
514
res.push(repr(item[0]) + ": <unprintable object>")
Mar 7, 2018
518
return "{" + res.join(", ") + "}"
Sep 5, 2014
519
}
520
521
dict.__setitem__ = function(self, key, value){
Mar 7, 2018
522
var $ = $B.args("__setitem__", 3, {self: null, key: null, value: null},
523
["self", "key", "value"], arguments, {}, null, null)
524
return dict.$setitem($.self, $.key, $.value)
525
}
Nov 21, 2015
526
527
dict.$setitem = function(self, key, value){
529
if(self.$from_js){
530
// dictionary created by method to_dict of JSObject instances
531
value = $B.pyobj2jsobj(value)
532
}
533
if(self.$jsobj.__class__ === _b_.type){
534
self.$jsobj[key] = value
535
if(key == "__init__" || key == "__new__"){
536
// If class attribute __init__ or __new__ are reset,
537
// the factory function has to change
538
self.$jsobj.$factory = $B.$instance_creator(self.$jsobj)
539
}
540
}else{
541
self.$jsobj[key] = value
546
switch(typeof key){
547
case "string":
548
self.$string_dict[key] = value
549
self.$str_hash[str_hash(key)] = key
550
return $N
551
case "number":
552
self.$numeric_dict[key] = value
553
return $N
556
// if we got here the key is more complex, use default method
557
558
var _key = hash(key),
559
_eq = function(other){return $B.rich_comp("__eq__", key, other)}
560
561
if(self.$numeric_dict[_key] !== undefined && _eq(_key)){
562
self.$numeric_dict[_key] = value
563
return $N
564
}
565
var sk = self.$str_hash[_key]
566
if(sk !== undefined && _eq(sk)){
567
self.$string_dict[sk] = value
568
return $N
569
}
570
571
var obj_ref = self.$object_dict[_key]
572
if(obj_ref !== undefined){
573
// An object with the same hash is already stored
574
// Lookup should fail if equality raises an exception
575
_eq(self.$object_dict[_key][0])
577
self.$object_dict[_key] = [key, value]
578
return $N
Sep 5, 2014
579
}
580
581
dict.__str__ = function(){return dict.__repr__.apply(null, arguments)}
Sep 5, 2014
582
583
// add "reflected" methods
Feb 11, 2018
584
$B.make_rmethods(dict)
Sep 5, 2014
585
Feb 11, 2018
586
dict.clear = function(){
Sep 5, 2014
587
// Remove all items from the dictionary.
Mar 7, 2018
588
var $ = $B.args("clear", 1, {self: null}, ["self"], arguments, {},
589
null, null),
590
self = $.self
592
self.$numeric_dict = {}
593
self.$string_dict = {}
594
self.$str_hash = {}
595
self.$object_dict = {}
597
if(self.$jsobj){
598
for(var attr in self.$jsobj){
Mar 7, 2018
599
if(attr.charAt(0) !== "$" && attr !== "__class__"){
600
delete self.$jsobj[attr]
601
}
602
}
603
}
Sep 5, 2014
605
}
606
Feb 11, 2018
607
dict.copy = function(self){
Sep 5, 2014
608
// Return a shallow copy of the dictionary
Mar 7, 2018
609
var $ = $B.args("copy", 1, {self: null},["self"], arguments,{},
610
null, null),
611
self = $.self,
Feb 11, 2018
612
res = _b_.dict.$factory()
Sep 5, 2014
614
return res
615
}
616
Feb 11, 2018
617
dict.fromkeys = function(){
Nov 21, 2015
618
Mar 7, 2018
619
var $ = $B.args("fromkeys", 3, {cls: null, keys: null, value: null},
620
["cls", "keys", "value"], arguments, {value: _b_.None}, null, null),
621
keys = $.keys,
622
value = $.value
Sep 5, 2014
624
// class method
625
var klass = $.cls,
Sep 5, 2014
629
while(1){
630
try{
631
var key = _b_.next(keys_iter)
632
if(klass === dict){dict.__setitem__(res, key, value)}
633
else{_b_.getattr(res, "__setitem__")(key, value)}
Sep 5, 2014
634
}catch(err){
635
if($B.is_exc(err, [_b_.StopIteration])){
Sep 5, 2014
636
return res
637
}
638
throw err
639
}
640
}
641
}
642
Feb 11, 2018
643
dict.get = function(){
Mar 7, 2018
644
var $ = $B.args("get", 3, {self: null, key: null, _default: null},
645
["self", "key", "_default"], arguments, {_default: $N}, null, null)
Feb 11, 2018
647
try{return dict.__getitem__($.self, $.key)}
648
catch(err){
649
if(_b_.isinstance(err, _b_.KeyError)){return $._default}
650
else{throw err}
651
}
652
}
653
Mar 7, 2018
654
var $dict_itemsDict = $B.$iterator_class("dict_items")
655
Feb 11, 2018
656
dict.items = function(self){
Mar 23, 2018
657
if(arguments.length > 1){
658
var _len = arguments.length - 1,
659
_msg = "items() takes no arguments (" + _len + " given)"
660
throw _b_.TypeError.$factory(_msg)
661
}
662
return $iterator_wrapper(new $item_iterator(self), $dict_itemsDict)
663
}
664
Mar 7, 2018
665
var $dict_keysDict = $B.$iterator_class("dict_keys")
Nov 21, 2015
666
Mar 23, 2018
668
if(arguments.length > 1){
669
var _len = arguments.length - 1,
670
_msg = "keys() takes no arguments (" + _len + " given)"
671
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
672
}
673
return $iterator_wrapper(new $key_iterator(self), $dict_keysDict)
Nov 21, 2015
674
}
675
Feb 11, 2018
676
dict.pop = function(){
Nov 21, 2015
677
Mar 7, 2018
678
var $ = $B.args("pop", 3, {self: null, key: null, _default: null},
679
["self", "key", "_default"], arguments, {_default: $N}, null, null),
680
self = $.self,
681
key = $.key,
682
_default = $._default
Nov 21, 2015
683
Sep 5, 2014
684
try{
685
var res = dict.__getitem__(self, key)
686
dict.__delitem__(self, key)
Sep 5, 2014
687
return res
688
}catch(err){
689
if(err.__class__ === _b_.KeyError){
690
if(_default !== undefined){return _default}
Sep 5, 2014
691
throw err
692
}
693
throw err
694
}
695
}
696
Feb 11, 2018
697
dict.popitem = function(self){
698
try{
699
var itm = new $item_iterator(self).next()
700
dict.__delitem__(self, itm[0])
Feb 11, 2018
701
return _b_.tuple.$factory(itm)
703
if (err.__class__ == _b_.StopIteration) {
704
throw KeyError.$factory("'popitem(): dictionary is empty'")
Sep 5, 2014
707
}
708
Feb 11, 2018
709
dict.setdefault = function(){
Nov 21, 2015
710
Mar 7, 2018
711
var $ = $B.args("setdefault", 3, {self: null, key: null, _default: null},
712
["self", "key", "_default"], arguments, {_default: $N}, null, null),
713
self = $.self,
714
key = $.key,
715
_default = $._default
Nov 21, 2015
716
717
try{return dict.__getitem__(self, key)}
Sep 5, 2014
718
catch(err){
719
if(_default === undefined){_default = $N}
720
dict.__setitem__(self, key, _default)
Sep 5, 2014
721
return _default
722
}
723
}
724
Feb 11, 2018
725
dict.update = function(self){
Nov 21, 2015
726
Mar 7, 2018
727
var $ = $B.args("update", 1, {"self": null}, ["self"], arguments,
728
{}, "args", "kw"),
729
self = $.self,
730
args = $.args,
731
kw = $.kw
732
if(args.length > 0){
733
var o = args[0]
734
if(isinstance(o, dict)){
735
if(o.$jsobj){o = jsobj2dict(o)}
736
$copy_dict(self, o)
Mar 7, 2018
737
}else if(hasattr(o, "__getitem__") && hasattr(o, "keys")){
738
var _keys = _b_.list.$factory(getattr(o, "keys")()),
739
si = dict.__setitem__,
740
i = _keys.length
741
while(i--){
742
var _value = getattr(o, "__getitem__")(_keys[i])
743
si(self, _keys[i], _value)
Sep 5, 2014
746
}
Sep 5, 2014
749
}
750
Mar 7, 2018
751
var $dict_valuesDict = $B.$iterator_class("dict_values")
Nov 21, 2015
752
Feb 11, 2018
753
dict.values = function(self){
Mar 23, 2018
754
if(arguments.length > 1){
755
var _len = arguments.length - 1,
756
_msg = "values() takes no arguments (" + _len + " given)"
757
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
758
}
759
return $iterator_wrapper(new $value_iterator(self), $dict_valuesDict)
760
}
761
762
dict.$factory = function(){
763
var res = dict.__new__(dict)
764
var args = [res]
765
for(var i = 0, len = arguments.length; i < len ; i++){
766
args.push(arguments[i])
767
}
768
dict.__init__.apply(null, args)
Sep 5, 2014
769
return res
770
}
Sep 5, 2014
772
_b_.dict = dict
Feb 11, 2018
774
$B.set_func_names(dict, "builtins")
776
// This must be done after set_func_names, otherwise dict.fromkeys doesn't
777
// have the attribute $infos
778
dict.fromkeys = _b_.classmethod.$factory(dict.fromkeys)
779
780
// following are used for faster access elsewhere
781
$B.$dict_iterator = function(d){return new $item_generator(d)}
Feb 11, 2018
782
$B.$dict_length = dict.__len__
783
$B.$dict_getitem = dict.__getitem__
784
$B.$dict_get = dict.get
785
$B.$dict_set = dict.__setitem__
786
$B.$dict_contains = dict.__contains__
787
$B.$dict_items = function(d) { return new $item_generator(d).as_list() }
788
$B.$copy_dict = $copy_dict // copy from right to left
Feb 11, 2018
789
$B.$dict_get_copy = dict.copy // return a shallow copy
792
// Class for attribute __dict__ of classes
793
var mappingproxy = $B.mappingproxy = $B.make_class("mappingproxy",
Feb 12, 2018
794
function(obj){
795
if(_b_.isinstance(obj, dict)){
796
// Should be a dictionary
797
var res = $B.obj_dict(obj.$string_dict)
798
}else{
799
var res = $B.obj_dict(obj)
800
}
Feb 12, 2018
801
res.__class__ = mappingproxy
802
return res
803
}
804
)
Feb 12, 2018
806
mappingproxy.__setitem__ = function(){
Mar 7, 2018
807
throw _b_.TypeError.$factory("'mappingproxy' object does not support " +
808
"item assignment")
811
for(var attr in dict){
812
if(mappingproxy[attr] !== undefined ||
813
["__class__", "__mro__", "__new__", "__init__", "__delitem__",
814
"clear", "fromkeys", "pop", "popitem", "setdefault",
815
"update"].indexOf(attr) > -1){
816
continue
817
}
818
if(typeof dict[attr] == "function"){
819
mappingproxy[attr] = (function(key){
820
return function(){
821
return dict[key].apply(null, arguments)
822
}
823
})(attr)
824
}else{
825
mappingproxy[attr] = dict[attr]
826
}
827
}
828
Feb 12, 2018
829
$B.set_func_names(mappingproxy, "builtins")
Feb 11, 2018
832
var d = dict.$factory()
Mar 7, 2018
834
if(attr.charAt(0) != "$" && attr !== "__class__"){
835
if(x[attr] === undefined){
836
continue
837
}else if(x[attr].$jsobj === x){
838
d.$string_dict[attr] = d
839
}else{
840
d.$string_dict[attr] = x[attr]
841
}
846
$B.obj_dict = function(obj, from_js){
847
var klass = obj.__class__ || $B.get_class(obj)
848
if(klass !== undefined && klass.$native){
849
throw _b_.AttributeError.$factory(klass.__name__ +
850
" has no attribute '__dict__'")}
Feb 11, 2018
851
var res = dict.$factory()
852
res.$jsobj = obj
853
res.$from_js = from_js // set to true if created by JSObject.to_dict()
854
return res
855
}
856
Sep 5, 2014
857
})(__BRYTHON__)