void LoadStoreField(Code op, object data) { bool ok = false; if (data is FieldReference fieldRef) { var fldName = CilMain.MakeValidMemberName(fieldRef.Name); var fldClass = CilMain.GenericStack.EnterType(fieldRef.DeclaringType); var fldType = ValueUtil.GetBoxedFieldType(fldClass, fieldRef); if (fldClass.Equals(JavaType.StringType) || fldClass.Equals(JavaType.ThrowableType)) { // generally we translate System.String to java.lang.String, // and System.Exception to java.lang.Throwable, // but not in the case of a field reference fldClass = CilType.From(new JavaType(0, 0, fldClass.JavaName)); } bool isLoad = (op != Code.Stfld && op != Code.Stsfld); bool isStatic = (op == Code.Ldsfld || op == Code.Ldsflda || op == Code.Stsfld); bool isAddress = (op == Code.Ldflda || op == Code.Ldsflda); bool isVolatile = CheckVolatile(fldType); if (isLoad) { if (isAddress) { ok = LoadFieldAddress(fldName, fldType, fldClass, isStatic); } else { ok = LoadFieldValue(fldName, fldType, fldClass, isStatic, isVolatile); } } else { ok = StoreFieldValue(fldName, fldType, fldClass, isStatic, isVolatile); } } if (!ok) { throw new InvalidProgramException(); } }
public static void ImportFields(JavaClass jclass, TypeDefinition cilType, bool isRetainName) { if (cilType.HasFields) { int n = cilType.Fields.Count; if (n > 0) { if (isRetainName) { throw CilMain.Where.Exception("fields not supported in a [RetainName] type"); } jclass.Fields = new List <JavaField>(n); for (int i = 0; i < n; i++) { var cilField = cilType.Fields[i]; CilMain.Where.Push($"field '{cilField.Name}'"); if (cilField.InitialValue.Length != 0) { throw CilMain.Where.Exception("unsupported InitialValue in field"); } var myField = new JavaField(); myField.Name = CilMain.MakeValidMemberName(cilField.Name); myField.Class = jclass; myField.Flags = AttributesToAccessFlags( cilField.Attributes, (cilType.HasNestedTypes || cilType.HasGenericParameters)); if (cilType.IsEnum) { myField.Type = CilType.From(cilField.FieldType); if (cilField.Constant != null) { myField.InitConstant(cilField.Constant, CilMain.Where); } } else { myField.Type = ValueUtil.GetBoxedFieldType(null, cilField); if (((CilType)myField.Type).IsValueClass) { myField.Constant = cilField; } else { if (cilField.Constant != null) { myField.InitConstant(cilField.Constant, CilMain.Where); } if (((CilType)myField.Type).IsVolatile) { myField.Flags |= JavaAccessFlags.ACC_VOLATILE; } } } jclass.Fields.Add(myField); CilMain.Where.Pop(); } } } }