1 package jdk.nashorn.internal.runtime.arrays;
   2 
   3 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
   4 import jdk.nashorn.internal.objects.Global;
   5 import jdk.nashorn.internal.runtime.ScriptRuntime;
   6 
   7 /**
   8  * Filter class that wrap arrays that have been tagged non extensible
   9  */
  10 final 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 }