Skip to content
Permalink
Newer
Older
100644 818 lines (703 sloc) 22.7 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
15
var setitem = dict.__setitem__,
16
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],
Mar 7, 2018
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 = []
Mar 7, 2018
52
if(attr.charAt(0) != "$"){
53
var 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 = []
63
for(var k in d.$numeric_dict){
64
items.push([parseFloat(k), d.$numeric_dict[k]])
67
for(var k in d.$string_dict){items.push([k, d.$string_dict[k]])}
69
for(var k in d.$object_dict){items.push(d.$object_dict[k])}
71
this.items = items
Feb 9, 2015
73
74
$item_generator.prototype.next = function() {
Mar 23, 2018
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}
90
$item_iterator.prototype.next = function(){
91
return _b_.tuple.$factory(this.iter.next())
92
}
94
var $copy_dict = function(left, right){
95
var _l = new $item_generator(right).as_list(),
96
si = dict.__setitem__,
97
i = _l.length
98
while(i--){si(left, _l[i][0], _l[i][1])}
101
function toSet(items){
102
// Build a set from the iteration on items
103
var res = []
104
while(true){
105
try{res.push(items.next())}
106
catch(err){break}
107
}
Feb 11, 2018
108
return _b_.set.$factory(res)
109
}
110
111
var $iterator_wrapper = function(items, klass){
113
__class__: klass,
114
__eq__: function(other){
115
// compare set of items to other
116
return $B.rich_comp("__eq__", toSet(items), other)
118
__iter__: function(){items.iter.i = 0; return res},
119
__len__: function(){return items.length()},
120
__next__: function(){
123
__repr__:function(){
124
var s = []
125
for(var i = 0, len = items.length(); i < len; i++){
126
s.push(_b_.repr(items.next()))
127
}
Mar 7, 2018
128
return klass.__name__ + "(["+ s.join(",") + "])"
130
}
131
res.__str__ = res.toString = res.__repr__
132
return res
133
}
134
Feb 11, 2018
135
dict.__bool__ = function () {
Mar 7, 2018
136
var $ = $B.args("__bool__", 1, {self: null}, ["self"],
137
arguments, {}, null, null)
Feb 11, 2018
138
return dict.__len__($.self) > 0
Feb 11, 2018
141
dict.__contains__ = function(){
Nov 21, 2015
142
Mar 7, 2018
143
var $ = $B.args("__contains__", 2, {self: null, item: null},
144
["self", "item"], arguments, {}, null, null),
145
self = $.self,
146
item = $.item
Nov 21, 2015
147
148
if(self.$jsobj){return self.$jsobj[item] !== undefined}
Nov 21, 2015
149
150
switch(typeof item) {
Mar 7, 2018
151
case "string":
152
return self.$string_dict[item] !== undefined
153
case "number":
154
return self.$numeric_dict[item] !== undefined
156
157
var _key = hash(item)
Mar 23, 2018
158
if(self.$str_hash[_key] !== undefined &&
159
$B.rich_comp("__eq__", item, self.$str_hash[_key])){return true}
Mar 23, 2018
160
if(self.$numeric_dict[_key] !== undefined &&
161
$B.rich_comp("__eq__", item, _key)){return true}
Mar 23, 2018
162
if(self.$object_dict[_key] !== undefined){
Nov 21, 2015
163
// If the key is an object, its hash must be in the dict keys but the
164
// key itself must compare equal to the key associated with the hash
165
// For instance :
166
//
167
// class X:
168
// def __hash__(self): return hash('u')
169
//
Nov 21, 2015
170
// a = {'u': 'a', X(): 'b'}
171
// assert set(a.values()) == {'a', 'b'}
Nov 21, 2015
172
// assert not X() in a
173
return $B.rich_comp("__eq__", item, self.$object_dict[_key][0])
174
}
175
return false
Sep 5, 2014
176
}
177
Feb 11, 2018
178
dict.__delitem__ = function(){
Nov 21, 2015
179
Mar 7, 2018
180
var $ = $B.args("__eq__", 2, {self: null, arg: null},
181
["self", "arg"], arguments, {}, null, null),
182
self = $.self,
183
arg = $.arg
Nov 21, 2015
184
185
if(self.$jsobj){
186
if(self.$jsobj[arg] === undefined){throw KeyError.$factory(arg)}
187
delete self.$jsobj[arg]
Mar 23, 2018
190
switch(typeof arg){
Mar 7, 2018
191
case "string":
192
if(self.$string_dict[arg] === undefined){
193
throw KeyError.$factory(_b_.str.$factory(arg))
194
}
195
delete self.$string_dict[arg]
196
delete self.$str_hash[str_hash(arg)]
197
return $N
Mar 7, 2018
198
case "number":
199
if(self.$numeric_dict[arg] === undefined){
200
throw KeyError.$factory(_b_.str.$factory(arg))
201
}
202
delete self.$numeric_dict[arg]
203
return $N
205
// go with defaults
Mar 7, 2018
207
var _key = hash(arg)
Mar 23, 2018
209
if(self.$object_dict[_key] !== undefined){
Nov 21, 2015
210
delete self.$object_dict[_key]
213
if(self.$jsobj){delete self.$jsobj[arg]}
Sep 5, 2014
215
}
216
Feb 11, 2018
217
dict.__eq__ = function(){
Mar 7, 2018
218
var $ = $B.args("__eq__", 2, {self: null, other: null},
219
["self", "other"], arguments, {}, null, null),
220
self = $.self,
221
other = $.other
Nov 21, 2015
222
Mar 7, 2018
223
if(! isinstance(other, dict)){return false}
225
if(self.$jsobj){self = jsobj2dict(self.$jsobj)}
226
if(other.$jsobj){other = jsobj2dict(other.$jsobj)}
228
if(dict.__len__(self) != dict.__len__(other)){return false}
230
if((self.$numeric_dict.length != other.$numeric_dict.length) ||
231
(self.$string_dict.length != other.$string_dict.length) ||
232
(self.$object_dict.length != other.$object_dict.length)){
233
return false
Nov 21, 2015
235
for(var k in self.$numeric_dict){
236
if(!$B.rich_comp("__eq__", other.$numeric_dict[k],
237
self.$numeric_dict[k])){
Nov 21, 2015
238
return false
239
}
240
}
241
for(var k in self.$string_dict){
242
if(!$B.rich_comp("__eq__", other.$string_dict[k],
243
self.$string_dict[k])){
Nov 21, 2015
244
return false
245
}
246
}
247
for(var k in self.$object_dict){
248
if(!$B.rich_comp("__eq__", other.$object_dict[k][1],
249
self.$object_dict[k][1])){
Nov 21, 2015
250
return false
251
}
252
}
Nov 21, 2015
255
Sep 5, 2014
256
}
257
Feb 11, 2018
258
dict.__getitem__ = function(){
Mar 7, 2018
259
var $ = $B.args("__getitem__", 2, {self: null, arg: null},
260
["self", "arg"], arguments, {}, null, null),
261
self = $.self,
262
arg = $.arg
263
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]
271
}
272
273
274
switch(typeof arg){
Mar 7, 2018
275
case "string":
276
if(self.$string_dict[arg] !== undefined){
277
return self.$string_dict[arg]
278
}
279
break
Mar 7, 2018
280
case "number":
281
if(self.$numeric_dict[arg] !== undefined){
282
return self.$numeric_dict[arg]
283
}
286
// since the key is more complex use 'default' method of getting item
287
288
var _key = _b_.hash(arg),
Mar 7, 2018
289
_eq = function(other){return $B.rich_comp("__eq__", arg, other)}
291
var sk = self.$str_hash[_key]
Mar 23, 2018
292
if(sk !== undefined && _eq(sk)){
293
return self.$string_dict[sk]
294
}
Mar 23, 2018
295
if(self.$numeric_dict[_key] !== undefined && _eq(_key)){
296
return self.$numeric_dict[_key]
300
var obj_ref = self.$object_dict[_key]
301
if(obj_ref !== undefined){
302
// An object with the same hash is already stored
303
// Lookup should fail if equality raises an exception
304
_eq(self.$object_dict[_key][0])
Nov 21, 2015
305
return self.$object_dict[_key][1]
307
if(self.__class__ !== dict){
Mar 7, 2018
309
var missing_method = getattr(self.__class__, "__missing__")
310
return missing_method(self, arg)
311
}catch(err){}
312
}
str
Feb 10, 2018
313
throw KeyError.$factory(_b_.str.$factory(arg))
Sep 5, 2014
314
}
315
Feb 11, 2018
316
dict.__hash__ = None
Sep 5, 2014
317
Feb 11, 2018
318
dict.__init__ = function(self){
319
var args = []
320
for(var i = 1; i < arguments.length; i++){args.push(arguments[i])}
321
322
switch(args.length){
323
case 0:
324
return
325
case 1:
326
var obj = args[0]
327
if(Array.isArray(obj)){
328
var i = obj.length,
329
si = dict.__setitem__
Mar 21, 2018
330
while(i-- > 0){si(self, obj[i - 1][0], obj[i - 1][1])}
331
return $N
332
}else if(obj.$nat === undefined && isinstance(obj, dict)){
333
$copy_dict(self, obj)
334
return $N
335
}
337
if(obj.__class__ === $B.JSObject){
338
// convert a JSObject into a Python dictionary
340
// Attribute $jsobj is used to update the original JS object
341
// when the dictionary is modified
342
self.$jsobj = obj.js
343
return $N
344
}
345
}
Mar 7, 2018
347
var $ns = $B.args("dict", 0, {}, [], args, {}, "args", "kw"),
348
args = $ns["args"],
349
kw = $ns["kw"]
Mar 23, 2018
351
if(args.length > 0){
352
if(isinstance(args[0], dict)){
Sep 5, 2014
355
}
Sep 5, 2014
357
// format dict([(k1,v1),(k2,v2)...])
359
if(Array.isArray(args[0])){
360
var src = args[0],
361
i = src.length - 1,
362
si = dict.__setitem__
363
while(i-- > 0){si(self, src[i - 1][0], src[i - 1][1])}
365
var iterable = $B.$iter(args[0]),
366
ce = $B.current_exception
367
while(1){
368
try{
369
var elt = next(iterable),
Mar 7, 2018
370
key = getattr(elt, "__getitem__")(0),
371
value = getattr(elt,"__getitem__")(1)
Feb 11, 2018
372
dict.__setitem__(self, key, value)
374
if(err.__class__ === _b_.StopIteration){
375
$B.current_exception = ce
376
break
377
}
Sep 5, 2014
380
}
381
}
382
}
383
if(dict.__len__(kw) > 0){$copy_dict(self, kw)}
Sep 5, 2014
385
}
386
Mar 7, 2018
387
var $dict_iterator = $B.$iterator_class("dict iterator")
Feb 11, 2018
388
dict.__iter__ = function(self) {
389
return dict.keys(self)
Sep 5, 2014
390
}
391
Feb 11, 2018
392
dict.__len__ = function(self) {
Mar 7, 2018
393
var _count = 0
395
if(self.$jsobj){
Mar 7, 2018
396
for(var attr in self.$jsobj){if(attr.charAt(0) != "$"){_count++}}
397
return _count
398
}
Mar 23, 2018
400
for(var k in self.$numeric_dict){_count++}
401
for(var k in self.$string_dict){_count++}
402
for(var k in self.$object_dict){_count += self.$object_dict[k].length}
404
return _count
Sep 5, 2014
406
Mar 7, 2018
407
dict.__ne__ = function(self, other){return ! dict.__eq__(self, other)}
Sep 5, 2014
408
Feb 11, 2018
409
dict.__new__ = function(cls){
410
if(cls === undefined){
Mar 7, 2018
411
throw _b_.TypeError.$factory("int.__new__(): not enough arguments")
415
$numeric_dict : {},
416
$object_dict : {},
417
$string_dict : {},
418
$str_hash: {}
419
}
420
}
421
Feb 11, 2018
422
dict.__next__ = function(self){
423
if(self.$iter == null){
424
self.$iter = new $item_generator(self)
426
try{
428
}catch (err){
429
if(err.__name__ !== "StopIteration"){throw err}
Sep 5, 2014
430
}
431
}
432
Feb 11, 2018
433
dict.__repr__ = function(self){
434
if(self.$jsobj){ // wrapper around Javascript object
Feb 11, 2018
435
return dict.__repr__(jsobj2dict(self.$jsobj))
437
var res = [],
438
items = new $item_generator(self).as_list()
439
items.forEach(function(item){
440
if((!self.$jsobj && item[1] === self) ||
441
(self.$jsobj && item[1] === self.$jsobj)){
Mar 7, 2018
442
res.push(repr(item[0]) + ": {...}")
Mar 7, 2018
445
res.push(repr(item[0]) + ": " + repr(item[1]))
Mar 7, 2018
447
res.push(repr(item[0]) + ": <unprintable object>")
Mar 7, 2018
451
return "{" + res.join(", ") + "}"
Sep 5, 2014
452
}
453
454
dict.__setitem__ = function(self, key, value){
Mar 7, 2018
456
var $ = $B.args("__setitem__", 3, {self: null, key: null, value: null},
457
["self", "key", "value"], arguments, {}, null, null)
458
return dict.$setitem($.self, $.key, $.value)
459
}
Nov 21, 2015
460
461
dict.$setitem = function(self, key, value){
463
if(self.$jsobj.__class__ === _b_.type){
464
self.$jsobj[key] = $B.pyobj2jsobj(value)
465
if(key == "__init__" || key == "__new__"){
466
// If class attribute __init__ or __new__ are reset,
467
// the factory function has to change
468
self.$jsobj.$factory = $B.$instance_creator(self.$jsobj)
469
}
470
}else{
471
self.$jsobj[key] = $B.pyobj2jsobj(value)
476
switch(typeof key){
Mar 7, 2018
477
case "string":
478
self.$string_dict[key] = value
479
self.$str_hash[str_hash(key)] = key
480
return $N
Mar 7, 2018
481
case "number":
482
self.$numeric_dict[key] = value
483
return $N
486
// if we got here the key is more complex, use default method
488
var _key = hash(key),
489
_eq = function(other){return $B.rich_comp("__eq__", key, other)}
491
if(self.$numeric_dict[_key] !== undefined && _eq(_key)){
492
self.$numeric_dict[_key] = value
494
}
495
var sk = self.$str_hash[_key]
496
if(sk !== undefined && _eq(sk)){
497
self.$string_dict[sk] = value
499
}
500
501
var obj_ref = self.$object_dict[_key]
502
if(obj_ref !== undefined){
503
// An object with the same hash is already stored
504
// Lookup should fail if equality raises an exception
505
_eq(self.$object_dict[_key][0])
506
}
507
self.$object_dict[_key] = [key, value]
Sep 5, 2014
509
}
510
Feb 11, 2018
511
dict.__str__ = dict.__repr__
Sep 5, 2014
512
513
// add "reflected" methods
Feb 11, 2018
514
$B.make_rmethods(dict)
Sep 5, 2014
515
Feb 11, 2018
516
dict.clear = function(){
Sep 5, 2014
517
// Remove all items from the dictionary.
Mar 7, 2018
518
var $ = $B.args("clear", 1, {self: null}, ["self"], arguments, {},
519
null, null),
520
self = $.self
522
self.$numeric_dict = {}
523
self.$string_dict = {}
524
self.$str_hash = {}
525
self.$object_dict = {}
527
if(self.$jsobj){
528
for(var attr in self.$jsobj){
Mar 7, 2018
529
if(attr.charAt(0) !== "$" && attr !== "__class__"){
530
delete self.$jsobj[attr]
531
}
532
}
533
}
Sep 5, 2014
535
}
536
Feb 11, 2018
537
dict.copy = function(self){
Sep 5, 2014
538
// Return a shallow copy of the dictionary
Mar 7, 2018
539
var $ = $B.args("copy", 1, {self: null},["self"], arguments,{},
540
null, null),
541
self = $.self,
Feb 11, 2018
542
res = _b_.dict.$factory()
Sep 5, 2014
544
return res
545
}
546
Feb 11, 2018
547
dict.fromkeys = function(){
Nov 21, 2015
548
Mar 7, 2018
549
var $ = $B.args("fromkeys", 3, {cls: null, keys: null, value: null},
550
["cls", "keys", "value"], arguments, {value: _b_.None}, null, null),
551
keys = $.keys,
552
value = $.value
Sep 5, 2014
554
// class method
555
var klass = $.cls,
557
keys_iter = $B.$iter(keys),
558
ce = $B.current_exception
Sep 5, 2014
560
while(1){
561
try{
562
var key = _b_.next(keys_iter)
563
if(klass === dict){dict.__setitem__(res, key, value)}
564
else{_b_.getattr(res, "__setitem__")(key, value)}
Sep 5, 2014
565
}catch(err){
566
if($B.is_exc(err, [_b_.StopIteration])){
Sep 5, 2014
568
return res
569
}
570
throw err
571
}
572
}
573
}
Mar 7, 2018
574
dict.fromkeys.$type = "classmethod"
Sep 5, 2014
575
Feb 11, 2018
576
dict.get = function(){
Mar 7, 2018
577
var $ = $B.args("get", 3, {self: null, key: null, _default: null},
578
["self", "key", "_default"], arguments, {_default: $N}, null, null)
Feb 11, 2018
580
try{return dict.__getitem__($.self, $.key)}
581
catch(err){
582
if(_b_.isinstance(err, _b_.KeyError)){return $._default}
583
else{throw err}
584
}
585
}
586
Mar 7, 2018
587
var $dict_itemsDict = $B.$iterator_class("dict_items")
588
Feb 11, 2018
589
dict.items = function(self){
Mar 23, 2018
590
if(arguments.length > 1){
591
var _len = arguments.length - 1,
592
_msg = "items() takes no arguments (" + _len + " given)"
593
throw _b_.TypeError.$factory(_msg)
594
}
595
return $iterator_wrapper(new $item_iterator(self), $dict_itemsDict)
596
}
597
Mar 7, 2018
598
var $dict_keysDict = $B.$iterator_class("dict_keys")
Nov 21, 2015
599
Feb 11, 2018
600
dict.keys = function(self){
Mar 23, 2018
601
if(arguments.length > 1){
602
var _len = arguments.length - 1,
603
_msg = "keys() takes no arguments (" + _len + " given)"
604
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
605
}
606
return $iterator_wrapper(new $key_iterator(self), $dict_keysDict)
Nov 21, 2015
607
}
608
Feb 11, 2018
609
dict.pop = function(){
Nov 21, 2015
610
Mar 7, 2018
611
var $ = $B.args("pop", 3, {self: null, key: null, _default: null},
612
["self", "key", "_default"], arguments, {_default: $N}, null, null),
613
self = $.self,
614
key = $.key,
615
_default = $._default
Nov 21, 2015
616
Sep 5, 2014
617
try{
618
var res = dict.__getitem__(self, key)
619
dict.__delitem__(self, key)
Sep 5, 2014
620
return res
621
}catch(err){
622
if(err.__class__ === _b_.KeyError){
623
if(_default !== undefined){return _default}
Sep 5, 2014
624
throw err
625
}
626
throw err
627
}
628
}
629
Feb 11, 2018
630
dict.popitem = function(self){
632
try{
633
var itm = new $item_iterator(self).next()
634
dict.__delitem__(self, itm[0])
Feb 11, 2018
635
return _b_.tuple.$factory(itm)
637
if (err.__class__ == _b_.StopIteration) {
639
throw KeyError.$factory("'popitem(): dictionary is empty'")
Sep 5, 2014
642
}
643
Feb 11, 2018
644
dict.setdefault = function(){
Nov 21, 2015
645
Mar 7, 2018
646
var $ = $B.args("setdefault", 3, {self: null, key: null, _default: null},
647
["self", "key", "_default"], arguments, {_default: $N}, null, null),
648
self = $.self,
649
key = $.key,
650
_default = $._default
Nov 21, 2015
651
652
try{return dict.__getitem__(self, key)}
Sep 5, 2014
653
catch(err){
654
if(_default === undefined){_default = $N}
655
dict.__setitem__(self, key, _default)
Sep 5, 2014
656
return _default
657
}
658
}
659
Feb 11, 2018
660
dict.update = function(self){
Nov 21, 2015
661
Mar 7, 2018
662
var $ = $B.args("update", 1, {"self": null}, ["self"], arguments,
663
{}, "args", "kw"),
664
self = $.self,
665
args = $.args,
666
kw = $.kw
667
668
if(args.length > 0){
669
var o = args[0]
670
if(isinstance(o, dict)){
671
if(o.$jsobj){o = jsobj2dict(o)}
672
$copy_dict(self, o)
Mar 7, 2018
673
}else if(hasattr(o, "__getitem__") && hasattr(o, "keys")){
674
var _keys = _b_.list.$factory(getattr(o, "keys")()),
675
si = dict.__setitem__,
676
i = _keys.length
677
while(i--){
Mar 7, 2018
678
var _value = getattr(o, "__getitem__")(_keys[i])
679
si(self, _keys[i], _value)
680
}
681
}
Sep 5, 2014
682
}
Sep 5, 2014
685
}
686
Mar 7, 2018
687
var $dict_valuesDict = $B.$iterator_class("dict_values")
Nov 21, 2015
688
Feb 11, 2018
689
dict.values = function(self){
Mar 23, 2018
690
if(arguments.length > 1){
691
var _len = arguments.length - 1,
692
_msg = "values() takes no arguments (" + _len + " given)"
693
throw _b_.TypeError.$factory(_msg)
Nov 21, 2015
694
}
695
return $iterator_wrapper(new $value_iterator(self), $dict_valuesDict)
696
}
697
Feb 11, 2018
698
dict.$factory = function(args, second){
700
var res = {__class__: dict,
701
$numeric_dict : {},
702
$object_dict : {},
703
$string_dict : {},
707
if(args === undefined){return res}
709
if(second === undefined){
710
if(Array.isArray(args)){
711
// Form "dict([[key1, value1], [key2,value2], ...])"
Mar 7, 2018
712
var i = -1,
713
stop = args.length - 1,
714
si = dict.__setitem__
715
while(i++ < stop){
716
var item = args[i]
Mar 7, 2018
718
case 'string':
719
res.$string_dict[item[0]] = item[1]
720
res.$str_hash[str_hash(item[0])] = item[0]
721
break
722
case 'number':
723
res.$numeric_dict[item[0]] = item[1]
724
break
725
default:
726
si(res, item[0], item[1])
727
break
Mar 7, 2018
731
}else if(args.$nat == "kw"){
Mar 7, 2018
733
var kw = args["kw"]
735
switch(typeof attr){
Mar 7, 2018
736
case "string":
737
res.$string_dict[attr] = kw[attr]
738
res.$str_hash[str_hash(attr)] = attr
739
break
Mar 7, 2018
740
case "number":
741
res.$numeric_dict[attr] = kw[attr]
742
break
743
default:
744
si(res, attr, kw[attr])
745
break
749
}else if(args.$jsobj){
750
res.$jsobj = {}
751
for(var attr in args.$jsobj){res.$jsobj[attr] = args.$jsobj[attr]}
752
return res
Sep 5, 2014
756
// apply __init__ with arguments of dict()
757
dict.__init__(res, ...arguments)
Sep 5, 2014
758
return res
759
}
Sep 5, 2014
761
_b_.dict = dict
Feb 11, 2018
763
$B.set_func_names(dict, "builtins")
765
// following are used for faster access elsewhere
766
$B.$dict_iterator = function(d){return new $item_generator(d)}
Feb 11, 2018
767
$B.$dict_length = dict.__len__
768
$B.$dict_getitem = dict.__getitem__
769
$B.$dict_get = dict.get
770
$B.$dict_set = dict.__setitem__
771
$B.$dict_contains = dict.__contains__
772
$B.$dict_items = function(d) { return new $item_generator(d).as_list() }
773
$B.$copy_dict = $copy_dict // copy from right to left
Feb 11, 2018
774
$B.$dict_get_copy = dict.copy // return a shallow copy
777
// Class for attribute __dict__ of classes
Feb 12, 2018
778
var mappingproxy = $B.make_class("mappingproxy",
779
function(obj){
780
var res = obj_dict(obj)
781
res.__class__ = mappingproxy
782
return res
783
}
784
)
Feb 12, 2018
786
mappingproxy.__setitem__ = function(){
Mar 7, 2018
787
throw _b_.TypeError.$factory("'mappingproxy' object does not support " +
788
"item assignment")
Feb 12, 2018
791
$B.set_func_names(mappingproxy, "builtins")
Feb 11, 2018
794
var d = dict.$factory()
Mar 7, 2018
796
if(attr.charAt(0) != "$" && attr !== "__class__"){
797
if(x[attr] === undefined){
798
continue
799
}else if(x[attr].$jsobj === x){
800
d.$string_dict[attr] = d
801
}else{
802
d.$string_dict[attr] = x[attr]
803
}
808
$B.obj_dict = function(obj){
809
var klass = $B.get_class(obj)
810
if(klass !== undefined && klass.$native){
811
throw _b_.AttributeError.$factory(klass.__name__ +
812
" has no attribute '__dict__'")}
Feb 11, 2018
813
var res = dict.$factory()
814
res.$jsobj = obj
815
return res
816
}
817
Sep 5, 2014
818
})(__BRYTHON__)