Java源码示例:jdk.nashorn.internal.runtime.Undefined
示例1
@Override
public Type ldc(final MethodVisitor method, final Object c) {
if (c == null) {
method.visitInsn(ACONST_NULL);
} else if (c instanceof Undefined) {
return loadUndefined(method);
} else if (c instanceof String) {
method.visitLdcInsn(c);
return STRING;
} else if (c instanceof Handle) {
method.visitLdcInsn(c);
return Type.typeFor(MethodHandle.class);
} else {
throw new UnsupportedOperationException("implementation missing for class " + c.getClass() + " value=" + c);
}
return Type.OBJECT;
}
示例2
/**
* Given a JS script object, retrieves a function from it by name, binds it to the script object as its "this", and
* adapts its parameter types, return types, and arity to the specified type and arity. This method is public mainly
* for implementation reasons, so the adapter classes can invoke it from their constructors that take a Object
* in its first argument to obtain the method handles for their method implementations.
* @param obj the script obj
* @param name the name of the property that contains the function
* @param type the method type it has to conform to
* @return the appropriately adapted method handle for invoking the script function, or null if the value of the
* property is either null or undefined, or "toString" was requested as the name, but the object doesn't directly
* define it but just inherits it through prototype.
*/
public static MethodHandle getHandle(final Object obj, final String name, final MethodType type) {
if (! (obj instanceof ScriptObject)) {
throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
}
final ScriptObject sobj = (ScriptObject)obj;
// Since every JS Object has a toString, we only override "String toString()" it if it's explicitly specified
if ("toString".equals(name) && !sobj.hasOwnProperty("toString")) {
return null;
}
final Object fnObj = sobj.get(name);
if (fnObj instanceof ScriptFunction) {
return bindAndAdaptHandle((ScriptFunction)fnObj, sobj, type);
} else if(fnObj == null || fnObj instanceof Undefined) {
return null;
} else {
throw typeError("not.a.function", name);
}
}
示例3
/**
* Given a JS script object, retrieves a function from it by name, binds it to the script object as its "this", and
* adapts its parameter types, return types, and arity to the specified type and arity. This method is public mainly
* for implementation reasons, so the adapter classes can invoke it from their constructors that take a Object
* in its first argument to obtain the method handles for their method implementations.
* @param obj the script obj
* @param name the name of the property that contains the function
* @param type the method type it has to conform to
* @return the appropriately adapted method handle for invoking the script function, or null if the value of the
* property is either null or undefined, or "toString" was requested as the name, but the object doesn't directly
* define it but just inherits it through prototype.
*/
public static MethodHandle getHandle(final Object obj, final String name, final MethodType type) {
if (! (obj instanceof ScriptObject)) {
throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
}
final ScriptObject sobj = (ScriptObject)obj;
// Since every JS Object has a toString, we only override "String toString()" it if it's explicitly specified
if ("toString".equals(name) && !sobj.hasOwnProperty("toString")) {
return null;
}
final Object fnObj = sobj.get(name);
if (fnObj instanceof ScriptFunction) {
return bindAndAdaptHandle((ScriptFunction)fnObj, sobj, type);
} else if(fnObj == null || fnObj instanceof Undefined) {
return null;
} else {
throw typeError("not.a.function", name);
}
}
示例4
/**
* Given a JS script object, retrieves a function from it by name, binds it to the script object as its "this", and
* adapts its parameter types, return types, and arity to the specified type and arity. This method is public mainly
* for implementation reasons, so the adapter classes can invoke it from their constructors that take a Object
* in its first argument to obtain the method handles for their method implementations.
* @param obj the script obj
* @param name the name of the property that contains the function
* @param type the method type it has to conform to
* @return the appropriately adapted method handle for invoking the script function, or null if the value of the
* property is either null or undefined, or "toString" was requested as the name, but the object doesn't directly
* define it but just inherits it through prototype.
*/
public static MethodHandle getHandle(final Object obj, final String name, final MethodType type) {
if (! (obj instanceof ScriptObject)) {
throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
}
final ScriptObject sobj = (ScriptObject)obj;
// Since every JS Object has a toString, we only override "String toString()" it if it's explicitly specified
if ("toString".equals(name) && !sobj.hasOwnProperty("toString")) {
return null;
}
final Object fnObj = sobj.get(name);
if (fnObj instanceof ScriptFunction) {
return adaptHandle(((ScriptFunction)fnObj).getBoundInvokeHandle(sobj), type);
} else if(fnObj == null || fnObj instanceof Undefined) {
return null;
} else {
throw typeError("not.a.function", name);
}
}
示例5
@Override
public Type ldc(final MethodVisitor method, final Object c) {
if (c == null) {
method.visitInsn(ACONST_NULL);
} else if (c instanceof Undefined) {
return loadUndefined(method);
} else if (c instanceof String) {
method.visitLdcInsn(c);
return STRING;
} else if (c instanceof Handle) {
method.visitLdcInsn(c);
return Type.typeFor(MethodHandle.class);
} else {
throw new UnsupportedOperationException("implementation missing for class " + c.getClass() + " value=" + c);
}
return Type.OBJECT;
}
示例6
@Override
public Type ldc(final MethodVisitor method, final Object c) {
if (c == null) {
method.visitInsn(ACONST_NULL);
} else if (c instanceof Undefined) {
return loadUndefined(method);
} else if (c instanceof String) {
method.visitLdcInsn(c);
return STRING;
} else if (c instanceof Handle) {
method.visitLdcInsn(c);
return Type.typeFor(MethodHandle.class);
} else {
throw new UnsupportedOperationException("implementation missing for class " + c.getClass() + " value=" + c);
}
return Type.OBJECT;
}
示例7
@Override
public Type ldc(final MethodVisitor method, final Object c) {
if (c == null) {
method.visitInsn(ACONST_NULL);
} else if (c instanceof Undefined) {
return loadUndefined(method);
} else if (c instanceof String) {
method.visitLdcInsn(c);
return STRING;
} else if (c instanceof Handle) {
method.visitLdcInsn(c);
return Type.typeFor(MethodHandle.class);
} else {
throw new UnsupportedOperationException("implementation missing for class " + c.getClass() + " value=" + c);
}
return Type.OBJECT;
}
示例8
@Override
public GuardedInvocation getGuardedInvocation(final LinkRequest request, final LinkerServices linkerServices) throws Exception {
final LinkRequest requestWithoutContext = request.withoutRuntimeContext(); // Nashorn has no runtime context
final Object self = requestWithoutContext.getReceiver();
final CallSiteDescriptor desc = requestWithoutContext.getCallSiteDescriptor();
if (desc.getNameTokenCount() < 2 || !"dyn".equals(desc.getNameToken(CallSiteDescriptor.SCHEME))) {
// We only support standard "dyn:*[:*]" operations
return null;
}
final GuardedInvocation inv;
if (self instanceof ScriptObject) {
inv = ((ScriptObject)self).lookup(desc, request);
} else if (self instanceof Undefined) {
inv = Undefined.lookup(desc);
} else {
throw new AssertionError(); // Should never reach here.
}
return Bootstrap.asType(inv, linkerServices, desc);
}
示例9
/**
* Given a JS script object, retrieves a function from it by name, binds it to the script object as its "this", and
* adapts its parameter types, return types, and arity to the specified type and arity. This method is public mainly
* for implementation reasons, so the adapter classes can invoke it from their constructors that take a Object
* in its first argument to obtain the method handles for their method implementations.
* @param obj the script obj
* @param name the name of the property that contains the function
* @param type the method type it has to conform to
* @return the appropriately adapted method handle for invoking the script function, or null if the value of the
* property is either null or undefined, or "toString" was requested as the name, but the object doesn't directly
* define it but just inherits it through prototype.
*/
public static MethodHandle getHandle(final Object obj, final String name, final MethodType type) {
if (! (obj instanceof ScriptObject)) {
throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
}
final ScriptObject sobj = (ScriptObject)obj;
// Since every JS Object has a toString, we only override "String toString()" it if it's explicitly specified
if ("toString".equals(name) && !sobj.hasOwnProperty("toString")) {
return null;
}
final Object fnObj = sobj.get(name);
if (fnObj instanceof ScriptFunction) {
return bindAndAdaptHandle((ScriptFunction)fnObj, sobj, type);
} else if(fnObj == null || fnObj instanceof Undefined) {
return null;
} else {
throw typeError("not.a.function", name);
}
}
示例10
@Override
protected IteratorResult next(final Object arg) {
if (iterator == null) {
return makeResult(Undefined.getUndefined(), Boolean.TRUE, global);
}
final LinkedMap.Node node = iterator.next();
if (node == null) {
iterator = null;
return makeResult(Undefined.getUndefined(), Boolean.TRUE, global);
}
if (iterationKind == IterationKind.KEY_VALUE) {
final NativeArray array = new NativeArray(new Object[] {node.getKey(), node.getValue()});
return makeResult(array, Boolean.FALSE, global);
}
return makeResult(iterationKind == IterationKind.KEY ? node.getKey() : node.getValue(), Boolean.FALSE, global);
}
示例11
@Override
protected IteratorResult next(final Object arg) {
if (iterator == null) {
return makeResult(Undefined.getUndefined(), Boolean.TRUE, global);
}
final LinkedMap.Node node = iterator.next();
if (node == null) {
iterator = null;
return makeResult(Undefined.getUndefined(), Boolean.TRUE, global);
}
if (iterationKind == IterationKind.KEY_VALUE) {
final NativeArray array = new NativeArray(new Object[] {node.getKey(), node.getKey()});
return makeResult(array, Boolean.FALSE, global);
}
return makeResult(node.getKey(), Boolean.FALSE, global);
}
示例12
@Override
protected IteratorResult next(final Object arg) {
final int index = nextIndex;
final String string = iteratedString;
if (string == null || index >= string.length()) {
// ES6 21.1.5.2.1 step 8
iteratedString = null;
return makeResult(Undefined.getUndefined(), Boolean.TRUE, global);
}
final char first = string.charAt(index);
if (first >= 0xd800 && first <= 0xdbff && index < string.length() - 1) {
final char second = string.charAt(index + 1);
if (second >= 0xdc00 && second <= 0xdfff) {
nextIndex += 2;
return makeResult(String.valueOf(new char[] {first, second}), Boolean.FALSE, global);
}
}
nextIndex++;
return makeResult(String.valueOf(first), Boolean.FALSE, global);
}
示例13
/**
* Given a JS script object, retrieves a function from it by name, binds it to the script object as its "this", and
* adapts its parameter types, return types, and arity to the specified type and arity. This method is public mainly
* for implementation reasons, so the adapter classes can invoke it from their constructors that take a Object
* in its first argument to obtain the method handles for their method implementations.
* @param obj the script obj
* @param name the name of the property that contains the function
* @param type the method type it has to conform to
* @return the appropriately adapted method handle for invoking the script function, or null if the value of the
* property is either null or undefined, or "toString" was requested as the name, but the object doesn't directly
* define it but just inherits it through prototype.
*/
public static MethodHandle getHandle(final Object obj, final String name, final MethodType type) {
if (! (obj instanceof ScriptObject)) {
throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
}
final ScriptObject sobj = (ScriptObject)obj;
// Since every JS Object has a toString, we only override "String toString()" it if it's explicitly specified
if ("toString".equals(name) && !sobj.hasOwnProperty("toString")) {
return null;
}
final Object fnObj = sobj.get(name);
if (fnObj instanceof ScriptFunction) {
return bindAndAdaptHandle((ScriptFunction)fnObj, sobj, type);
} else if(fnObj == null || fnObj instanceof Undefined) {
return null;
} else {
throw typeError("not.a.function", name);
}
}
示例14
private static MethodHandle getREDUCE_CALLBACK_INVOKER() {
return Global.instance().getDynamicInvoker(REDUCE_CALLBACK_INVOKER,
new Callable<MethodHandle>() {
@Override
public MethodHandle call() {
return Bootstrap.createDynamicInvoker("dyn:call", Object.class, Object.class,
Undefined.class, Object.class, Object.class, double.class, Object.class);
}
});
}
示例15
private static GuardedInvocation getGuardedInvocation(final Object self, final LinkRequest request, final CallSiteDescriptor desc) {
final GuardedInvocation inv;
if (self instanceof ScriptObject) {
inv = ((ScriptObject)self).lookup(desc, request);
} else if (self instanceof Undefined) {
inv = Undefined.lookup(desc);
} else {
throw new AssertionError(self.getClass().getName()); // Should never reach here.
}
return inv;
}
示例16
private static MethodHandle getREDUCE_CALLBACK_INVOKER() {
return Global.instance().getDynamicInvoker(REDUCE_CALLBACK_INVOKER,
new Callable<MethodHandle>() {
@Override
public MethodHandle call() {
return Bootstrap.createDynamicInvoker("dyn:call", Object.class, Object.class,
Undefined.class, Object.class, Object.class, long.class, Object.class);
}
});
}
示例17
private static GuardedInvocation getGuardedInvocation(final Object self, final LinkRequest request, final CallSiteDescriptor desc) {
final GuardedInvocation inv;
if (self instanceof ScriptObject) {
inv = ((ScriptObject)self).lookup(desc, request);
} else if (self instanceof Undefined) {
inv = Undefined.lookup(desc);
} else {
throw new AssertionError(self.getClass().getName()); // Should never reach here.
}
return inv;
}
示例18
private static MethodHandle getREDUCE_CALLBACK_INVOKER() {
return Global.instance().getDynamicInvoker(REDUCE_CALLBACK_INVOKER,
new Callable<MethodHandle>() {
@Override
public MethodHandle call() {
return Bootstrap.createDynamicInvoker("dyn:call", Object.class, Object.class,
Undefined.class, Object.class, Object.class, double.class, Object.class);
}
});
}
示例19
@RequestMapping("onResolve")
public FullHttpResponse onResolve(Channel channel, FullHttpRequest request) throws Exception {
HttpRequestForm taskRequest = getJSONParams(request, HttpRequestForm.class);
//遍历扩展模块是否有对应的处理
List<ExtensionInfo> extensionInfos = ExtensionContent.get();
for (ExtensionInfo extensionInfo : extensionInfos) {
if (extensionInfo.getMeta().isEnabled()) {
if (extensionInfo.getHookScript() != null
&& !StringUtils.isEmpty(extensionInfo.getHookScript().getScript())) {
Event event = extensionInfo.getHookScript().hasEvent(HookScript.EVENT_RESOLVE, taskRequest.getUrl());
if (event != null) {
try {
//执行resolve方法
Object result = ExtensionUtil.invoke(extensionInfo, event, taskRequest, false);
if (result != null && !(result instanceof Undefined)) {
ObjectMapper objectMapper = new ObjectMapper();
String temp = objectMapper.writeValueAsString(result);
TaskForm taskForm = objectMapper.readValue(temp, TaskForm.class);
//有一个扩展解析成功的话直接返回
return HttpHandlerUtil.buildJson(taskForm, Include.NON_DEFAULT);
}
} catch (Exception e) {
LOGGER.error("An exception occurred while resolve()", e);
}
}
}
}
}
return new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
}
示例20
/**
* ECMA 6 19.4.1.1 Symbol ( [ description ] )
*
* @param newObj is this function invoked with the new operator
* @param self self reference
* @param args arguments
* @return new symbol value
*/
@Constructor(arity = 1)
public static Object constructor(final boolean newObj, final Object self, final Object... args) {
if (newObj) {
throw typeError("symbol.as.constructor");
}
final String description = args.length > 0 && args[0] != Undefined.getUndefined() ?
JSType.toString(args[0]) : "";
return new Symbol(description);
}
示例21
/**
* ES6 19.4.2.5 Symbol.keyFor ( sym )
*
* @param self self reference
* @param arg the argument
* @return the symbol name
*/
@Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
public synchronized static Object keyFor(final Object self, final Object arg) {
if (!(arg instanceof Symbol)) {
throw typeError("not.a.symbol", ScriptRuntime.safeToString(arg));
}
final String name = ((Symbol) arg).getName();
return globalSymbolRegistry.get(name) == arg ? name : Undefined.getUndefined();
}
示例22
static void populateWeakSet(final Map<Object, Boolean> set, final Object arg, final Global global) {
if (arg != null && arg != Undefined.getUndefined()) {
AbstractIterator.iterate(arg, global, value -> {
set.put(checkKey(value), Boolean.TRUE);
});
}
}
示例23
/**
* ECMA6 23.3.3.3 WeakMap.prototype.get ( key )
*
* @param self the self reference
* @param key the key
* @return the associated value or undefined
*/
@Function(attributes = Attribute.NOT_ENUMERABLE)
public static Object get(final Object self, final Object key) {
final NativeWeakMap map = getMap(self);
if (isPrimitive(key)) {
return Undefined.getUndefined();
}
return map.jmap.get(key);
}
示例24
static void populateMap(final Map<Object, Object> map, final Object arg, final Global global) {
// This method is similar to NativeMap.populateMap, but it uses a different
// map implementation and the checking/conversion of keys differs as well.
if (arg != null && arg != Undefined.getUndefined()) {
AbstractIterator.iterate(arg, global, value -> {
if (isPrimitive(value)) {
throw typeError(global, "not.an.object", ScriptRuntime.safeToString(value));
}
if (value instanceof ScriptObject) {
final ScriptObject sobj = (ScriptObject) value;
map.put(checkKey(sobj.get(0)), sobj.get(1));
}
});
}
}
示例25
private static MethodHandle getREDUCE_CALLBACK_INVOKER() {
return Global.instance().getDynamicInvoker(REDUCE_CALLBACK_INVOKER,
new Callable<MethodHandle>() {
@Override
public MethodHandle call() {
return Bootstrap.createDynamicInvoker("dyn:call", Object.class, Object.class,
Undefined.class, Object.class, Object.class, double.class, Object.class);
}
});
}
示例26
static boolean canLinkTypeStatic(final Class<?> type) {
return ScriptObject.class.isAssignableFrom(type) || Undefined.class == type;
}
示例27
@SuppressWarnings("unused")
private static boolean isNashornTypeOrUndefined(final Object obj) {
return obj instanceof ScriptObject || obj instanceof Undefined;
}
示例28
@Override
public Type loadEmpty(final MethodVisitor method) {
method.visitFieldInsn(GETSTATIC, className(ScriptRuntime.class), "EMPTY", typeDescriptor(Undefined.class));
return OBJECT;
}
示例29
@Override
public Type loadUndefined(final MethodVisitor method) {
method.visitFieldInsn(GETSTATIC, className(ScriptRuntime.class), "UNDEFINED", typeDescriptor(Undefined.class));
return OBJECT;
}
示例30
@Override
public Type loadUndefined(final MethodVisitor method) {
method.visitFieldInsn(GETSTATIC, className(ScriptRuntime.class), "UNDEFINED", typeDescriptor(Undefined.class));
return UNDEFINED;
}