NonExtensibleArrayFilter.java revision 1101:be3f5ca1edbf
1package jdk.nashorn.internal.runtime.arrays;
2
3import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
4import jdk.nashorn.internal.objects.Global;
5import jdk.nashorn.internal.runtime.ScriptRuntime;
6
7/**
8 * Filter class that wrap arrays that have been tagged non extensible
9 */
10final class NonExtensibleArrayFilter extends ArrayFilter {
11
12    /**
13     * Constructor
14     * @param underlying array
15     */
16    NonExtensibleArrayFilter(final ArrayData underlying) {
17        super(underlying);
18    }
19
20    @Override
21    public ArrayData copy() {
22        return new NonExtensibleArrayFilter(underlying.copy());
23    }
24
25    @Override
26    public ArrayData slice(final long from, final long to) {
27        return new NonExtensibleArrayFilter(underlying.slice(from, to));
28    }
29
30    private ArrayData extensionCheck(final boolean strict, final int index) {
31        if (!strict) {
32            return this;
33        }
34        throw typeError(Global.instance(), "object.non.extensible", String.valueOf(index), ScriptRuntime.safeToString(this));
35    }
36
37    @Override
38    public ArrayData set(final int index, final Object value, final boolean strict) {
39        if (has(index)) {
40            return underlying.set(index, value, strict);
41        }
42        return extensionCheck(strict, index);
43    }
44
45    @Override
46    public ArrayData set(final int index, final int value, final boolean strict) {
47        if (has(index)) {
48            return underlying.set(index, value, strict);
49        }
50        return extensionCheck(strict, index);
51    }
52
53    @Override
54    public ArrayData set(final int index, final long value, final boolean strict) {
55        if (has(index)) {
56            return underlying.set(index, value, strict);
57        }
58        return extensionCheck(strict, index);
59    }
60
61    @Override
62    public ArrayData set(final int index, final double value, final boolean strict) {
63        if (has(index)) {
64            return underlying.set(index, value, strict);
65        }
66        return extensionCheck(strict, index);
67    }
68}
69