39 static class IOHelpers
42 public static void WriteByte(
byte[] buf,
int offset,
byte value)
47 public static void WriteBoolean(
byte[] buf,
int offset,
bool value)
49 buf[offset] = value ? (byte)1 : (byte)0;
52 public static void WriteChar(
byte[] buf,
int offset,
char value)
54 buf[offset + 0] = (byte)(value >> 8);
55 buf[offset + 1] = (byte)(value >> 0);
58 public static void WriteShort(
byte[] buf,
int offset,
short value)
60 buf[offset + 0] = (byte)(value >> 8);
61 buf[offset + 1] = (byte)(value >> 0);
64 public static void WriteInt(
byte[] buf,
int offset,
int value)
66 buf[offset + 0] = (byte)(value >> 24);
67 buf[offset + 1] = (byte)(value >> 16);
68 buf[offset + 2] = (byte)(value >> 8);
69 buf[offset + 3] = (byte)(value >> 0);
72 public static void WriteFloat(
byte[] buf,
int offset,
float value)
74#if !FIRST_PASS && !IMPORTER
75 global::java.io.Bits.putFloat(buf, offset, value);
79 public static void WriteLong(
byte[] buf,
int offset,
long value)
81 WriteInt(buf, offset, (
int)(value >> 32));
82 WriteInt(buf, offset + 4, (
int)value);
85 public static void WriteDouble(
byte[] buf,
int offset,
double value)
87#if !FIRST_PASS && !IMPORTER
88 global::java.io.Bits.putDouble(buf, offset, value);
92 public static byte ReadByte(
byte[] buf,
int offset)
97 public static bool ReadBoolean(
byte[] buf,
int offset)
99 return buf[offset] != 0;
102 public static char ReadChar(
byte[] buf,
int offset)
104 return (
char)((buf[offset] << 8) + buf[offset + 1]);
107 public static short ReadShort(
byte[] buf,
int offset)
109 return (
short)((buf[offset] << 8) + buf[offset + 1]);
112 public static int ReadInt(
byte[] buf,
int offset)
114 return (buf[offset + 0] << 24)
115 + (buf[offset + 1] << 16)
116 + (buf[offset + 2] << 8)
117 + (buf[offset + 3] << 0);
120 public static float ReadFloat(
byte[] buf,
int offset)
122#if FIRST_PASS || IMPORTER
125 return global::java.lang.Float.intBitsToFloat(ReadInt(buf, offset));
129 public static long ReadLong(
byte[] buf,
int offset)
131 long hi = (uint)ReadInt(buf, offset);
132 long lo = (uint)ReadInt(buf, offset + 4);
133 return lo + (hi << 32);
136 public static double ReadDouble(
byte[] buf,
int offset)
138#if FIRST_PASS || IMPORTER
141 return global::java.lang.Double.longBitsToDouble(ReadLong(buf, offset));
152 RuntimeJavaType wrapper = RuntimeJavaType.FromClass(cl);
153 return !wrapper.IsFastClassLiteralSafe;
158 var wrapper = RuntimeJavaType.FromClass(cl);
168 var type = wrapper.TypeAsTBD;
169 if (!type.IsArray && type.TypeInitializer !=
null)
171 wrapper.RunClassInit();
172 return !wrapper.Context.AttributeHelper.IsHideFromJava(type.TypeInitializer);
178#if !FIRST_PASS && !NO_REF_EMIT
180 private sealed class FastFieldReflector : global::ikvm.@
internal.FieldReflectorBase
183 private static readonly
MethodInfo ReadByteMethod = typeof(IOHelpers).GetMethod(
"ReadByte");
184 private static readonly
MethodInfo ReadBooleanMethod = typeof(IOHelpers).GetMethod(
"ReadBoolean");
185 private static readonly
MethodInfo ReadCharMethod = typeof(IOHelpers).GetMethod(
"ReadChar");
186 private static readonly
MethodInfo ReadShortMethod = typeof(IOHelpers).GetMethod(
"ReadShort");
187 private static readonly
MethodInfo ReadIntMethod = typeof(IOHelpers).GetMethod(
"ReadInt");
188 private static readonly
MethodInfo ReadFloatMethod = typeof(IOHelpers).GetMethod(
"ReadFloat");
189 private static readonly
MethodInfo ReadLongMethod = typeof(IOHelpers).GetMethod(
"ReadLong");
190 private static readonly
MethodInfo ReadDoubleMethod = typeof(IOHelpers).GetMethod(
"ReadDouble");
191 private static readonly
MethodInfo WriteByteMethod = typeof(IOHelpers).GetMethod(
"WriteByte");
192 private static readonly
MethodInfo WriteBooleanMethod = typeof(IOHelpers).GetMethod(
"WriteBoolean");
193 private static readonly
MethodInfo WriteCharMethod = typeof(IOHelpers).GetMethod(
"WriteChar");
194 private static readonly
MethodInfo WriteShortMethod = typeof(IOHelpers).GetMethod(
"WriteShort");
195 private static readonly
MethodInfo WriteIntMethod = typeof(IOHelpers).GetMethod(
"WriteInt");
196 private static readonly
MethodInfo WriteFloatMethod = typeof(IOHelpers).GetMethod(
"WriteFloat");
197 private static readonly
MethodInfo WriteLongMethod = typeof(IOHelpers).GetMethod(
"WriteLong");
198 private static readonly
MethodInfo WriteDoubleMethod = typeof(IOHelpers).GetMethod(
"WriteDouble");
199 private delegate
void ObjFieldGetterSetter(
object obj,
object[] objarr);
200 private delegate
void PrimFieldGetterSetter(
object obj,
byte[] objarr);
201 private static readonly ObjFieldGetterSetter objDummy =
new ObjFieldGetterSetter(Dummy);
202 private static readonly PrimFieldGetterSetter primDummy =
new PrimFieldGetterSetter(Dummy);
203 private global::java.io.ObjectStreamField[] fields;
204 private ObjFieldGetterSetter objFieldGetter;
205 private PrimFieldGetterSetter primFieldGetter;
206 private ObjFieldGetterSetter objFieldSetter;
207 private PrimFieldGetterSetter primFieldSetter;
209 private static void Dummy(
object obj,
object[] objarr)
213 private static void Dummy(
object obj,
byte[] barr)
217 internal FastFieldReflector(global::java.io.ObjectStreamField[] fields)
219 this.fields = fields;
220 RuntimeJavaType tw =
null;
221 foreach (global::java.io.ObjectStreamField field in fields)
228 tw = fw.DeclaringType;
230 else if (tw != fw.DeclaringType)
233 throw new global::java.lang.InternalError();
239 objFieldGetter = objFieldSetter = objDummy;
240 primFieldGetter = primFieldSetter = primDummy;
253 var dmObjGetter =
DynamicMethodUtil.Create(
"__<ObjFieldGetter>", tw.TypeAsBaseType,
true,
null,
new Type[] { typeof(object), typeof(object[]) });
254 var dmPrimGetter =
DynamicMethodUtil.Create(
"__<PrimFieldGetter>", tw.TypeAsBaseType,
true,
null,
new Type[] { typeof(object), typeof(byte[]) });
255 var dmObjSetter =
DynamicMethodUtil.Create(
"__<ObjFieldSetter>", tw.TypeAsBaseType,
true,
null,
new Type[] { typeof(object), typeof(object[]) });
256 var dmPrimSetter =
DynamicMethodUtil.Create(
"__<PrimFieldSetter>", tw.TypeAsBaseType,
true,
null,
new Type[] { typeof(object), typeof(byte[]) });
264 var objGetterThis = ilgenObjGetter.DeclareLocal(tw.TypeAsBaseType);
265 var primGetterThis = ilgenPrimGetter.DeclareLocal(tw.TypeAsBaseType);
266 ilgenObjGetter.Emit(OpCodes.Ldarg_0);
267 ilgenObjGetter.Emit(OpCodes.Castclass, tw.TypeAsBaseType);
268 ilgenObjGetter.Emit(OpCodes.Stloc, objGetterThis);
269 ilgenPrimGetter.Emit(OpCodes.Ldarg_0);
270 ilgenPrimGetter.Emit(OpCodes.Castclass, tw.TypeAsBaseType);
271 ilgenPrimGetter.Emit(OpCodes.Stloc, primGetterThis);
273 foreach (global::java.io.ObjectStreamField field in fields)
281 RuntimeJavaType fieldType = fw.FieldTypeWrapper;
284 fieldType = fieldType.EnsureLoadable(tw.ClassLoader);
291 if (fieldType.IsPrimitive)
294 ilgenPrimGetter.Emit(OpCodes.Ldarg_1);
295 ilgenPrimGetter.EmitLdc_I4(field.getOffset());
296 ilgenPrimGetter.Emit(OpCodes.Ldloc, primGetterThis);
297 fw.EmitGet(ilgenPrimGetter);
298 if (fieldType == ilgenPrimGetter.Context.PrimitiveJavaTypeFactory.BYTE)
300 ilgenPrimGetter.Emit(OpCodes.Call, WriteByteMethod);
302 else if (fieldType == ilgenPrimGetter.Context.PrimitiveJavaTypeFactory.BOOLEAN)
304 ilgenPrimGetter.Emit(OpCodes.Call, WriteBooleanMethod);
306 else if (fieldType == ilgenPrimGetter.Context.PrimitiveJavaTypeFactory.CHAR)
308 ilgenPrimGetter.Emit(OpCodes.Call, WriteCharMethod);
310 else if (fieldType == ilgenPrimGetter.Context.PrimitiveJavaTypeFactory.SHORT)
312 ilgenPrimGetter.Emit(OpCodes.Call, WriteShortMethod);
314 else if (fieldType == ilgenPrimGetter.Context.PrimitiveJavaTypeFactory.INT)
316 ilgenPrimGetter.Emit(OpCodes.Call, WriteIntMethod);
318 else if (fieldType == ilgenPrimGetter.Context.PrimitiveJavaTypeFactory.FLOAT)
320 ilgenPrimGetter.Emit(OpCodes.Call, WriteFloatMethod);
322 else if (fieldType == ilgenPrimGetter.Context.PrimitiveJavaTypeFactory.LONG)
324 ilgenPrimGetter.Emit(OpCodes.Call, WriteLongMethod);
326 else if (fieldType == ilgenPrimGetter.Context.PrimitiveJavaTypeFactory.DOUBLE)
328 ilgenPrimGetter.Emit(OpCodes.Call, WriteDoubleMethod);
332 throw new global::java.lang.InternalError();
336 ilgenPrimSetter.Emit(OpCodes.Ldarg_0);
337 ilgenPrimSetter.Emit(OpCodes.Castclass, tw.TypeAsBaseType);
338 ilgenPrimSetter.Emit(OpCodes.Ldarg_1);
339 ilgenPrimSetter.EmitLdc_I4(field.getOffset());
340 if (fieldType == ilgenPrimSetter.Context.PrimitiveJavaTypeFactory.BYTE)
342 ilgenPrimSetter.Emit(OpCodes.Call, ReadByteMethod);
344 else if (fieldType == ilgenPrimSetter.Context.PrimitiveJavaTypeFactory.BOOLEAN)
346 ilgenPrimSetter.Emit(OpCodes.Call, ReadBooleanMethod);
348 else if (fieldType == ilgenPrimSetter.Context.PrimitiveJavaTypeFactory.CHAR)
350 ilgenPrimSetter.Emit(OpCodes.Call, ReadCharMethod);
352 else if (fieldType == ilgenPrimSetter.Context.PrimitiveJavaTypeFactory.SHORT)
354 ilgenPrimSetter.Emit(OpCodes.Call, ReadShortMethod);
356 else if (fieldType == ilgenPrimSetter.Context.PrimitiveJavaTypeFactory.INT)
358 ilgenPrimSetter.Emit(OpCodes.Call, ReadIntMethod);
360 else if (fieldType == ilgenPrimSetter.Context.PrimitiveJavaTypeFactory.FLOAT)
362 ilgenPrimSetter.Emit(OpCodes.Call, ReadFloatMethod);
364 else if (fieldType == ilgenPrimSetter.Context.PrimitiveJavaTypeFactory.LONG)
366 ilgenPrimSetter.Emit(OpCodes.Call, ReadLongMethod);
368 else if (fieldType == ilgenPrimSetter.Context.PrimitiveJavaTypeFactory.DOUBLE)
370 ilgenPrimSetter.Emit(OpCodes.Call, ReadDoubleMethod);
374 throw new global::java.lang.InternalError();
376 fw.EmitSet(ilgenPrimSetter);
381 ilgenObjGetter.Emit(OpCodes.Ldarg_1);
382 ilgenObjGetter.EmitLdc_I4(field.getOffset());
383 ilgenObjGetter.Emit(OpCodes.Ldloc, objGetterThis);
384 fw.EmitGet(ilgenObjGetter);
385 fieldType.EmitConvSignatureTypeToStackType(ilgenObjGetter);
386 ilgenObjGetter.Emit(OpCodes.Stelem_Ref);
389 ilgenObjSetter.Emit(OpCodes.Ldarg_0);
390 ilgenObjSetter.Emit(OpCodes.Ldarg_1);
391 ilgenObjSetter.EmitLdc_I4(field.getOffset());
392 ilgenObjSetter.Emit(OpCodes.Ldelem_Ref);
393 fieldType.EmitCheckcast(ilgenObjSetter);
394 fieldType.EmitConvStackTypeToSignatureType(ilgenObjSetter,
null);
395 fw.EmitSet(ilgenObjSetter);
398 ilgenObjGetter.Emit(OpCodes.Ret);
399 ilgenPrimGetter.Emit(OpCodes.Ret);
400 ilgenObjSetter.Emit(OpCodes.Ret);
401 ilgenPrimSetter.Emit(OpCodes.Ret);
402 ilgenObjGetter.DoEmit();
403 ilgenPrimGetter.DoEmit();
404 ilgenObjSetter.DoEmit();
405 ilgenPrimSetter.DoEmit();
406 objFieldGetter = (ObjFieldGetterSetter)dmObjGetter.CreateDelegate(typeof(ObjFieldGetterSetter));
407 primFieldGetter = (PrimFieldGetterSetter)dmPrimGetter.CreateDelegate(typeof(PrimFieldGetterSetter));
408 objFieldSetter = (ObjFieldGetterSetter)dmObjSetter.CreateDelegate(typeof(ObjFieldGetterSetter));
409 primFieldSetter = (PrimFieldGetterSetter)dmPrimSetter.CreateDelegate(typeof(PrimFieldGetterSetter));
413 private static RuntimeJavaField GetFieldWrapper(global::java.io.ObjectStreamField field)
415 global::java.lang.reflect.Field f = field.getField();
419 public override global::java.io.ObjectStreamField[] getFields()
424 public override void getObjFieldValues(
object obj,
object[] objarr)
426 objFieldGetter(obj, objarr);
429 public override void setObjFieldValues(
object obj,
object[] objarr)
431 objFieldSetter(obj, objarr);
434 public override void getPrimFieldValues(
object obj,
byte[] barr)
436 primFieldGetter(obj, barr);
439 public override void setPrimFieldValues(
object obj,
byte[] barr)
441 primFieldSetter(obj, barr);
448#if FIRST_PASS || NO_REF_EMIT
451 return new FastFieldReflector(fieldsObj);