()
| 787 | } |
| 788 | |
| 789 | func (p *proxyObject) proxyOwnKeys() ([]Value, bool) { |
| 790 | target := p.target |
| 791 | if v, ok := p.checkHandler().ownKeys(target); ok { |
| 792 | keys := p.val.runtime.toObject(v) |
| 793 | var keyList []Value |
| 794 | var keySet propNameSet |
| 795 | l := toLength(keys.self.getStr("length", nil)) |
| 796 | for k := int64(0); k < l; k++ { |
| 797 | item := keys.self.getIdx(valueInt(k), nil) |
| 798 | if _, ok := item.(String); !ok { |
| 799 | if _, ok := item.(*Symbol); !ok { |
| 800 | panic(p.val.runtime.NewTypeError("%s is not a valid property name", item.String())) |
| 801 | } |
| 802 | } |
| 803 | if keySet.has(item) { |
| 804 | panic(p.val.runtime.NewTypeError("'ownKeys' on proxy: trap returned duplicate entries")) |
| 805 | } |
| 806 | keyList = append(keyList, item) |
| 807 | keySet.add(item) |
| 808 | } |
| 809 | ext := target.self.isExtensible() |
| 810 | for item, next := target.self.iterateKeys()(); next != nil; item, next = next() { |
| 811 | if keySet.has(item.name) { |
| 812 | keySet.delete(item.name) |
| 813 | } else { |
| 814 | if !ext { |
| 815 | panic(p.val.runtime.NewTypeError("'ownKeys' on proxy: trap result did not include '%s'", item.name.String())) |
| 816 | } |
| 817 | var prop Value |
| 818 | if item.value == nil { |
| 819 | prop = target.getOwnProp(item.name) |
| 820 | } else { |
| 821 | prop = item.value |
| 822 | } |
| 823 | if prop, ok := prop.(*valueProperty); ok && !prop.configurable { |
| 824 | panic(p.val.runtime.NewTypeError("'ownKeys' on proxy: trap result did not include non-configurable '%s'", item.name.String())) |
| 825 | } |
| 826 | } |
| 827 | } |
| 828 | if !ext && len(keyList) > 0 && keySet.size() > 0 { |
| 829 | panic(p.val.runtime.NewTypeError("'ownKeys' on proxy: trap returned extra keys but proxy target is non-extensible")) |
| 830 | } |
| 831 | |
| 832 | return keyList, true |
| 833 | } |
| 834 | |
| 835 | return nil, false |
| 836 | } |
| 837 | |
| 838 | func (p *proxyObject) iterateStringKeys() iterNextFunc { |
| 839 | return (&proxyPropIter{ |
no test coverage detected