116 } 117 } 118 119 @Override 120 public MethodHandle getElementSetter(final Class<?> elementType) { 121 final MethodHandle setter = super.getElementSetter(elementType); //getContinuousElementSetter(getClass(), setElem(), elementType); 122 if (setter != null) { 123 if (elementType == Object.class) { 124 return MH.filterArguments(setter, 2, RINT_O); 125 } else if (elementType == double.class) { 126 return MH.filterArguments(setter, 2, RINT_D); 127 } else if (elementType == long.class) { 128 return MH.filterArguments(setter, 2, CLAMP_LONG); 129 } 130 } 131 return setter; 132 } 133 134 private void setElem(final int index, final int elem) { 135 try { 136 final byte clamped; 137 if ((elem & 0xffff_ff00) == 0) { 138 clamped = (byte)elem; 139 } else { 140 clamped = elem < 0 ? 0 : (byte)0xff; 141 } 142 nb.put(index, clamped); 143 } catch (final IndexOutOfBoundsException e) { 144 //swallow valid array indexes. it's ok. 145 if (index < 0) { 146 throw new ClassCastException(); 147 } 148 } 149 } 150 151 @Override 152 public boolean isClamped() { 153 return true; 154 } 155 156 @Override 157 public boolean isUnsigned() { 158 return true; 159 } 160 161 @Override 162 public int getInt(final int index) { 163 return getElem(index); 164 } 165 166 @Override 167 public int getIntOptimistic(final int index, final int programPoint) { | 116 } 117 } 118 119 @Override 120 public MethodHandle getElementSetter(final Class<?> elementType) { 121 final MethodHandle setter = super.getElementSetter(elementType); //getContinuousElementSetter(getClass(), setElem(), elementType); 122 if (setter != null) { 123 if (elementType == Object.class) { 124 return MH.filterArguments(setter, 2, RINT_O); 125 } else if (elementType == double.class) { 126 return MH.filterArguments(setter, 2, RINT_D); 127 } else if (elementType == long.class) { 128 return MH.filterArguments(setter, 2, CLAMP_LONG); 129 } 130 } 131 return setter; 132 } 133 134 private void setElem(final int index, final int elem) { 135 try { 136 if (index < nb.limit()) { 137 final byte clamped; 138 if ((elem & 0xffff_ff00) == 0) { 139 clamped = (byte) elem; 140 } else { 141 clamped = elem < 0 ? 0 : (byte) 0xff; 142 } 143 nb.put(index, clamped); 144 } 145 } catch (final IndexOutOfBoundsException e) { 146 throw new ClassCastException(); 147 } 148 } 149 150 @Override 151 public boolean isClamped() { 152 return true; 153 } 154 155 @Override 156 public boolean isUnsigned() { 157 return true; 158 } 159 160 @Override 161 public int getInt(final int index) { 162 return getElem(index); 163 } 164 165 @Override 166 public int getIntOptimistic(final int index, final int programPoint) { |