@Override
public void set(final int key, final int value, final int callSiteFlags) {
final int index = getArrayIndex(key);
if (isValidArrayIndex(index)) {
if (getArray().has(index)) {
final ArrayData data = getArray();
setArray(data.set(index, value, isStrictFlag(callSiteFlags)));
} else {
doesNotHave(index, value, callSiteFlags);
}
return;
}
final String propName = JSType.toString(key);
setObject(findProperty(propName, true), callSiteFlags, propName, JSType.toObject(value));
}
java类jdk.nashorn.internal.runtime.arrays.ArrayData的实例源码
ScriptObject.java 文件源码
项目:openjdk-jdk10
阅读 40
收藏 0
点赞 0
评论 0
NativeArray.java 文件源码
项目:openjdk-jdk10
阅读 36
收藏 0
点赞 0
评论 0
NativeArray(final long[] array) {
this(ArrayData.allocate(array.length));
ArrayData arrayData = this.getArray();
Class<?> widest = int.class;
for (int index = 0; index < array.length; index++) {
final long value = array[index];
if (widest == int.class && JSType.isRepresentableAsInt(value)) {
arrayData = arrayData.set(index, (int) value, false);
} else if (widest != Object.class && JSType.isRepresentableAsDouble(value)) {
arrayData = arrayData.set(index, (double) value, false);
widest = double.class;
} else {
arrayData = arrayData.set(index, (Object) value, false);
widest = Object.class;
}
}
this.setArray(arrayData);
}
NativeArray.java 文件源码
项目:openjdk-jdk10
阅读 34
收藏 0
点赞 0
评论 0
/**
* ECMA 15.4.4.7 Array.prototype.push (args...) specialized for single object argument
*
* @param self self reference
* @param arg argument to push
* @return array after pushes
*/
@SpecializedFunction
public static double push(final Object self, final Object arg) {
try {
final ScriptObject sobj = (ScriptObject)self;
final ArrayData arrayData = sobj.getArray();
final long length = arrayData.length();
if (bulkable(sobj) && length < JSType.MAX_UINT) {
sobj.setArray(arrayData.push(true, arg));
return length + 1;
}
long len = JSType.toUint32(sobj.getLength());
sobj.set(len++, arg, CALLSITE_STRICT);
sobj.set("length", len, CALLSITE_STRICT);
return len;
} catch (final ClassCastException | NullPointerException e) {
throw typeError("not.an.object", ScriptRuntime.safeToString(self));
}
}
ScriptObject.java 文件源码
项目:OpenJSharp
阅读 32
收藏 0
点赞 0
评论 0
@Override
public boolean delete(final Object key, final boolean strict) {
final Object primitiveKey = JSType.toPrimitive(key, String.class);
final int index = getArrayIndex(primitiveKey);
final ArrayData array = getArray();
if (array.has(index)) {
if (array.canDelete(index, strict)) {
setArray(array.delete(index));
return true;
}
return false;
}
return deleteObject(primitiveKey, strict);
}
NativeArray.java 文件源码
项目:OpenJSharp
阅读 30
收藏 0
点赞 0
评论 0
/**
* ECMA 15.4.4.7 Array.prototype.push (args...) specialized for single object argument
*
* @param self self reference
* @param arg argument to push
* @return array after pushes
*/
@SpecializedFunction
public static long push(final Object self, final Object arg) {
try {
final ScriptObject sobj = (ScriptObject)self;
final ArrayData arrayData = sobj.getArray();
final long length = arrayData.length();
if (bulkable(sobj) && length < JSType.MAX_UINT) {
sobj.setArray(arrayData.push(true, arg));
return length + 1;
}
long len = JSType.toUint32(sobj.getLength());
sobj.set(len++, arg, CALLSITE_STRICT);
sobj.set("length", len, CALLSITE_STRICT);
return len;
} catch (final ClassCastException | NullPointerException e) {
throw typeError("not.an.object", ScriptRuntime.safeToString(self));
}
}
CodeGenerator.java 文件源码
项目:OpenJSharp
阅读 32
收藏 0
点赞 0
评论 0
private void loadConstant(final Object object, final CompileUnit compileUnit, final MethodEmitter methodEmitter) {
final String unitClassName = compileUnit.getUnitClassName();
final ClassEmitter classEmitter = compileUnit.getClassEmitter();
final int index = compiler.getConstantData().add(object);
final Class<?> cls = object.getClass();
if (cls == PropertyMap.class) {
methodEmitter.load(index);
methodEmitter.invokestatic(unitClassName, GET_MAP.symbolName(), methodDescriptor(PropertyMap.class, int.class));
classEmitter.needGetConstantMethod(PropertyMap.class);
} else if (cls.isArray()) {
methodEmitter.load(index);
final String methodName = ClassEmitter.getArrayMethodName(cls);
methodEmitter.invokestatic(unitClassName, methodName, methodDescriptor(cls, int.class));
classEmitter.needGetConstantMethod(cls);
} else {
methodEmitter.loadConstants().load(index).arrayload();
if (object instanceof ArrayData) {
// avoid cast to non-public ArrayData subclass
methodEmitter.checkcast(ArrayData.class);
methodEmitter.invoke(virtualCallNoLookup(ArrayData.class, "copy", ArrayData.class));
} else if (cls != Object.class) {
methodEmitter.checkcast(cls);
}
}
}
ScriptObject.java 文件源码
项目:openjdk-jdk10
阅读 34
收藏 0
点赞 0
评论 0
@Override
public void set(final double key, final int value, final int callSiteFlags) {
final int index = getArrayIndex(key);
if (isValidArrayIndex(index)) {
final ArrayData data = getArray();
if (data.has(index)) {
setArray(data.set(index, value, isStrictFlag(callSiteFlags)));
} else {
doesNotHave(index, value, callSiteFlags);
}
return;
}
final String propName = JSType.toString(key);
setObject(findProperty(propName, true), callSiteFlags, propName, JSType.toObject(value));
}
ScriptObject.java 文件源码
项目:openjdk-jdk10
阅读 36
收藏 0
点赞 0
评论 0
@Override
public void set(final Object key, final double value, final int callSiteFlags) {
final Object primitiveKey = JSType.toPrimitive(key, String.class);
final int index = getArrayIndex(primitiveKey);
if (isValidArrayIndex(index)) {
final ArrayData data = getArray();
if (data.has(index)) {
setArray(data.set(index, value, isStrictFlag(callSiteFlags)));
} else {
doesNotHave(index, value, callSiteFlags);
}
return;
}
final Object propName = JSType.toPropertyKey(primitiveKey);
setObject(findProperty(propName, true), callSiteFlags, propName, JSType.toObject(value));
}
NativeStrictArguments.java 文件源码
项目:openjdk-jdk10
阅读 39
收藏 0
点赞 0
评论 0
NativeStrictArguments(final Object[] values, final int numParams,final ScriptObject proto, final PropertyMap map) {
super(proto, map);
setIsArguments();
final ScriptFunction func = Global.instance().getTypeErrorThrower();
// We have to fill user accessor functions late as these are stored
// in this object rather than in the PropertyMap of this object.
final int flags = Property.NOT_ENUMERABLE | Property.NOT_CONFIGURABLE;
initUserAccessors("caller", flags, func, func);
initUserAccessors("callee", flags, func, func);
setArray(ArrayData.allocate(values));
this.length = values.length;
// extend/truncate named arg array as needed and copy values
this.namedArgs = new Object[numParams];
if (numParams > values.length) {
Arrays.fill(namedArgs, UNDEFINED);
}
System.arraycopy(values, 0, namedArgs, 0, Math.min(namedArgs.length, values.length));
}
ScriptObject.java 文件源码
项目:openjdk-jdk10
阅读 35
收藏 0
点赞 0
评论 0
@Override
public void set(final int key, final double value, final int callSiteFlags) {
final int index = getArrayIndex(key);
if (isValidArrayIndex(index)) {
final ArrayData data = getArray();
if (data.has(index)) {
setArray(data.set(index, value, isStrictFlag(callSiteFlags)));
} else {
doesNotHave(index, value, callSiteFlags);
}
return;
}
final String propName = JSType.toString(key);
setObject(findProperty(propName, true), callSiteFlags, propName, JSType.toObject(value));
}
ScriptObject.java 文件源码
项目:OpenJSharp
阅读 44
收藏 0
点赞 0
评论 0
@Override
public void set(final Object key, final int value, final int callSiteFlags) {
final Object primitiveKey = JSType.toPrimitive(key, String.class);
final int index = getArrayIndex(primitiveKey);
if (isValidArrayIndex(index)) {
final ArrayData data = getArray();
if (data.has(index)) {
setArray(data.set(index, value, isStrictFlag(callSiteFlags)));
} else {
doesNotHave(index, value, callSiteFlags);
}
return;
}
final String propName = JSType.toString(primitiveKey);
setObject(findProperty(propName, true), callSiteFlags, propName, JSType.toObject(value));
}
ScriptObject.java 文件源码
项目:OpenJSharp
阅读 41
收藏 0
点赞 0
评论 0
@Override
public void set(final Object key, final double value, final int callSiteFlags) {
final Object primitiveKey = JSType.toPrimitive(key, String.class);
final int index = getArrayIndex(primitiveKey);
if (isValidArrayIndex(index)) {
final ArrayData data = getArray();
if (data.has(index)) {
setArray(data.set(index, value, isStrictFlag(callSiteFlags)));
} else {
doesNotHave(index, value, callSiteFlags);
}
return;
}
final String propName = JSType.toString(primitiveKey);
setObject(findProperty(propName, true), callSiteFlags, propName, JSType.toObject(value));
}
ScriptObject.java 文件源码
项目:OpenJSharp
阅读 48
收藏 0
点赞 0
评论 0
@Override
public void set(final double key, final long value, final int callSiteFlags) {
final int index = getArrayIndex(key);
if (isValidArrayIndex(index)) {
final ArrayData data = getArray();
if (data.has(index)) {
setArray(data.set(index, value, isStrictFlag(callSiteFlags)));
} else {
doesNotHave(index, value, callSiteFlags);
}
return;
}
final String propName = JSType.toString(key);
setObject(findProperty(propName, true), callSiteFlags, propName, JSType.toObject(value));
}
ScriptObject.java 文件源码
项目:OpenJSharp
阅读 40
收藏 0
点赞 0
评论 0
@Override
public void set(final long key, final int value, final int callSiteFlags) {
final int index = getArrayIndex(key);
if (isValidArrayIndex(index)) {
final ArrayData data = getArray();
if (data.has(index)) {
setArray(data.set(index, value, isStrictFlag(callSiteFlags)));
} else {
doesNotHave(index, value, callSiteFlags);
}
return;
}
final String propName = JSType.toString(key);
setObject(findProperty(propName, true), callSiteFlags, propName, JSType.toObject(value));
}
ScriptObject.java 文件源码
项目:OpenJSharp
阅读 40
收藏 0
点赞 0
评论 0
@Override
public void set(final long key, final Object value, final int callSiteFlags) {
final int index = getArrayIndex(key);
if (isValidArrayIndex(index)) {
final ArrayData data = getArray();
if (data.has(index)) {
setArray(data.set(index, value, isStrictFlag(callSiteFlags)));
} else {
doesNotHave(index, value, callSiteFlags);
}
return;
}
final String propName = JSType.toString(key);
setObject(findProperty(propName, true), callSiteFlags, propName, value);
}
NativeArray.java 文件源码
项目:openjdk-jdk10
阅读 29
收藏 0
点赞 0
评论 0
NativeArray(final Object[] array) {
this(ArrayData.allocate(array.length));
ArrayData arrayData = this.getArray();
for (int index = 0; index < array.length; index++) {
final Object value = array[index];
if (value == ScriptRuntime.EMPTY) {
arrayData = arrayData.delete(index);
} else {
arrayData = arrayData.set(index, value, false);
}
}
this.setArray(arrayData);
}
ScriptObjectMirror.java 文件源码
项目:OpenJSharp
阅读 30
收藏 0
点赞 0
评论 0
/**
* Nashorn extension: setIndexedPropertiesToExternalArrayData.
* set indexed properties be exposed from a given nio ByteBuffer.
*
* @param buf external buffer - should be a nio ByteBuffer
*/
public void setIndexedPropertiesToExternalArrayData(final ByteBuffer buf) {
inGlobal(new Callable<Void>() {
@Override public Void call() {
sobj.setArray(ArrayData.allocate(buf));
return null;
}
});
}
ScriptObject.java 文件源码
项目:OpenJSharp
阅读 28
收藏 0
点赞 0
评论 0
@Override
public boolean delete(final long key, final boolean strict) {
final int index = getArrayIndex(key);
final ArrayData array = getArray();
if (array.has(index)) {
if (array.canDelete(index, strict)) {
setArray(array.delete(index));
return true;
}
return false;
}
return deleteObject(JSType.toObject(key), strict);
}
ScriptObject.java 文件源码
项目:OpenJSharp
阅读 34
收藏 0
点赞 0
评论 0
@Override
public boolean delete(final int key, final boolean strict) {
final int index = getArrayIndex(key);
final ArrayData array = getArray();
if (array.has(index)) {
if (array.canDelete(index, strict)) {
setArray(array.delete(index));
return true;
}
return false;
}
return deleteObject(JSType.toObject(key), strict);
}
Global.java 文件源码
项目:OpenJSharp
阅读 46
收藏 0
点赞 0
评论 0
/**
* Allocate a new object array.
*
* @param initial object values.
* @return the new array
*/
public static NativeArray allocate(final Object[] initial) {
ArrayData arrayData = ArrayData.allocate(initial);
for (int index = 0; index < initial.length; index++) {
final Object value = initial[index];
if (value == ScriptRuntime.EMPTY) {
arrayData = arrayData.delete(index);
}
}
return new NativeArray(arrayData);
}
ScriptObjectMirror.java 文件源码
项目:openjdk-jdk10
阅读 35
收藏 0
点赞 0
评论 0
/**
* Nashorn extension: setIndexedPropertiesToExternalArrayData.
* set indexed properties be exposed from a given nio ByteBuffer.
*
* @param buf external buffer - should be a nio ByteBuffer
*/
public void setIndexedPropertiesToExternalArrayData(final ByteBuffer buf) {
inGlobal(new Callable<Void>() {
@Override public Void call() {
sobj.setArray(ArrayData.allocate(buf));
return null;
}
});
}
ScriptObject.java 文件源码
项目:OpenJSharp
阅读 41
收藏 0
点赞 0
评论 0
@Override
public boolean delete(final double key, final boolean strict) {
final int index = getArrayIndex(key);
final ArrayData array = getArray();
if (array.has(index)) {
if (array.canDelete(index, strict)) {
setArray(array.delete(index));
return true;
}
return false;
}
return deleteObject(JSType.toObject(key), strict);
}
ScriptObject.java 文件源码
项目:openjdk-jdk10
阅读 40
收藏 0
点赞 0
评论 0
private void checkIntegerKey(final Object key) {
final int index = getArrayIndex(key);
if (isValidArrayIndex(index)) {
final ArrayData data = getArray();
if (data.has(index)) {
setArray(data.delete(index));
}
}
}
ScriptObject.java 文件源码
项目:openjdk-jdk10
阅读 30
收藏 0
点赞 0
评论 0
@Override
public Object get(final Object key) {
final Object primitiveKey = JSType.toPrimitive(key, String.class);
final int index = getArrayIndex(primitiveKey);
final ArrayData array = getArray();
if (array.has(index)) {
return array.getObject(index);
}
return get(index, JSType.toPropertyKey(primitiveKey));
}
ScriptObject.java 文件源码
项目:openjdk-jdk10
阅读 44
收藏 0
点赞 0
评论 0
/**
* ECMAScript 15.2.3.8 - seal implementation
* @return the sealed ScriptObject
*/
public ScriptObject seal() {
PropertyMap oldMap = getMap();
while (true) {
final PropertyMap newMap = getMap().seal();
if (!compareAndSetMap(oldMap, newMap)) {
oldMap = getMap();
} else {
setArray(ArrayData.seal(getArray()));
return this;
}
}
}
NativeArguments.java 文件源码
项目:openjdk-jdk10
阅读 45
收藏 0
点赞 0
评论 0
NativeArguments(final Object[] arguments, final Object callee, final int numParams, final ScriptObject proto, final PropertyMap map) {
super(proto, map);
setIsArguments();
setArray(ArrayData.allocate(arguments));
this.length = arguments.length;
this.callee = callee;
this.numMapped = Math.min(numParams, arguments.length);
this.numParams = numParams;
}
NativeObject.java 文件源码
项目:OpenJSharp
阅读 37
收藏 0
点赞 0
评论 0
/**
* Nashorn extension: setIndexedPropertiesToExternalArrayData
*
* @param self self reference
* @param obj object whose index properties are backed by buffer
* @param buf external buffer - should be a nio ByteBuffer
* @return the 'obj' object
*/
@Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
public static ScriptObject setIndexedPropertiesToExternalArrayData(final Object self, final Object obj, final Object buf) {
Global.checkObject(obj);
final ScriptObject sobj = (ScriptObject)obj;
if (buf instanceof ByteBuffer) {
sobj.setArray(ArrayData.allocate((ByteBuffer)buf));
} else {
throw typeError("not.a.bytebuffer", "setIndexedPropertiesToExternalArrayData's buf argument");
}
return sobj;
}
JSONParser.java 文件源码
项目:openjdk-jdk10
阅读 45
收藏 0
点赞 0
评论 0
private static ArrayData addArrayElement(final ArrayData arrayData, final int index, final Object value) {
final long oldLength = arrayData.length();
final long longIndex = ArrayIndex.toLongIndex(index);
ArrayData newArrayData = arrayData;
if (longIndex >= oldLength) {
newArrayData = newArrayData.ensure(longIndex);
if (longIndex > oldLength) {
newArrayData = newArrayData.delete(oldLength, longIndex - 1);
}
}
return newArrayData.set(index, value, false);
}
ScriptObject.java 文件源码
项目:openjdk-jdk10
阅读 40
收藏 0
点赞 0
评论 0
/**
* ECMA 15.2.39 - freeze implementation. Freeze this ScriptObject
* @return the frozen ScriptObject
*/
public ScriptObject freeze() {
PropertyMap oldMap = getMap();
while (true) {
final PropertyMap newMap = getMap().freeze();
if (!compareAndSetMap(oldMap, newMap)) {
oldMap = getMap();
} else {
setArray(ArrayData.freeze(getArray()));
return this;
}
}
}
ScriptObject.java 文件源码
项目:openjdk-jdk10
阅读 36
收藏 0
点赞 0
评论 0
/**
* Constructor
*
* @param map {@link PropertyMap} used to create the initial object
*/
public ScriptObject(final PropertyMap map) {
if (Context.DEBUG) {
ScriptObject.count.increment();
}
this.arrayData = ArrayData.EMPTY_ARRAY;
this.setMap(map == null ? PropertyMap.newMap() : map);
}