Categories:
Audio (13)
Biotech (29)
Bytecode (36)
Database (77)
Framework (7)
Game (7)
General (507)
Graphics (53)
I/O (35)
IDE (2)
JAR Tools (102)
JavaBeans (21)
JDBC (121)
JDK (426)
JSP (20)
Logging (108)
Mail (58)
Messaging (8)
Network (84)
PDF (97)
Report (7)
Scripting (84)
Security (32)
Server (121)
Servlet (26)
SOAP (24)
Testing (54)
Web (15)
XML (322)
Collections:
Other Resources:
JDK 17 java.base.jmod - Base Module
JDK 17 java.base.jmod is the JMOD file for JDK 17 Base module.
JDK 17 Base module compiled class files are stored in \fyicenter\jdk-17.0.5\jmods\java.base.jmod.
JDK 17 Base module compiled class files are also linked and stored in the \fyicenter\jdk-17.0.5\lib\modules JImage file.
JDK 17 Base module source code files are stored in \fyicenter\jdk-17.0.5\lib\src.zip\java.base.
You can click and view the content of each source code file in the list below.
✍: FYIcenter
⏎ java/lang/invoke/NativeMethodHandle.java
/*
* Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package java.lang.invoke;
import jdk.internal.vm.annotation.ForceInline;
import jdk.internal.invoke.NativeEntryPoint;
import static java.lang.invoke.LambdaForm.*;
import static java.lang.invoke.MethodHandleNatives.Constants.LM_TRUSTED;
import static java.lang.invoke.MethodHandleNatives.Constants.REF_invokeStatic;
import static java.lang.invoke.MethodHandleStatics.newInternalError;
/**
* This class models a method handle to a native function. A native method handle is made up of a {@link NativeEntryPoint},
* which is used to capture the characteristics of the native call (such as calling convention to be used,
* or whether a native transition is required) and a <em>fallback</em> method handle, which can be used
* when intrinsification of this method handle is not possible.
*/
/*non-public*/ class NativeMethodHandle extends MethodHandle {
final NativeEntryPoint nep;
final MethodHandle fallback;
private NativeMethodHandle(MethodType type, LambdaForm form, MethodHandle fallback, NativeEntryPoint nep) {
super(type, form);
this.fallback = fallback;
this.nep = nep;
}
/**
* Creates a new native method handle with given {@link NativeEntryPoint} and <em>fallback</em> method handle.
*/
public static MethodHandle make(NativeEntryPoint nep, MethodHandle fallback) {
MethodType type = nep.type();
if (!allTypesPrimitive(type))
throw new IllegalArgumentException("Type must only contain primitives: " + type);
if (type != fallback.type())
throw new IllegalArgumentException("Type of fallback must match: " + type + " != " + fallback.type());
LambdaForm lform = preparedLambdaForm(type);
return new NativeMethodHandle(type, lform, fallback, nep);
}
private static boolean allTypesPrimitive(MethodType type) {
if (!type.returnType().isPrimitive())
return false;
for (Class<?> pType : type.parameterArray()) {
if (!pType.isPrimitive())
return false;
}
return true;
}
private static final MemberName.Factory IMPL_NAMES = MemberName.getFactory();
private static LambdaForm preparedLambdaForm(MethodType mtype) {
int id = MethodTypeForm.LF_INVNATIVE;
mtype = mtype.basicType();
LambdaForm lform = mtype.form().cachedLambdaForm(id);
if (lform != null) return lform;
lform = makePreparedLambdaForm(mtype);
return mtype.form().setCachedLambdaForm(id, lform);
}
private static LambdaForm makePreparedLambdaForm(MethodType mtype) {
MethodType linkerType = mtype.insertParameterTypes(0, MethodHandle.class)
.appendParameterTypes(Object.class);
MemberName linker = new MemberName(MethodHandle.class, "linkToNative", linkerType, REF_invokeStatic);
try {
linker = IMPL_NAMES.resolveOrFail(REF_invokeStatic, linker, null, LM_TRUSTED, NoSuchMethodException.class);
} catch (ReflectiveOperationException ex) {
throw newInternalError(ex);
}
final int NMH_THIS = 0;
final int ARG_BASE = 1;
final int ARG_LIMIT = ARG_BASE + mtype.parameterCount();
int nameCursor = ARG_LIMIT;
final int GET_FALLBACK = nameCursor++;
final int GET_NEP = nameCursor++;
final int LINKER_CALL = nameCursor++;
LambdaForm.Name[] names = arguments(nameCursor - ARG_LIMIT, mtype.invokerType());
assert (names.length == nameCursor);
names[GET_FALLBACK] = new LambdaForm.Name(Lazy.NF_internalFallback, names[NMH_THIS]);
names[GET_NEP] = new LambdaForm.Name(Lazy.NF_internalNativeEntryPoint, names[NMH_THIS]);
Object[] outArgs = new Object[linkerType.parameterCount()];
// Need to pass fallback here so we can call it without destroying the receiver register!!
outArgs[0] = names[GET_FALLBACK];
System.arraycopy(names, ARG_BASE, outArgs, 1, mtype.parameterCount());
outArgs[outArgs.length - 1] = names[GET_NEP];
names[LINKER_CALL] = new LambdaForm.Name(linker, outArgs);
LambdaForm lform = new LambdaForm(ARG_LIMIT, names, LAST_RESULT);
// This is a tricky bit of code. Don't send it through the LF interpreter.
lform.compileToBytecode();
return lform;
}
final
@Override
MethodHandle copyWith(MethodType mt, LambdaForm lf) {
assert (this.getClass() == NativeMethodHandle.class); // must override in subclasses
return new NativeMethodHandle(mt, lf, fallback, nep);
}
@Override
BoundMethodHandle rebind() {
return BoundMethodHandle.makeReinvoker(this);
}
@ForceInline
static Object internalNativeEntryPoint(Object mh) {
return ((NativeMethodHandle)mh).nep;
}
@ForceInline
static MethodHandle internalFallback(Object mh) {
return ((NativeMethodHandle)mh).fallback;
}
/**
* Pre-initialized NamedFunctions for bootstrapping purposes.
* Factored in an inner class to delay initialization until first usage.
*/
private static class Lazy {
static final NamedFunction
NF_internalNativeEntryPoint;
static final NamedFunction
NF_internalFallback;
static {
try {
Class<NativeMethodHandle> THIS_CLASS = NativeMethodHandle.class;
NamedFunction[] nfs = new NamedFunction[]{
NF_internalNativeEntryPoint = new NamedFunction(
THIS_CLASS.getDeclaredMethod("internalNativeEntryPoint", Object.class)),
NF_internalFallback = new NamedFunction(
THIS_CLASS.getDeclaredMethod("internalFallback", Object.class))
};
for (NamedFunction nf : nfs) {
// Each nf must be statically invocable or we get tied up in our bootstraps.
assert (InvokerBytecodeGenerator.isStaticallyInvocable(nf.member)) : nf;
nf.resolve();
}
} catch (ReflectiveOperationException ex) {
throw newInternalError(ex);
}
}
}
}
⏎ java/lang/invoke/NativeMethodHandle.java
Or download all of them as a single archive file:
File name: java.base-17.0.5-src.zip File size: 8883851 bytes Release date: 2022-09-13 Download
2023-09-26, ≈923🔥, 1💬
Popular Posts:
What Is jsse.jar (JDK 6) Java Secure Socket Extension? jsse.jar, Java Secure Socket Extension, is Ja...
JAX-WS is an API for building web services and clients. It is the next generation Web Services API r...
Jackson is "the Java JSON library" or "the best JSON parser for Java". Or simply as "JSON for Java"....
Jackson is "the Java JSON library" or "the best JSON parser for Java". Or simply as "JSON for Java"....
The Jakarta-ORO Java classes are a set of text-processing Java classes that provide Perl5 compatible...