Skip to content
Permalink
Newer
Older
100644 786 lines (672 sloc) 21.9 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 = {
Feb 11, 2018
21
__class__: _b_.type,
Feb 11, 2018
22
__module__: "builtins",
Feb 11, 2018
23
__mro__: [object],
Sep 5, 2014
24
__name__ : 'dict',
Feb 11, 2018
25
$is_class: true,
26
$native: true
Sep 5, 2014
27
}
28
29
var $key_iterator = function(d) {
30
this.d = d
31
this.current = 0
32
this.iter = new $item_generator(d)
33
}
34
$key_iterator.prototype.length = function(){return this.iter.items.length}
35
$key_iterator.prototype.next = function(){return this.iter.next()[0]}
36
37
var $value_iterator = function(d) {
38
this.d = d
39
this.current = 0
40
this.iter = new $item_generator(d)
41
}
42
$value_iterator.prototype.length = function(){return this.iter.items.length}
43
$value_iterator.prototype.next = function(){return this.iter.next()[1]}
44
45
var $item_generator = function(d) {
47
this.i = 0
49
if(d.$jsobj){
50
this.items = []
52
if(attr.charAt(0)!='$'){
53
val = d.$jsobj[attr];
54
if(val === undefined){val = _b_.NotImplemented}
55
else if(val === null){val = $N}
56
this.items.push([attr, val])
62
var items=[]
65
items[pos++]=[parseFloat(k), d.$numeric_dict[k]]
68
for (var k in d.$string_dict) {items[pos++]=[k, d.$string_dict[k]]}
70
for (var k in d.$object_dict) {items[pos++] = d.$object_dict[k]}
71
72
this.items=items
Feb 9, 2015
74
75
$item_generator.prototype.next = function() {
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 }
Feb 11, 2018
91
$item_iterator.prototype.next = function() { return _b_.tuple.$factory(this.iter.next()) }
92
93
var $copy_dict = function(left, right) {
94
var _l=new $item_generator(right).as_list(),
Feb 11, 2018
95
si=dict.__setitem__,
97
while(i--) si(left, _l[i][0], _l[i][1])
100
function toSet(items){
101
// Build a set from the iteration on items
102
var res = []
103
while(true){
104
try{res.push(items.next())}
105
catch(err){break}
106
}
Feb 11, 2018
107
return _b_.set.$factory(res)
108
}
109
110
var $iterator_wrapper = function(items,klass){
111
var res = {
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(){
120
return items.next()
121
},
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
}
127
return klass.__name__+'(['+ s.join(',') + '])'
128
},
129
}
130
res.__str__ = res.toString = res.__repr__
131
return res
132
}
133
Feb 11, 2018
134
dict.__bool__ = function () {
Nov 21, 2015
135
var $=$B.args('__bool__',1,{self:null},['self'],arguments,{},null,null)
Feb 11, 2018
136
return dict.__len__($.self) > 0
Feb 11, 2018
139
dict.__contains__ = function(){
Nov 21, 2015
140
141
var $ = $B.args('__contains__', 2, {self:null, item:null},
142
['self', 'item'], arguments, {}, null, null),
143
self=$.self, item=$.item
Nov 21, 2015
144
Sep 5, 2014
145
if(self.$jsobj) return self.$jsobj[item]!==undefined
Nov 21, 2015
146
147
switch(typeof item) {
148
case 'string':
149
return self.$string_dict[item] !==undefined
150
case 'number':
151
return self.$numeric_dict[item] !==undefined
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
var _key = _b_.hash(arg),
270
_eq = function(other){return $B.rich_comp('__eq__', arg, other)}
272
var sk = self.$str_hash[_key]
273
if (sk!==undefined && _eq(sk)){
274
return self.$string_dict[sk]
275
}
276
if (self.$numeric_dict[_key]!==undefined && _eq(_key)){
277
return self.$numeric_dict[_key]
281
var obj_ref = self.$object_dict[_key]
282
if(obj_ref!==undefined){
283
// An object with the same hash is already stored
284
// Lookup should fail if equality raises an exception
285
_eq(self.$object_dict[_key][0])
Nov 21, 2015
286
return self.$object_dict[_key][1]
Feb 11, 2018
288
if(self.__class__!==dict){
290
var missing_method = getattr(self.__class__, '__missing__')
291
return missing_method(self, arg)
292
}catch(err){}
293
}
str
Feb 10, 2018
294
throw KeyError.$factory(_b_.str.$factory(arg))
Sep 5, 2014
295
}
296
Feb 11, 2018
297
dict.__hash__ = None
Sep 5, 2014
298
Feb 11, 2018
299
dict.__init__ = function(self){
300
var args = [], pos=0
301
for(var i=1;i<arguments.length;i++){args[pos++]=arguments[i]}
303
switch(args.length) {
304
case 0:
305
return
306
case 1:
Sep 5, 2014
307
var obj = args[0]
308
if(Array.isArray(obj)){
309
var i = obj.length
Feb 11, 2018
310
var si = dict.__setitem__
311
while(i-->0) si(self, obj[i-1][0], obj[i-1][1])
313
}else if(obj.$nat===undefined && isinstance(obj,dict)){
Sep 5, 2014
316
}
Feb 12, 2018
318
if(obj.__class__===$B.JSObject){
Sep 5, 2014
319
// convert a JSObject into a Python dictionary
321
// Attribute $jsobj is used to update the original JS object
322
// when the dictionary is modified
Sep 5, 2014
325
}
328
var $ns=$B.args('dict',0,{},[],args,{},'args','kw')
Sep 5, 2014
329
var args = $ns['args']
330
var kw = $ns['kw']
Sep 5, 2014
333
if(isinstance(args[0],dict)){
Sep 5, 2014
336
}
Sep 5, 2014
338
// format dict([(k1,v1),(k2,v2)...])
340
if(Array.isArray(args[0])){
341
var src = args[0]
Feb 11, 2018
343
var si=dict.__setitem__
344
while(i-->0) si(self, src[i-1][0], src[i-1][1])
346
var iterable = $B.$iter(args[0]),
347
ce = $B.current_exception
348
while(1){
349
try{
350
var elt = next(iterable)
351
var key = getattr(elt,'__getitem__')(0)
352
var value = getattr(elt,'__getitem__')(1)
Feb 11, 2018
353
dict.__setitem__(self, key, value)
355
if(err.__name__==='StopIteration'){
356
$B.current_exception = ce
357
break
358
}
Sep 5, 2014
361
}
362
}
Feb 11, 2018
364
if(dict.__len__(kw) > 0) $copy_dict(self, kw)
Sep 5, 2014
366
}
367
368
var $dict_iterator = $B.$iterator_class('dict iterator')
Feb 11, 2018
369
dict.__iter__ = function(self) {
370
return dict.keys(self)
Sep 5, 2014
371
}
372
Feb 11, 2018
373
dict.__len__ = function(self) {
374
var _count=0
376
if(self.$jsobj){
377
for(var attr in self.$jsobj){if(attr.charAt(0)!='$'){_count++}}
378
return _count
379
}
381
for (var k in self.$numeric_dict) _count++
382
for (var k in self.$string_dict) _count++
383
for (var k in self.$object_dict) _count+= self.$object_dict[k].length
385
return _count
Sep 5, 2014
387
Feb 11, 2018
388
dict.__ne__ = function(self,other){return !dict.__eq__(self,other)}
Sep 5, 2014
389
Feb 11, 2018
390
dict.__new__ = function(cls){
391
if(cls===undefined){throw _b_.TypeError.$factory('int.__new__(): not enough arguments')}
394
$numeric_dict : {},
395
$object_dict : {},
396
$string_dict : {},
397
$str_hash: {}
398
}
399
}
400
Feb 11, 2018
401
dict.__next__ = function(self){
403
self.$iter = new $item_generator(self)
404
}
405
try {
406
return self.$iter.next()
407
} catch (err) {
408
if (err.__name__ !== "StopIteration") { throw err }
Sep 5, 2014
409
}
410
}
411
Feb 11, 2018
412
dict.__repr__ = function(self){
Sep 5, 2014
413
if(self===undefined) return "<class 'dict'>"
414
if(self.$jsobj){ // wrapper around Javascript object
Feb 11, 2018
415
return dict.__repr__(jsobj2dict(self.$jsobj))
417
var res=[],
418
pos=0,
419
items = new $item_generator(self).as_list()
420
for (var i=0; i < items.length; i++) {
421
var itm = items[i]
422
if((!self.$jsobj && itm[1]===self) ||
423
(self.$jsobj && itm[1]===self.$jsobj)){
424
res[pos++]=repr(itm[0])+': {...}'
426
try{
427
res[pos++]=repr(itm[0])+': '+repr(itm[1])
428
}catch(err){
429
res[pos++]=repr(itm[0])+': <unprintable object>'
430
}
431
}
Sep 5, 2014
432
}
433
return '{'+ res.join(', ') +'}'
Sep 5, 2014
434
}
435
Feb 11, 2018
436
dict.__setitem__ = function(self,key,value){
Nov 21, 2015
438
var $ = $B.args('__setitem__', 3, {self:null, key:null, value:null},
439
['self', 'key', 'value'], arguments, {}, null, null),
440
self=$.self, key=$.key, value=$.value
441
Feb 11, 2018
443
if(self.$jsobj.__class__===_b_.type){
444
self.$jsobj[key] = $B.pyobj2jsobj(value)
445
if(key=="__init__" || key=="__new__"){
446
// If class attribute __init__ or __new__ are reset,
447
// the factory function has to change
448
self.$jsobj.$factory = $B.$instance_creator(self.$jsobj)
449
}
450
}else{
451
self.$jsobj[key]=$B.pyobj2jsobj(value)
452
}
453
return $N
456
switch(typeof key) {
457
case 'string':
458
self.$string_dict[key]=value
459
self.$str_hash[str_hash(key)]=key
461
case 'number':
462
self.$numeric_dict[key]=value
466
// if we got here the key is more complex, use default method
468
var _key=hash(key)
469
var _eq=function(other){return $B.rich_comp("__eq__", key, other)};
471
if(self.$numeric_dict[_key]!==undefined && _eq(_key)){
472
self.$numeric_dict[_key] = value
474
}
475
var sk = self.$str_hash[_key]
476
if(sk!==undefined && _eq(sk)){
477
self.$string_dict[sk] = value
479
}
480
481
var obj_ref = self.$object_dict[_key]
482
if(obj_ref!==undefined){
483
// An object with the same hash is already stored
484
// Lookup should fail if equality raises an exception
485
_eq(self.$object_dict[_key][0])
486
}
487
self.$object_dict[_key] = [key, value]
Sep 5, 2014
489
}
490
Feb 11, 2018
491
dict.__str__ = dict.__repr__
Sep 5, 2014
492
493
// add "reflected" methods
Feb 11, 2018
494
$B.make_rmethods(dict)
Sep 5, 2014
495
Feb 11, 2018
496
dict.clear = function(){
Sep 5, 2014
497
// Remove all items from the dictionary.
498
var $ = $B.args('clear',1,{self:null},['self'],arguments,{},null,null),
499
self = $.self
501
self.$numeric_dict={}
502
self.$string_dict={}
503
self.$str_hash={}
504
self.$object_dict={}
506
if(self.$jsobj){
507
for(var attr in self.$jsobj){
508
if(attr.charAt(0) !== '$' && attr !== "__class__"){
509
delete self.$jsobj[attr]
510
}
511
}
512
}
Sep 5, 2014
514
}
515
Feb 11, 2018
516
dict.copy = function(self){
Sep 5, 2014
517
// Return a shallow copy of the dictionary
518
var $ = $B.args('copy',1,{self:null},['self'],arguments,{},null,null),
519
self = $.self,
Feb 11, 2018
520
res = _b_.dict.$factory()
Sep 5, 2014
522
return res
523
}
524
Feb 11, 2018
525
dict.fromkeys = function(){
Nov 21, 2015
526
527
var $ = $B.args('fromkeys', 3, {cls:null, keys:null, value:null},
528
['cls', 'keys', 'value'], arguments, {value:_b_.None}, null, null),
Nov 21, 2015
529
keys=$.keys, value=$.value
Sep 5, 2014
531
// class method
532
var klass = $.cls,
534
keys_iter = $B.$iter(keys),
535
ce = $B.current_exception
Sep 5, 2014
537
while(1){
538
try{
539
var key = _b_.next(keys_iter)
Feb 11, 2018
540
if(klass===dict){dict.__setitem__(res, key, value)}
541
else{_b_.getattr(res, "__setitem__")(key,value)}
Sep 5, 2014
542
}catch(err){
543
if($B.is_exc(err,[_b_.StopIteration])){
Sep 5, 2014
545
return res
546
}
547
throw err
548
}
549
}
550
}
Feb 11, 2018
551
dict.fromkeys.$type = 'classmethod'
Sep 5, 2014
552
Feb 11, 2018
553
dict.get = function(){
554
var $ = $B.args('get', 3, {self:null, key:null, _default:null},
555
['self', 'key', '_default'], arguments, {_default:$N}, null, null)
Feb 11, 2018
557
try{return dict.__getitem__($.self, $.key)}
558
catch(err){
559
if(_b_.isinstance(err, _b_.KeyError)){return $._default}
560
else{throw err}
561
}
562
}
563
564
var $dict_itemsDict = $B.$iterator_class('dict_items')
565
Feb 11, 2018
566
dict.items = function(self){
567
if (arguments.length > 1) {
568
var _len=arguments.length - 1
569
var _msg="items() takes no arguments ("+_len+" given)"
570
throw _b_.TypeError.$factory(_msg)
571
}
572
return $iterator_wrapper(new $item_iterator(self), $dict_itemsDict)
573
}
574
Nov 21, 2015
575
var $dict_keysDict = $B.$iterator_class('dict_keys')
576
Feb 11, 2018
577
dict.keys = function(self){
Nov 21, 2015
578
if (arguments.length > 1) {
579
var _len=arguments.length - 1
580
var _msg="keys() takes no arguments ("+_len+" given)"
581
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
582
}
583
return $iterator_wrapper(new $key_iterator(self),$dict_keysDict)
584
}
585
Feb 11, 2018
586
dict.pop = function(){
Nov 21, 2015
587
588
var $ = $B.args('pop', 3, {self:null, key: null, _default:null},
589
['self', 'key', '_default'], arguments, {_default:$N}, null, null),
590
self=$.self, key=$.key, _default=$._default
591
Sep 5, 2014
592
try{
Feb 11, 2018
593
var res = dict.__getitem__(self,key)
594
dict.__delitem__(self,key)
Sep 5, 2014
595
return res
596
}catch(err){
597
if(err.__name__==='KeyError'){
598
if(_default!==undefined) return _default
599
throw err
600
}
601
throw err
602
}
603
}
604
Feb 11, 2018
605
dict.popitem = function(self){
607
try{
608
var itm = new $item_iterator(self).next()
Feb 11, 2018
609
dict.__delitem__(self,itm[0])
Feb 11, 2018
610
return _b_.tuple.$factory(itm)
611
}catch(err) {
612
if (err.__name__ == "StopIteration") {
614
throw KeyError.$factory("'popitem(): dictionary is empty'")
Sep 5, 2014
617
}
618
Feb 11, 2018
619
dict.setdefault = function(){
Nov 21, 2015
620
621
var $ = $B.args('setdefault', 3, {self:null, key: null, _default:null},
622
['self', 'key', '_default'], arguments, {_default:$N}, null, null),
Nov 21, 2015
623
self=$.self, key=$.key, _default=$._default
624
Feb 11, 2018
625
try{return dict.__getitem__(self,key)}
Sep 5, 2014
626
catch(err){
627
if(_default===undefined) _default=$N
Feb 11, 2018
628
dict.__setitem__(self,key,_default)
Sep 5, 2014
629
return _default
630
}
631
}
632
Feb 11, 2018
633
dict.update = function(self){
Nov 21, 2015
634
635
var $ = $B.args('update',1,{'self':null},['self'],arguments,{},'args','kw'),
636
self=$.self, args=$.args, kw=$.kw
637
if(args.length>0) {
638
var o=args[0]
639
if (isinstance(o,dict)){
640
if(o.$jsobj){o = jsobj2dict(o);}
641
$copy_dict(self, o)
642
} else if (hasattr(o, '__getitem__') && hasattr(o, 'keys')) {
Feb 11, 2018
643
var _keys=_b_.list.$factory(getattr(o, 'keys')())
Feb 11, 2018
644
var si=dict.__setitem__
645
var i=_keys.length
646
while(i--) {
647
//for (var i=0; i < _keys.length; i++) {
648
var _value = getattr(o, '__getitem__')(_keys[i])
649
si(self, _keys[i], _value)
Sep 5, 2014
652
}
Sep 5, 2014
655
}
656
Nov 21, 2015
657
var $dict_valuesDict = $B.$iterator_class('dict_values')
658
Feb 11, 2018
659
dict.values = function(self){
Nov 21, 2015
660
if (arguments.length > 1) {
661
var _len=arguments.length - 1
662
var _msg="values() takes no arguments ("+_len+" given)"
663
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
664
}
665
return $iterator_wrapper(new $value_iterator(self), $dict_valuesDict)
666
}
667
Feb 11, 2018
668
dict.$factory = function(args, second){
Feb 11, 2018
670
var res = {__class__:dict,
671
$numeric_dict : {},
672
$object_dict : {},
673
$string_dict : {},
677
if(args===undefined){return res}
679
if(second===undefined){
680
if(Array.isArray(args)){
681
// Form "dict([[key1, value1], [key2,value2], ...])"
682
var i = -1, stop = args.length-1
Feb 11, 2018
683
var si = dict.__setitem__
684
while(i++<stop){
685
var item=args[i]
686
switch(typeof item[0]) {
687
case 'string':
688
res.$string_dict[item[0]]=item[1]
689
res.$str_hash[str_hash(item[0])]=item[0]
690
break;
691
case 'number':
692
res.$numeric_dict[item[0]]=item[1]
693
break
694
default:
695
si(res, item[0], item[1])
696
break
697
}
698
}
699
return res
700
}else if(args.$nat=='kw'){
701
// Form dict(k1=v1, k2=v2...)
702
var kw = args['kw']
703
for(var attr in kw){
704
switch(typeof attr) {
705
case 'string':
706
res.$string_dict[attr]=kw[attr]
707
res.$str_hash[str_hash(attr)]=attr
708
break;
709
case 'number':
710
res.$numeric_dict[attr]=kw[attr]
711
break
712
default:
713
si(res, attr, kw[attr])
714
break
715
}
718
}else if(args.$jsobj){
719
res.$jsobj = {}
720
for(var attr in args.$jsobj){res.$jsobj[attr] = args.$jsobj[attr]}
721
return res
Sep 5, 2014
725
// apply __init__ with arguments of dict()
726
var _args = [res], pos=1
727
for(var i=0, _len_i = arguments.length; i < _len_i;i++){_args[pos++]=arguments[i]}
Feb 11, 2018
728
dict.__init__.apply(null,_args)
Sep 5, 2014
729
return res
730
}
Sep 5, 2014
732
_b_.dict = dict
Feb 11, 2018
734
$B.set_func_names(dict, "builtins")
736
// following are used for faster access elsewhere
737
$B.$dict_iterator = function(d) { return new $item_generator(d) }
Feb 11, 2018
738
$B.$dict_length = dict.__len__
739
$B.$dict_getitem = dict.__getitem__
740
$B.$dict_get = dict.get
741
$B.$dict_set = dict.__setitem__
742
$B.$dict_contains = dict.__contains__
743
$B.$dict_items = function(d) { return new $item_generator(d).as_list() }
744
$B.$copy_dict = $copy_dict // copy from right to left
Feb 11, 2018
745
$B.$dict_get_copy = dict.copy // return a shallow copy
748
// Class for attribute __dict__ of classes
Feb 12, 2018
749
var mappingproxy = $B.make_class("mappingproxy",
750
function(obj){
751
var res = obj_dict(obj)
752
res.__class__ = mappingproxy
753
return res
754
}
755
)
Feb 12, 2018
757
mappingproxy.__setitem__ = function(){
758
throw _b_.TypeError.$factory("'mappingproxy' object does not support item assignment")
Feb 12, 2018
761
$B.set_func_names(mappingproxy, "builtins")
Feb 11, 2018
764
var d = dict.$factory()
765
for(var attr in x){
766
if(attr.charAt(0)!='$' && attr!=='__class__'){
767
if(x[attr].$jsobj===x){
768
d.$string_dict[attr] = d
769
}else{
770
d.$string_dict[attr] = x[attr]
771
}
776
$B.obj_dict = function(obj){
777
var klass = $B.get_class(obj)
778
if(klass !==undefined && klass.$native){
779
throw _b_.AttributeError.$factory(klass.__name__+
780
" has no attribute '__dict__'")}
Feb 11, 2018
781
var res = dict.$factory()
782
res.$jsobj = obj
783
return res
784
}
785
Sep 5, 2014
786
})(__BRYTHON__)