public static void getPcodeForGetField(PcodeOpEmitter pCode, int index,
			AbstractConstantPoolInfoJava[] constantPool) {

		String descriptor = getDescriptorForFieldRef(constantPool, index);

		switch (descriptor.charAt(0)) {
			case DescriptorDecoder.BASE_TYPE_BYTE:  //signed byte
				pCode.emitPopCat1Value(OBJECT_REF);
				pCode.emitAssignVarnodeFromPcodeOpCall(TEMP_1, 1,
					ConstantPoolJava.CPOOL_OP, OBJECT_REF, Integer.toString(index),
					ConstantPoolJava.CPOOL_GETFIELD);
				pCode.emitAssignVarnodeFromDereference(TEMP_2, 1, TEMP_1);
				pCode.emitSignExtension(VALUE, 4, TEMP_2);
				pCode.emitPushCat1Value(VALUE);
				break;
			case DescriptorDecoder.BASE_TYPE_BOOLEAN:  //boolean
				pCode.emitPopCat1Value(OBJECT_REF);
				pCode.emitAssignVarnodeFromPcodeOpCall(TEMP_1, 1,
					ConstantPoolJava.CPOOL_OP, OBJECT_REF, Integer.toString(index),
					ConstantPoolJava.CPOOL_GETFIELD);
				pCode.emitAssignVarnodeFromDereference(TEMP_2, 1, TEMP_1);
				pCode.emitZeroExtension(VALUE, 4, TEMP_2);
				pCode.emitPushCat1Value(VALUE);
				break;
			case DescriptorDecoder.BASE_TYPE_CHAR:  //char
				pCode.emitPopCat1Value(OBJECT_REF);
				pCode.emitAssignVarnodeFromPcodeOpCall(TEMP_1, 2,
					ConstantPoolJava.CPOOL_OP, OBJECT_REF, Integer.toString(index),
					ConstantPoolJava.CPOOL_GETFIELD);
				pCode.emitAssignVarnodeFromDereference(TEMP_2, 2, TEMP_1);
				pCode.emitZeroExtension(VALUE, 4, TEMP_2);
				pCode.emitPushCat1Value(VALUE);
				break;
			case DescriptorDecoder.BASE_TYPE_SHORT:  //signed short
				pCode.emitPopCat1Value(OBJECT_REF);
				pCode.emitAssignVarnodeFromPcodeOpCall(TEMP_1, 2,
					ConstantPoolJava.CPOOL_OP, OBJECT_REF, Integer.toString(index),
					ConstantPoolJava.CPOOL_GETFIELD);
				pCode.emitAssignVarnodeFromDereference(TEMP_2, 2, TEMP_1);
				pCode.emitSignExtension(VALUE, 4, TEMP_2);
				pCode.emitPushCat1Value(VALUE);
				break;
			case DescriptorDecoder.BASE_TYPE_ARRAY:  //array dimension
			case DescriptorDecoder.BASE_TYPE_FLOAT:  //float
			case DescriptorDecoder.BASE_TYPE_INT:  //int
			case DescriptorDecoder.BASE_TYPE_REFERENCE:  //object reference
				pCode.emitPopCat1Value(OBJECT_REF);
				pCode.emitAssignVarnodeFromPcodeOpCall(TEMP_1, 4,
					ConstantPoolJava.CPOOL_OP, OBJECT_REF, Integer.toString(index),
					ConstantPoolJava.CPOOL_GETFIELD);
				pCode.emitAssignVarnodeFromDereference(VALUE, 4, TEMP_1);
				pCode.emitPushCat1Value(VALUE);
				break;
			case DescriptorDecoder.BASE_TYPE_DOUBLE:  //double
			case DescriptorDecoder.BASE_TYPE_LONG:  //long
				pCode.emitPopCat1Value(OBJECT_REF);
				pCode.emitAssignVarnodeFromPcodeOpCall(TEMP_1, 8,
					ConstantPoolJava.CPOOL_OP, OBJECT_REF, Integer.toString(index),
					ConstantPoolJava.CPOOL_GETFIELD);
				pCode.emitAssignVarnodeFromDereference(VALUE, 8, TEMP_1);
				pCode.emitPushCat2Value(VALUE);
				break;
			default:
				throw new IllegalArgumentException("Invalid descriptor: " + descriptor);
		}
	}
Generate pcode for a getfield op
@param pCode is the pcode accumulator
@param index - the index of the field reference in the constant pool
@param constantPool
Ghidra/Processors/JVM/src/main/java/ghidra/app/util/pcodeInject/ReferenceMethods.java