57 RuntimeJavaType tclass = classFile.GetConstantPoolClassType(code[i - 3].Arg1);
58 RuntimeJavaType vclass = classFile.GetConstantPoolClassType(code[i - 2].Arg1);
59 string fieldName = classFile.GetConstantPoolConstantString(code[i - 1].Arg1);
60 if (tclass == wrapper && !vclass.IsUnloadable && !vclass.IsPrimitive && !vclass.IsNonPrimitiveValueType)
63 if (field !=
null && !field.IsStatic && field.IsVolatile && field.DeclaringType == wrapper && field.FieldTypeWrapper == vclass)
66 ilgen.Emit(OpCodes.Pop);
67 ilgen.Emit(OpCodes.Pop);
68 ilgen.Emit(OpCodes.Pop);
69 ilgen.Emit(OpCodes.Newobj, context.GetAtomicReferenceFieldUpdater(field));
79 EmitCompareAndSet(context,
"compareAndSet", tb, field);
80 EmitGet(context, tb, field);
81 EmitSet(context,
"set", tb, field);
86 MethodBuilder compareAndSet = tb.DefineMethod(name, MethodAttributes.Public | MethodAttributes.Virtual, context.
Types.
Boolean,
new Type[] { context.Types.Object, context.Types.Object, context.Types.Object });
87 ILGenerator ilgen = compareAndSet.GetILGenerator();
88 ilgen.Emit(OpCodes.Ldarg_1);
89 ilgen.Emit(OpCodes.Castclass, field.DeclaringType);
90 ilgen.Emit(OpCodes.Ldflda, field);
91 ilgen.Emit(OpCodes.Ldarg_3);
92 ilgen.Emit(OpCodes.Castclass, field.FieldType);
93 ilgen.Emit(OpCodes.Ldarg_2);
94 ilgen.Emit(OpCodes.Castclass, field.FieldType);
95 ilgen.Emit(OpCodes.Call, MakeCompareExchange(context, field.FieldType));
96 ilgen.Emit(OpCodes.Ldarg_2);
97 ilgen.Emit(OpCodes.Ceq);
98 ilgen.Emit(OpCodes.Ret);
108 MethodBuilder
get = tb.DefineMethod(
"get", MethodAttributes.Public | MethodAttributes.Virtual, context.
Types.
Object,
new Type[] { context.Types.Object });
109 ILGenerator ilgen =
get.GetILGenerator();
110 ilgen.Emit(OpCodes.Ldarg_1);
111 ilgen.Emit(OpCodes.Castclass, field.DeclaringType);
112 ilgen.Emit(OpCodes.Volatile);
113 ilgen.Emit(OpCodes.Ldfld, field);
114 ilgen.Emit(OpCodes.Ret);
119 MethodBuilder
set = tb.DefineMethod(name, MethodAttributes.Public | MethodAttributes.Virtual, context.
Types.
Void,
new Type[] { context.Types.Object, context.Types.Object });
121 ilgen.Emit(OpCodes.Ldarg_1);
122 ilgen.Emit(OpCodes.Castclass, field.DeclaringType);
123 ilgen.Emit(OpCodes.Ldarg_2);
124 ilgen.Emit(OpCodes.Castclass, field.FieldType);
125 ilgen.Emit(OpCodes.Volatile);
126 ilgen.Emit(OpCodes.Stfld, field);
127 ilgen.EmitMemoryBarrier();
128 ilgen.Emit(OpCodes.Ret);
Maintains services relevant to an instane of the IKVM runtime.
CodeEmitterFactory CodeEmitterFactory
Gets the CodeEmitterFactory associated with this instance of the runtime.
Types Types
Gets the Types associated with this instance of the runtime.
InterlockedMethods InterlockedMethods
Gets the InterlockedMethods associated with this instance of the runtime.
ISymbolResolver Resolver
Gets the ISymbolResolver associated with this instance of the runtime.