}
else
{
type = nativeType.toString();
}
il.append(new CHECKCAST(constantPoolGen.addClass(type)));
}
il.append(InstructionFactory.createReturn(nativeType));
//----detach------
if (cmd.isDetachable())
{
// jdoIsDetached()
jumpTarget = il.append(InstructionConstants.ALOAD_0);
il.append(factory.createInvoke(ClassEnhancer.CN_PersistenceCapable, ClassEnhancer.MN_JdoIsDetached,
Type.BOOLEAN, Type.NO_ARGS, Constants.INVOKEINTERFACE));
//0
il.append(InstructionConstants.ICONST_0);
// if (jdoIsDetached() == 0)
IF_ICMPEQ ifIsDetached = new IF_ICMPEQ(null);
il.append(ifIsDetached);
// if (jdoDetachedState[2].get(?) == 1)
// jdoDetachedState[2]
ifIsDetached.setTarget(il.append(InstructionConstants.ALOAD_0));
il.append(factory.createGetField(className, ClassEnhancer.FN_JdoDetachedState, BCELClassEnhancer.OT_ObjectArray));
il.append(InstructionConstants.ICONST_2);
il.append(InstructionConstants.AALOAD);
il.append(factory.createCheckCast(BCELClassEnhancer.OT_BitSet)); // Cast to BitSet
// the field index: 0, 1, 2...
il.append(BCELUtils.getBIPUSH(fieldConfig.getFieldId()));
if (cmd.getPersistenceCapableSuperclass() != null)
{
// add to field index the parentFieldCount
il.append(factory.createGetStatic(className, ClassEnhancer.FN_JdoInheritedFieldCount, Type.INT));
il.append(InstructionConstants.IADD);
}
// get(?)
il.append(factory.createInvoke(ClassEnhancer.CN_BitSet, "get", Type.BOOLEAN, new Type[]{Type.INT}, Constants.INVOKEVIRTUAL));
// 1
il.append(InstructionConstants.ICONST_1);
// if (jdoLoadedFields.get(?) == 1)
IF_ICMPEQ ifLoaded = new IF_ICMPEQ(null);
il.append(ifLoaded);
// throw new JDODetachedFieldAccessException("XXXX was not loaded.");
createThrowException(ClassEnhancer.CN_JDODetachedFieldAccessException, LOCALISER.msg("Enhancer.DetachedFieldAccess", fieldName));
//----detach------
// return <target field>
InstructionHandle jumpTarget2;
jumpTarget2 = il.append(InstructionConstants.ALOAD_0);
il.append(factory.createInvoke(
className,
"jdo"+BCELUtils.getGetterName(fieldName),
nativeType,
new Type[] { },
Constants.INVOKEVIRTUAL));
if (nativeType instanceof ReferenceType)
{
String type = null;
if (nativeType instanceof ArrayType)
{
type = nativeType.getSignature();
}
else
{
type = nativeType.toString();
}
il.append(new CHECKCAST(constantPoolGen.addClass(type)));
}
il.append(InstructionFactory.createReturn(nativeType));
if( (fieldConfig.getJdoFieldFlag() & PersistenceCapable.CHECK_READ) == PersistenceCapable.CHECK_READ)
{
jump1.setTarget(jumpTarget);
}
jump2.setTarget(jumpTarget);
jump3.setTarget(jumpTarget);
ifIsDetached.setTarget(jumpTarget2);
ifLoaded.setTarget(jumpTarget2);
}
else
{
// return <target field>
jumpTarget = il.append(InstructionConstants.ALOAD_0);
il.append(factory.createInvoke(
className,
"jdo"+BCELUtils.getGetterName(fieldName),
nativeType,
new Type[] { },
Constants.INVOKEVIRTUAL));
if (nativeType instanceof ReferenceType)
{
String type = null;
if (nativeType instanceof ArrayType)
{
type = nativeType.getSignature();
}
else
{
type = nativeType.toString();
}
il.append(new CHECKCAST(constantPoolGen.addClass(type)));
}
il.append(InstructionFactory.createReturn(nativeType));
if( (fieldConfig.getJdoFieldFlag() & PersistenceCapable.CHECK_READ) == PersistenceCapable.CHECK_READ)
{