< prev index next > src/java.base/share/classes/jdk/internal/reflect/SerializationConstructorAccessorGenerator.java
Print this page
* questions.
*/
package jdk.internal.reflect;
+ import jdk.internal.value.PrimitiveClass;
+
import java.security.AccessController;
import java.security.PrivilegedAction;
/** Generator for jdk.internal.reflect.SerializationConstructorAccessorImpl
private Class<?> declaringClass;
private Class<?>[] parameterTypes;
private Class<?> returnType;
private boolean isConstructor;
+ private boolean isStaticFactory;
private boolean forSerialization;
private short targetMethodRef;
private short invokeIdx;
private short invokeDescriptorIdx;
generateSerializationConstructor(Class<?> declaringClass,
Class<?>[] parameterTypes,
int modifiers,
Class<?> targetConstructorClass)
{
return (SerializationConstructorAccessorImpl)
generate(declaringClass,
"<init>",
parameterTypes,
! Void.TYPE,
modifiers,
true,
true,
targetConstructorClass);
}
/** This routine is not thread-safe */
generateSerializationConstructor(Class<?> declaringClass,
Class<?>[] parameterTypes,
int modifiers,
Class<?> targetConstructorClass)
{
+ boolean isStaticFactory = declaringClass.isValue();
return (SerializationConstructorAccessorImpl)
generate(declaringClass,
"<init>",
parameterTypes,
! isStaticFactory ? PrimitiveClass.asValueType(declaringClass) : Void.TYPE,
modifiers,
true,
+ isStaticFactory,
true,
targetConstructorClass);
}
/** This routine is not thread-safe */
String name,
Class<?>[] parameterTypes,
Class<?> returnType,
int modifiers,
boolean isConstructor,
+ boolean isStaticFactory,
boolean forSerialization,
Class<?> serializationTargetClass)
{
ByteVector vec = ByteVectorFactory.create();
asm = new ClassFileAssembler(vec);
this.declaringClass = declaringClass;
this.parameterTypes = parameterTypes;
this.returnType = returnType;
this.modifiers = modifiers;
this.isConstructor = isConstructor;
+ this.isStaticFactory = isStaticFactory;
this.forSerialization = forSerialization;
asm.emitMagicAndVersion();
// Constant pool entries:
// Output class information for non-primitive parameter types
nonPrimitiveParametersBaseIdx = add(asm.cpi(), S2);
for (int i = 0; i < parameterTypes.length; i++) {
Class<?> c = parameterTypes[i];
if (!isPrimitive(c)) {
! asm.emitConstantPoolUTF8(getClassName(c, false));
asm.emitConstantPoolClass(asm.cpi());
}
}
// Entries common to FieldAccessor, MethodAccessor and ConstructorAccessor
// Output class information for non-primitive parameter types
nonPrimitiveParametersBaseIdx = add(asm.cpi(), S2);
for (int i = 0; i < parameterTypes.length; i++) {
Class<?> c = parameterTypes[i];
if (!isPrimitive(c)) {
! asm.emitConstantPoolUTF8(getClassName(c, true));
asm.emitConstantPoolClass(asm.cpi());
}
}
// Entries common to FieldAccessor, MethodAccessor and ConstructorAccessor
cb.setMaxLocals(3);
}
short illegalArgStartPC = 0;
! if (isConstructor) {
// Instantiate target class before continuing
// new <target class type>
// dup
cb.opc_new(targetClass);
cb.opc_dup();
cb.setMaxLocals(3);
}
short illegalArgStartPC = 0;
! if (isConstructor && !isStaticFactory) {
// Instantiate target class before continuing
// new <target class type>
// dup
cb.opc_new(targetClass);
cb.opc_dup();
}
short invokeStartPC = cb.getLength();
// OK, ready to perform the invocation.
! if (isConstructor) {
cb.opc_invokespecial(targetMethodRef, count, 0);
} else {
if (isStatic()) {
cb.opc_invokestatic(targetMethodRef,
count,
}
short invokeStartPC = cb.getLength();
// OK, ready to perform the invocation.
! if (isConstructor && !isStaticFactory) {
cb.opc_invokespecial(targetMethodRef, count, 0);
} else {
if (isStatic()) {
cb.opc_invokestatic(targetMethodRef,
count,
< prev index next >