Skip to content
Permalink
Newer
Older
100644 797 lines (681 sloc) 22.3 KB
Sep 5, 2014
1
;(function($B){
2
3
eval($B.InjectBuiltins())
str
Feb 10, 2018
6
str_hash = _b_.str.__hash__,
Sep 5, 2014
8
9
// dictionary
10
function $DictClass($keys,$values){
11
this.iter = null
Feb 11, 2018
12
this.__class__ = dict
13
dict.clear(this)
Feb 9, 2015
14
Feb 11, 2018
15
var setitem=dict.__setitem__
16
var i=$keys.length
17
while(i--) setitem($keys[i], $values[i])
Feb 11, 2018
20
var dict = {
21
__class__: $B.$type,
22
__module__: "builtins",
Sep 5, 2014
23
__name__ : 'dict',
Feb 11, 2018
24
$is_class: true,
25
$native: true
Sep 5, 2014
26
}
27
28
var $key_iterator = function(d) {
29
this.d = d
30
this.current = 0
31
this.iter = new $item_generator(d)
32
}
33
$key_iterator.prototype.length = function(){return this.iter.items.length}
34
$key_iterator.prototype.next = function(){return this.iter.next()[0]}
35
36
var $value_iterator = function(d) {
37
this.d = d
38
this.current = 0
39
this.iter = new $item_generator(d)
40
}
41
$value_iterator.prototype.length = function(){return this.iter.items.length}
42
$value_iterator.prototype.next = function(){return this.iter.next()[1]}
43
44
var $item_generator = function(d) {
46
this.i = 0
48
if(d.$jsobj){
49
this.items = []
51
if(attr.charAt(0)!='$'){
52
val = d.$jsobj[attr];
53
if(val === undefined){val = _b_.NotImplemented}
54
else if(val === null){val = $N}
55
this.items.push([attr, val])
61
var items=[]
64
items[pos++]=[parseFloat(k), d.$numeric_dict[k]]
67
for (var k in d.$string_dict) {items[pos++]=[k, d.$string_dict[k]]}
69
for (var k in d.$object_dict) {items[pos++] = d.$object_dict[k]}
70
71
this.items=items
Feb 9, 2015
73
74
$item_generator.prototype.next = function() {
75
if (this.i < this.items.length) {
76
return this.items[this.i++]
78
throw _b_.StopIteration.$factory("StopIteration")
79
}
80
$item_generator.prototype.as_list = function() {
81
return this.items
82
}
83
84
var $item_iterator = function(d) {
85
this.d = d
86
this.current = 0
87
this.iter = new $item_generator(d)
88
}
89
$item_iterator.prototype.length = function() {return this.iter.items.length }
Feb 11, 2018
90
$item_iterator.prototype.next = function() { return _b_.tuple.$factory(this.iter.next()) }
91
92
var $copy_dict = function(left, right) {
93
var _l=new $item_generator(right).as_list(),
Feb 11, 2018
94
si=dict.__setitem__,
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){
110
var res = {
111
__class__:klass,
112
__eq__:function(other){
113
// compare set of items to other
114
return $B.rich_comp("__eq__", toSet(items), other)
116
__iter__:function(){items.iter.i=0; return res},
117
__len__:function(){return items.length()},
118
__next__:function(){
119
return items.next()
120
},
121
__repr__:function(){
122
var s = []
123
for(var i=0, len=items.length(); i<len; i++){
124
s.push(_b_.repr(items.next()))
125
}
126
return klass.__name__+'(['+ s.join(',') + '])'
127
},
128
}
129
res.__str__ = res.toString = res.__repr__
130
return res
131
}
132
Feb 11, 2018
133
dict.__bool__ = function () {
Nov 21, 2015
134
var $=$B.args('__bool__',1,{self:null},['self'],arguments,{},null,null)
Feb 11, 2018
135
return dict.__len__($.self) > 0
Feb 11, 2018
138
dict.__contains__ = function(){
Nov 21, 2015
139
140
var $ = $B.args('__contains__', 2, {self:null, item:null},
141
['self', 'item'], arguments, {}, null, null),
142
self=$.self, item=$.item
Nov 21, 2015
143
Sep 5, 2014
144
if(self.$jsobj) return self.$jsobj[item]!==undefined
Nov 21, 2015
145
146
switch(typeof item) {
147
case 'string':
148
return self.$string_dict[item] !==undefined
149
case 'number':
150
return self.$numeric_dict[item] !==undefined
152
item = item.__class__ === $B.$factory ? item.$dict : item // XXX old style
154
var _key=hash(item)
155
if (self.$str_hash[_key]!==undefined &&
156
$B.rich_comp("__eq__", item, self.$str_hash[_key])){return true}
157
if (self.$numeric_dict[_key]!==undefined &&
158
$B.rich_comp("__eq__", item, _key)){return true}
159
if (self.$object_dict[_key] !== undefined) {
Nov 21, 2015
160
// If the key is an object, its hash must be in the dict keys but the
161
// key itself must compare equal to the key associated with the hash
162
// For instance :
163
//
164
// class X:
165
// def __hash__(self): return hash('u')
166
//
Nov 21, 2015
167
// a = {'u': 'a', X(): 'b'}
168
// assert set(a.values())=={'a', 'b'}
169
// assert not X() in a
170
return $B.rich_comp("__eq__", item, self.$object_dict[_key][0])
171
}
172
return false
Sep 5, 2014
173
}
174
Feb 11, 2018
175
dict.__delitem__ = function(){
Nov 21, 2015
176
177
var $ = $B.args('__eq__', 2, {self:null, arg:null},
178
['self', 'arg'], arguments, {}, null, null),
179
self=$.self, arg=$.arg
180
181
if(self.$jsobj){
182
if(self.$jsobj[arg]===undefined){throw KeyError.$factory(arg)}
183
delete self.$jsobj[arg]
186
switch(typeof arg) {
187
case 'string':
str
Feb 10, 2018
188
if (self.$string_dict[arg] === undefined) throw KeyError.$factory(_b_.str.$factory(arg))
189
delete self.$string_dict[arg]
190
delete self.$str_hash[str_hash(arg)]
str
Feb 10, 2018
193
if (self.$numeric_dict[arg] === undefined) throw KeyError.$factory(_b_.str.$factory(arg))
197
// go with defaults
199
var _key=hash(arg)
201
if (self.$object_dict[_key] !== undefined) {
Nov 21, 2015
202
delete self.$object_dict[_key]
204
205
if(self.$jsobj) delete self.$jsobj[arg]
Sep 5, 2014
207
}
208
Feb 11, 2018
209
dict.__eq__ = function(){
Nov 21, 2015
210
var $ = $B.args('__eq__', 2, {self:null, other:null},
211
['self', 'other'], arguments, {}, null, null),
212
self=$.self, other=$.other
213
214
if(!isinstance(other,dict)) return false
216
if(self.$jsobj){self=jsobj2dict(self.$jsobj)}
217
if(other.$jsobj){other=jsobj2dict(other.$jsobj)}
Feb 11, 2018
219
if (dict.__len__(self) != dict.__len__(other)){return false}
Nov 21, 2015
221
if((self.$numeric_dict.length!=other.$numeric_dict.length) ||
222
(self.$string_dict.length!=other.$string_dict.length) ||
223
(self.$object_dict.length!=other.$object_dict.length)){
224
return false
Nov 21, 2015
226
for(var k in self.$numeric_dict){
227
if(!$B.rich_comp("__eq__", other.$numeric_dict[k], self.$numeric_dict[k])){
Nov 21, 2015
228
return false
229
}
230
}
231
for(var k in self.$string_dict){
232
if(!$B.rich_comp("__eq__", other.$string_dict[k], self.$string_dict[k])){
Nov 21, 2015
233
return false
234
}
235
}
236
for(var k in self.$object_dict){
237
if(!$B.rich_comp("__eq__", other.$object_dict[k][1], self.$object_dict[k][1])){
Nov 21, 2015
238
return false
239
}
240
}
Nov 21, 2015
243
Sep 5, 2014
244
}
245
Feb 11, 2018
246
dict.__getitem__ = function(){
Nov 21, 2015
247
var $ = $B.args('__getitem__', 2, {self:null, arg:null},
248
['self', 'arg'], arguments, {}, null, null),
249
self=$.self, arg=$.arg
250
251
if(self.$jsobj){
str
Feb 10, 2018
252
if(!self.$jsobj.hasOwnProperty(arg)) throw _b_.KeyError.$factory(str.$factory(arg))
253
else if(self.$jsobj[arg]===undefined) return _b_.NotImplemented
254
else if(self.$jsobj[arg]===null){return $N}
255
return self.$jsobj[arg]
256
}
257
258
259
switch(typeof arg) {
260
case 'string':
261
if (self.$string_dict[arg] !== undefined) return self.$string_dict[arg]
262
break
263
case 'number':
264
if (self.$numeric_dict[arg] !== undefined) return self.$numeric_dict[arg]
267
// since the key is more complex use 'default' method of getting item
268
269
arg = arg.__class__ === $B.$factory ? arg.$dict : arg
270
var _key = _b_.hash(arg),
271
_eq = function(other){return $B.rich_comp('__eq__', arg, other)}
273
var sk = self.$str_hash[_key]
274
if (sk!==undefined && _eq(sk)){
275
return self.$string_dict[sk]
276
}
277
if (self.$numeric_dict[_key]!==undefined && _eq(_key)){
278
return self.$numeric_dict[_key]
282
var obj_ref = self.$object_dict[_key]
283
if(obj_ref!==undefined){
284
// An object with the same hash is already stored
285
// Lookup should fail if equality raises an exception
286
_eq(self.$object_dict[_key][0])
Nov 21, 2015
287
return self.$object_dict[_key][1]
Feb 11, 2018
289
if(self.__class__!==dict){
291
var missing_method = getattr(self.__class__, '__missing__')
292
return missing_method(self, arg)
293
}catch(err){}
294
}
str
Feb 10, 2018
295
throw KeyError.$factory(_b_.str.$factory(arg))
Sep 5, 2014
296
}
297
Feb 11, 2018
298
dict.__hash__ = None
Sep 5, 2014
299
Feb 11, 2018
300
dict.__init__ = function(self){
301
var args = [], pos=0
302
for(var i=1;i<arguments.length;i++){args[pos++]=arguments[i]}
304
switch(args.length) {
305
case 0:
306
return
307
case 1:
Sep 5, 2014
308
var obj = args[0]
309
if(Array.isArray(obj)){
310
var i = obj.length
Feb 11, 2018
311
var si = dict.__setitem__
312
while(i-->0) si(self, obj[i-1][0], obj[i-1][1])
314
}else if(obj.$nat===undefined && isinstance(obj,dict)){
Sep 5, 2014
317
}
Sep 5, 2014
319
if(obj.__class__===$B.JSObject.$dict){
320
// convert a JSObject into a Python dictionary
322
// Attribute $jsobj is used to update the original JS object
323
// when the dictionary is modified
Sep 5, 2014
326
}
329
var $ns=$B.args('dict',0,{},[],args,{},'args','kw')
Sep 5, 2014
330
var args = $ns['args']
331
var kw = $ns['kw']
Sep 5, 2014
334
if(isinstance(args[0],dict)){
Sep 5, 2014
337
}
Sep 5, 2014
339
// format dict([(k1,v1),(k2,v2)...])
341
if(Array.isArray(args[0])){
342
var src = args[0]
Feb 11, 2018
344
var si=dict.__setitem__
345
while(i-->0) si(self, src[i-1][0], src[i-1][1])
347
var iterable = $B.$iter(args[0]),
348
ce = $B.current_exception
349
while(1){
350
try{
351
var elt = next(iterable)
352
var key = getattr(elt,'__getitem__')(0)
353
var value = getattr(elt,'__getitem__')(1)
Feb 11, 2018
354
dict.__setitem__(self, key, value)
356
if(err.__name__==='StopIteration'){
357
$B.current_exception = ce
358
break
359
}
Sep 5, 2014
362
}
363
}
Feb 11, 2018
365
if(dict.__len__(kw) > 0) $copy_dict(self, kw)
Sep 5, 2014
367
}
368
369
var $dict_iterator = $B.$iterator_class('dict iterator')
Feb 11, 2018
370
dict.__iter__ = function(self) {
371
return dict.keys(self)
Sep 5, 2014
372
}
373
Feb 11, 2018
374
dict.__len__ = function(self) {
375
var _count=0
377
if(self.$jsobj){
378
for(var attr in self.$jsobj){if(attr.charAt(0)!='$'){_count++}}
379
return _count
380
}
382
for (var k in self.$numeric_dict) _count++
383
for (var k in self.$string_dict) _count++
384
for (var k in self.$object_dict) _count+= self.$object_dict[k].length
386
return _count
Sep 5, 2014
388
Feb 11, 2018
389
dict.__mro__ = [object]
Sep 5, 2014
390
Feb 11, 2018
391
dict.__ne__ = function(self,other){return !dict.__eq__(self,other)}
Sep 5, 2014
392
Feb 11, 2018
393
dict.__new__ = function(cls){
394
if(cls===undefined){throw _b_.TypeError.$factory('int.__new__(): not enough arguments')}
395
return {
396
__class__:cls.$factory ? cls : cls.$dict,
397
$numeric_dict : {},
398
$object_dict : {},
399
$string_dict : {},
400
$str_hash: {}
401
}
402
}
403
Feb 11, 2018
404
dict.__next__ = function(self){
406
self.$iter = new $item_generator(self)
407
}
408
try {
409
return self.$iter.next()
410
} catch (err) {
411
if (err.__name__ !== "StopIteration") { throw err }
Sep 5, 2014
412
}
413
}
414
Feb 11, 2018
415
dict.__repr__ = function(self){
Sep 5, 2014
416
if(self===undefined) return "<class 'dict'>"
417
if(self.$jsobj){ // wrapper around Javascript object
Feb 11, 2018
418
return dict.__repr__(jsobj2dict(self.$jsobj))
420
var res=[],
421
pos=0,
422
items = new $item_generator(self).as_list()
423
for (var i=0; i < items.length; i++) {
424
var itm = items[i]
425
if((!self.$jsobj && itm[1]===self) ||
426
(self.$jsobj && itm[1]===self.$jsobj)){
427
res[pos++]=repr(itm[0])+': {...}'
429
try{
430
res[pos++]=repr(itm[0])+': '+repr(itm[1])
431
}catch(err){
432
res[pos++]=repr(itm[0])+': <unprintable object>'
433
}
434
}
Sep 5, 2014
435
}
436
return '{'+ res.join(', ') +'}'
Sep 5, 2014
437
}
438
Feb 11, 2018
439
dict.__setitem__ = function(self,key,value){
Nov 21, 2015
441
var $ = $B.args('__setitem__', 3, {self:null, key:null, value:null},
442
['self', 'key', 'value'], arguments, {}, null, null),
443
self=$.self, key=$.key, value=$.value
444
446
if(self.$jsobj.__class__===$B.$type){
447
self.$jsobj[key] = $B.pyobj2jsobj(value)
448
if(key=="__init__" || key=="__new__"){
449
// If class attribute __init__ or __new__ are reset,
450
// the factory function has to change
451
self.$jsobj.$factory = $B.$instance_creator(self.$jsobj)
452
}
453
}else{
454
self.$jsobj[key]=$B.pyobj2jsobj(value)
455
}
456
return $N
459
switch(typeof key) {
460
case 'string':
461
self.$string_dict[key]=value
462
self.$str_hash[str_hash(key)]=key
464
case 'number':
465
self.$numeric_dict[key]=value
469
// if we got here the key is more complex, use default method
471
key = key.__class__ === $B.$factory ? key.$dict : key
472
var _key=hash(key)
473
var _eq=function(other){return $B.rich_comp("__eq__", key, other)};
475
if(self.$numeric_dict[_key]!==undefined && _eq(_key)){
476
self.$numeric_dict[_key] = value
478
}
479
var sk = self.$str_hash[_key]
480
if(sk!==undefined && _eq(sk)){
481
self.$string_dict[sk] = value
483
}
484
485
var obj_ref = self.$object_dict[_key]
486
if(obj_ref!==undefined){
487
// An object with the same hash is already stored
488
// Lookup should fail if equality raises an exception
489
_eq(self.$object_dict[_key][0])
490
}
491
self.$object_dict[_key] = [key, value]
Sep 5, 2014
493
}
494
Feb 11, 2018
495
dict.__str__ = dict.__repr__
Sep 5, 2014
496
497
// add "reflected" methods
Feb 11, 2018
498
$B.make_rmethods(dict)
Sep 5, 2014
499
Feb 11, 2018
500
dict.clear = function(){
Sep 5, 2014
501
// Remove all items from the dictionary.
502
var $ = $B.args('clear',1,{self:null},['self'],arguments,{},null,null),
503
self = $.self
505
self.$numeric_dict={}
506
self.$string_dict={}
507
self.$str_hash={}
508
self.$object_dict={}
510
if(self.$jsobj){
511
for(var attr in self.$jsobj){
512
if(attr.charAt(0) !== '$' && attr !== "__class__"){
513
delete self.$jsobj[attr]
514
}
515
}
516
}
Sep 5, 2014
518
}
519
Feb 11, 2018
520
dict.copy = function(self){
Sep 5, 2014
521
// Return a shallow copy of the dictionary
522
var $ = $B.args('copy',1,{self:null},['self'],arguments,{},null,null),
523
self = $.self,
Feb 11, 2018
524
res = _b_.dict.$factory()
Sep 5, 2014
526
return res
527
}
528
Feb 11, 2018
529
dict.fromkeys = function(){
Nov 21, 2015
530
531
var $ = $B.args('fromkeys', 3, {cls:null, keys:null, value:null},
532
['cls', 'keys', 'value'], arguments, {value:_b_.None}, null, null),
Nov 21, 2015
533
keys=$.keys, value=$.value
Sep 5, 2014
535
// class method
536
var klass = $.cls,
538
keys_iter = $B.$iter(keys),
539
ce = $B.current_exception
Sep 5, 2014
541
while(1){
542
try{
543
var key = _b_.next(keys_iter)
Feb 11, 2018
544
if(klass===dict){dict.__setitem__(res, key, value)}
545
else{_b_.getattr(res, "__setitem__")(key,value)}
Sep 5, 2014
546
}catch(err){
547
if($B.is_exc(err,[_b_.StopIteration])){
Sep 5, 2014
549
return res
550
}
551
throw err
552
}
553
}
554
}
Feb 11, 2018
555
dict.fromkeys.$type = 'classmethod'
Sep 5, 2014
556
Feb 11, 2018
557
dict.get = function(){
558
var $ = $B.args('get', 3, {self:null, key:null, _default:null},
559
['self', 'key', '_default'], arguments, {_default:$N}, null, null)
Feb 11, 2018
561
try{return dict.__getitem__($.self, $.key)}
562
catch(err){
563
if(_b_.isinstance(err, _b_.KeyError)){return $._default}
564
else{throw err}
565
}
566
}
567
568
var $dict_itemsDict = $B.$iterator_class('dict_items')
569
Feb 11, 2018
570
dict.items = function(self){
571
if (arguments.length > 1) {
572
var _len=arguments.length - 1
573
var _msg="items() takes no arguments ("+_len+" given)"
574
throw _b_.TypeError.$factory(_msg)
575
}
576
return $iterator_wrapper(new $item_iterator(self), $dict_itemsDict)
577
}
578
Nov 21, 2015
579
var $dict_keysDict = $B.$iterator_class('dict_keys')
580
Feb 11, 2018
581
dict.keys = function(self){
Nov 21, 2015
582
if (arguments.length > 1) {
583
var _len=arguments.length - 1
584
var _msg="keys() takes no arguments ("+_len+" given)"
585
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
586
}
587
return $iterator_wrapper(new $key_iterator(self),$dict_keysDict)
588
}
589
Feb 11, 2018
590
dict.pop = function(){
Nov 21, 2015
591
592
var $ = $B.args('pop', 3, {self:null, key: null, _default:null},
593
['self', 'key', '_default'], arguments, {_default:$N}, null, null),
594
self=$.self, key=$.key, _default=$._default
595
Sep 5, 2014
596
try{
Feb 11, 2018
597
var res = dict.__getitem__(self,key)
598
dict.__delitem__(self,key)
Sep 5, 2014
599
return res
600
}catch(err){
601
if(err.__name__==='KeyError'){
602
if(_default!==undefined) return _default
603
throw err
604
}
605
throw err
606
}
607
}
608
Feb 11, 2018
609
dict.popitem = function(self){
611
try{
612
var itm = new $item_iterator(self).next()
Feb 11, 2018
613
dict.__delitem__(self,itm[0])
Feb 11, 2018
614
return _b_.tuple.$factory(itm)
615
}catch(err) {
616
if (err.__name__ == "StopIteration") {
618
throw KeyError.$factory("'popitem(): dictionary is empty'")
Sep 5, 2014
621
}
622
Feb 11, 2018
623
dict.setdefault = function(){
Nov 21, 2015
624
625
var $ = $B.args('setdefault', 3, {self:null, key: null, _default:null},
626
['self', 'key', '_default'], arguments, {_default:$N}, null, null),
Nov 21, 2015
627
self=$.self, key=$.key, _default=$._default
628
Feb 11, 2018
629
try{return dict.__getitem__(self,key)}
Sep 5, 2014
630
catch(err){
631
if(_default===undefined) _default=$N
Feb 11, 2018
632
dict.__setitem__(self,key,_default)
Sep 5, 2014
633
return _default
634
}
635
}
636
Feb 11, 2018
637
dict.update = function(self){
Nov 21, 2015
638
639
var $ = $B.args('update',1,{'self':null},['self'],arguments,{},'args','kw'),
640
self=$.self, args=$.args, kw=$.kw
641
if(args.length>0) {
642
var o=args[0]
643
if (isinstance(o,dict)){
644
if(o.$jsobj){o = jsobj2dict(o);}
645
$copy_dict(self, o)
646
} else if (hasattr(o, '__getitem__') && hasattr(o, 'keys')) {
Feb 11, 2018
647
var _keys=_b_.list.$factory(getattr(o, 'keys')())
Feb 11, 2018
648
var si=dict.__setitem__
649
var i=_keys.length
650
while(i--) {
651
//for (var i=0; i < _keys.length; i++) {
652
var _value = getattr(o, '__getitem__')(_keys[i])
653
si(self, _keys[i], _value)
Sep 5, 2014
656
}
Sep 5, 2014
659
}
660
Nov 21, 2015
661
var $dict_valuesDict = $B.$iterator_class('dict_values')
662
Feb 11, 2018
663
dict.values = function(self){
Nov 21, 2015
664
if (arguments.length > 1) {
665
var _len=arguments.length - 1
666
var _msg="values() takes no arguments ("+_len+" given)"
667
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
668
}
669
return $iterator_wrapper(new $value_iterator(self), $dict_valuesDict)
670
}
671
Feb 11, 2018
672
dict.$factory = function(args, second){
Feb 11, 2018
674
var res = {__class__:dict,
675
$numeric_dict : {},
676
$object_dict : {},
677
$string_dict : {},
681
if(args===undefined){return res}
683
if(second===undefined){
684
if(Array.isArray(args)){
685
// Form "dict([[key1, value1], [key2,value2], ...])"
686
var i = -1, stop = args.length-1
Feb 11, 2018
687
var si = dict.__setitem__
688
while(i++<stop){
689
var item=args[i]
690
switch(typeof item[0]) {
691
case 'string':
692
res.$string_dict[item[0]]=item[1]
693
res.$str_hash[str_hash(item[0])]=item[0]
694
break;
695
case 'number':
696
res.$numeric_dict[item[0]]=item[1]
697
break
698
default:
699
si(res, item[0], item[1])
700
break
701
}
702
}
703
return res
704
}else if(args.$nat=='kw'){
705
// Form dict(k1=v1, k2=v2...)
706
var kw = args['kw']
707
for(var attr in kw){
708
switch(typeof attr) {
709
case 'string':
710
res.$string_dict[attr]=kw[attr]
711
res.$str_hash[str_hash(attr)]=attr
712
break;
713
case 'number':
714
res.$numeric_dict[attr]=kw[attr]
715
break
716
default:
717
si(res, attr, kw[attr])
718
break
719
}
722
}else if(args.$jsobj){
723
res.$jsobj = {}
724
for(var attr in args.$jsobj){res.$jsobj[attr] = args.$jsobj[attr]}
725
return res
Sep 5, 2014
729
// apply __init__ with arguments of dict()
730
var _args = [res], pos=1
731
for(var i=0, _len_i = arguments.length; i < _len_i;i++){_args[pos++]=arguments[i]}
Feb 11, 2018
732
dict.__init__.apply(null,_args)
Sep 5, 2014
733
return res
734
}
Sep 5, 2014
736
_b_.dict = dict
Feb 11, 2018
738
$B.set_func_names(dict, "builtins")
740
// following are used for faster access elsewhere
741
$B.$dict_iterator = function(d) { return new $item_generator(d) }
Feb 11, 2018
742
$B.$dict_length = dict.__len__
743
$B.$dict_getitem = dict.__getitem__
744
$B.$dict_get = dict.get
745
$B.$dict_set = dict.__setitem__
746
$B.$dict_contains = dict.__contains__
747
$B.$dict_items = function(d) { return new $item_generator(d).as_list() }
748
$B.$copy_dict = $copy_dict // copy from right to left
Feb 11, 2018
749
$B.$dict_get_copy = dict.copy // return a shallow copy
752
// Class for attribute __dict__ of classes
753
var mappingproxyDict = {
754
__class__ : $B.$type,
755
__name__ : "mappingproxy"
756
}
757
mappingproxyDict.__mro__ = [object]
758
759
mappingproxyDict.__setitem__ = function(){
760
throw _b_.TypeError.$factory("'mappingproxy' object does not support item assignment")
764
function mappingproxy(obj){
765
var res = obj_dict(obj)
766
res.__class__ = mappingproxyDict
767
return res
768
}
769
mappingproxy.__class__ = $B.$factory
770
mappingproxy.$dict = mappingproxyDict
771
mappingproxyDict.$factory = mappingproxy
772
$B.mappingproxy = mappingproxy
773
Feb 11, 2018
775
var d = dict.$factory()
776
for(var attr in x){
777
if(attr.charAt(0)!='$' && attr!=='__class__'){
778
if(x[attr].$jsobj===x){
779
d.$string_dict[attr] = d
780
}else{
781
d.$string_dict[attr] = x[attr]
782
}
787
$B.obj_dict = function(obj){
788
var klass = $B.get_class(obj)
789
if(klass !==undefined && klass.$native){
790
throw _b_.AttributeError.$factory(klass.__name__+
791
" has no attribute '__dict__'")}
Feb 11, 2018
792
var res = dict.$factory()
793
res.$jsobj = obj
794
return res
795
}
796
Sep 5, 2014
797
})(__BRYTHON__)