IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
RuntimeVolatileLongDoubleJavaField.cs
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2014 Jeroen Frijters
3
4 This software is provided 'as-is', without any express or implied
5 warranty. In no event will the authors be held liable for any damages
6 arising from the use of this software.
7
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
10 freely, subject to the following restrictions:
11
12 1. The origin of this software must not be misrepresented; you must not
13 claim that you wrote the original software. If you use this software
14 in a product, an acknowledgment in the product documentation would be
15 appreciated but is not required.
16 2. Altered source versions must be plainly marked as such, and must not be
17 misrepresented as being the original software.
18 3. This notice may not be removed or altered from any source distribution.
19
20 Jeroen Frijters
21 jeroen@frijters.net
22
23*/
24using System;
25
26#if IMPORTER || EXPORTER
27using IKVM.Reflection;
29#else
30using System.Reflection;
31using System.Reflection.Emit;
32#endif
33
34namespace IKVM.Runtime
35{
36
41 {
42
52 internal RuntimeVolatileLongDoubleJavaField(RuntimeJavaType declaringType, RuntimeJavaType fieldType, FieldInfo fi, string name, string sig, ExModifiers modifiers) :
53 base(declaringType, fieldType, name, sig, modifiers, fi)
54 {
55 if (sig != "J" && sig != "D")
56 throw new ArgumentException($"{nameof(RuntimeVolatileLongDoubleJavaField)} expects long or double signature.", nameof(sig));
57 if (IsVolatile == false)
58 throw new InternalException($"{nameof(RuntimeVolatileLongDoubleJavaField)} requires volatile type.");
59 }
60
61#if EMITTERS
62
63 protected override void EmitGetImpl(CodeEmitter il)
64 {
65 var fi = GetField();
66
67 if (fi.IsStatic)
68 {
69 il.Emit(OpCodes.Ldsflda, fi);
70 }
71 else
72 {
73 if (DeclaringType.IsNonPrimitiveValueType)
74 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsTBD);
75
76 il.Emit(OpCodes.Ldflda, fi);
77 }
78
79 if (FieldTypeWrapper == DeclaringType.Context.PrimitiveJavaTypeFactory.LONG)
80 {
81 il.Emit(OpCodes.Call, DeclaringType.Context.ByteCodeHelperMethods.VolatileReadLong);
82 }
83 else if (FieldTypeWrapper == DeclaringType.Context.PrimitiveJavaTypeFactory.DOUBLE)
84 {
85 il.Emit(OpCodes.Call, DeclaringType.Context.ByteCodeHelperMethods.VolatileReadDouble);
86 }
87 else
88 {
89 throw new InternalException($"{nameof(RuntimeVolatileLongDoubleJavaField)} expects long or double.");
90 }
91 }
92
93 protected override void EmitSetImpl(CodeEmitter il)
94 {
95 var fi = GetField();
96
97 var value = il.DeclareLocal(FieldTypeWrapper.TypeAsSignatureType);
98 il.Emit(OpCodes.Stloc, value);
99
100 if (fi.IsStatic)
101 {
102 il.Emit(OpCodes.Ldsflda, fi);
103 }
104 else
105 {
106 if (DeclaringType.IsNonPrimitiveValueType)
107 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsTBD);
108
109 il.Emit(OpCodes.Ldflda, fi);
110 }
111
112 il.Emit(OpCodes.Ldloc, value);
113
114 if (FieldTypeWrapper == DeclaringType.Context.PrimitiveJavaTypeFactory.LONG)
115 {
116 il.Emit(OpCodes.Call, DeclaringType.Context.ByteCodeHelperMethods.VolatileWriteLong);
117 }
118 else if (FieldTypeWrapper == DeclaringType.Context.PrimitiveJavaTypeFactory.DOUBLE)
119 {
120 il.Emit(OpCodes.Call, DeclaringType.Context.ByteCodeHelperMethods.VolatileWriteDouble);
121 }
122 else
123 {
124 throw new InternalException($"{nameof(RuntimeVolatileLongDoubleJavaField)} expects long or double.");
125 }
126 }
127
128 protected override void EmitUnsafeVolatileGetImpl(CodeEmitter il)
129 {
130 var fi = GetField();
131
132 if (IsStatic)
133 {
134 il.Emit(OpCodes.Ldsflda, fi);
135 }
136 else
137 {
138 if (DeclaringType.IsNonPrimitiveValueType)
139 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsTBD);
140
141 il.Emit(OpCodes.Ldflda, fi);
142 }
143
144 if (FieldTypeWrapper == DeclaringType.Context.PrimitiveJavaTypeFactory.LONG)
145 {
146 il.Emit(OpCodes.Call, DeclaringType.Context.ByteCodeHelperMethods.VolatileReadLong);
147 }
148 else if (FieldTypeWrapper == DeclaringType.Context.PrimitiveJavaTypeFactory.DOUBLE)
149 {
150 il.Emit(OpCodes.Call, DeclaringType.Context.ByteCodeHelperMethods.VolatileReadDouble);
151 }
152 else
153 {
154 throw new InternalException($"{nameof(RuntimeVolatileLongDoubleJavaField)} expects long or double.");
155 }
156 }
157
158 protected override void EmitUnsafeVolatileSetImpl(CodeEmitter il)
159 {
160 var fi = GetField();
161
162 var value = il.DeclareLocal(FieldTypeWrapper.TypeAsSignatureType);
163 il.Emit(OpCodes.Stloc, value);
164
165 if (IsStatic)
166 {
167 il.Emit(OpCodes.Ldsflda, fi);
168 }
169 else
170 {
171 if (DeclaringType.IsNonPrimitiveValueType)
172 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsTBD);
173
174 il.Emit(OpCodes.Ldflda, fi);
175 }
176
177 il.Emit(OpCodes.Ldloc, value);
178
179 if (FieldTypeWrapper == DeclaringType.Context.PrimitiveJavaTypeFactory.LONG)
180 {
181 il.Emit(OpCodes.Call, DeclaringType.Context.ByteCodeHelperMethods.VolatileWriteLong);
182 }
183 else if (FieldTypeWrapper == DeclaringType.Context.PrimitiveJavaTypeFactory.DOUBLE)
184 {
185 il.Emit(OpCodes.Call, DeclaringType.Context.ByteCodeHelperMethods.VolatileWriteDouble);
186 }
187 else
188 {
189 throw new InternalException($"{nameof(RuntimeVolatileLongDoubleJavaField)} expects long or double.");
190 }
191 }
192
193 protected override void EmitUnsafeCompareAndSwapImpl(CodeEmitter il)
194 {
195 var fi = GetField();
196
197 var value = il.DeclareLocal(FieldTypeWrapper.TypeAsSignatureType);
198 il.Emit(OpCodes.Stloc, value);
199 var expect = il.DeclareLocal(FieldTypeWrapper.TypeAsSignatureType);
200 il.Emit(OpCodes.Stloc, expect);
201
202 if (IsStatic)
203 {
204 il.Emit(OpCodes.Ldsflda, fi);
205 }
206 else
207 {
208 if (DeclaringType.IsNonPrimitiveValueType)
209 il.Emit(OpCodes.Unbox, DeclaringType.TypeAsTBD);
210
211 il.Emit(OpCodes.Ldflda, fi);
212 }
213
214 il.Emit(OpCodes.Ldloc, expect);
215 il.Emit(OpCodes.Ldloc, value);
216
217 if (FieldTypeWrapper == DeclaringType.Context.PrimitiveJavaTypeFactory.LONG)
218 {
219 il.Emit(OpCodes.Call, DeclaringType.Context.ByteCodeHelperMethods.CompareAndSwapLong);
220 }
221 else if (FieldTypeWrapper == DeclaringType.Context.PrimitiveJavaTypeFactory.DOUBLE)
222 {
223 il.Emit(OpCodes.Call, DeclaringType.Context.ByteCodeHelperMethods.CompareAndSwapDouble);
224 }
225 else
226 {
227 throw new InternalException($"{nameof(RuntimeVolatileLongDoubleJavaField)} expects long or double.");
228 }
229 }
230
231#endif
232
233#if !IMPORTER && !EXPORTER && !FIRST_PASS
234
235 internal override object GetValue(object obj)
236 {
237 throw new InvalidOperationException();
238 }
239
240 internal override void SetValue(object obj, object value)
241 {
242 throw new InvalidOperationException();
243 }
244
245#endif
246
247 }
248
249}
IKVM.Reflection.FieldInfo FieldInfo
Represents an internal error that occurred within IKVM.
ByteCodeHelperMethods ByteCodeHelperMethods
Gets the ByteCodeHelperMethods associated with this instance of the runtime.
RuntimePrimitiveJavaTypeFactory PrimitiveJavaTypeFactory
Gets the RuntimePrimitiveJavaTypeFactory associated with this instance of the runtime.
Field wrapper for a field of type 'volatile long' or 'volatile double'.