2 * Copyright (C) 2014, United States Government, as represented by the
3 * Administrator of the National Aeronautics and Space Administration.
6 * The Java Pathfinder core (jpf-core) platform is licensed under the
7 * Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0.
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 package gov.nasa.jpf.vm;
20 import gov.nasa.jpf.Config;
21 import gov.nasa.jpf.annotation.MJI;
23 import java.lang.reflect.Modifier;
26 * native peer for java.lang.reflect.Field
28 public class JPF_java_lang_reflect_Field extends NativePeer {
30 // <2do> using Fields is fine, but creating them is not efficient until we get rid of the registry
32 static final int NREG = 64;
33 static FieldInfo[] registered;
34 static int nRegistered;
36 public static boolean init (Config conf){
37 registered = new FieldInfo[NREG];
42 static int registerFieldInfo (FieldInfo fi) {
45 for (idx=0; idx < nRegistered; idx++) {
46 if (registered[idx] == fi) {
51 if (idx == registered.length) {
52 FieldInfo[] newReg = new FieldInfo[registered.length+NREG];
53 System.arraycopy(registered, 0, newReg, 0, registered.length);
62 static FieldInfo getRegisteredFieldInfo (int idx) {
63 return registered[idx];
67 * <2do> that doesn't take care of class init yet
70 public int getType____Ljava_lang_Class_2 (MJIEnv env, int objRef) {
71 ThreadInfo ti = env.getThreadInfo();
72 FieldInfo fi = getFieldInfo(env, objRef);
74 ClassInfo ci = fi.getTypeClassInfo();
75 if (!ci.isRegistered()) {
79 return ci.getClassObjectRef();
83 public int getModifiers____I (MJIEnv env, int objRef){
84 FieldInfo fi = getFieldInfo(env, objRef);
85 return fi.getModifiers();
88 protected StackFrame getCallerFrame (MJIEnv env){
89 ThreadInfo ti = env.getThreadInfo();
90 StackFrame frame = ti.getTopFrame(); // this is the Field.get/setX(), so we still have to get down
91 return frame.getPrevious();
94 protected boolean isAccessible (MJIEnv env, FieldInfo fi, int fieldRef, int ownerRef){
96 // note that setAccessible() even overrides final
97 ElementInfo fei = env.getElementInfo(fieldRef);
98 if (fei.getBooleanField("isAccessible")){
110 // otherwise we have to check object identities and access modifier of the executing method
111 ClassInfo ciDecl = fi.getClassInfo();
112 String declPackage = ciDecl.getPackageName();
114 StackFrame frame = getCallerFrame(env);
115 MethodInfo mi = frame.getMethodInfo();
116 ClassInfo ciMethod = mi.getClassInfo();
117 String mthPackage = ciMethod.getPackageName();
119 if (!fi.isPrivate() && declPackage.equals(mthPackage)) {
124 if (ciDecl == ciMethod){
129 int thisRef = frame.getCalleeThis(mi);
130 if (thisRef == ownerRef) { // same object
135 // <2do> lots of more checks here
140 protected ElementInfo getCheckedElementInfo (MJIEnv env, FieldInfo fi, int objRef, int ownerRef, boolean isWrite){
143 if (!isAvailable(env, fi, ownerRef)){
148 ClassInfo fci = fi.getClassInfo();
149 ei = isWrite ? fci.getModifiableStaticElementInfo() : fci.getStaticElementInfo();
150 } else { // instance field
151 ei = isWrite ? env.getModifiableElementInfo(ownerRef) : env.getElementInfo(ownerRef);
155 env.throwException("java.lang.NullPointerException");
159 if ( !isAccessible(env, fi, objRef, ownerRef)){
160 env.throwException("java.lang.IllegalAccessException", "field not accessible: " + fi);
167 protected boolean checkFieldType (MJIEnv env, FieldInfo fi, Class<?> fiType){
168 if (!fiType.isInstance(fi)) {
169 env.throwException("java.lang.IllegalArgumentException", "incompatible field type: " + fi);
176 protected ElementInfo checkSharedFieldAccess (ThreadInfo ti, ElementInfo ei, FieldInfo fi){
177 Instruction insn = ti.getPC();
178 Scheduler scheduler = ti.getScheduler();
181 if (scheduler.canHaveSharedClassCG(ti, insn, ei, fi)){
182 ei = scheduler.updateClassSharedness(ti, ei, fi);
183 scheduler.setsSharedClassCG(ti, insn, ei, fi);
187 if (scheduler.canHaveSharedObjectCG(ti, insn, ei, fi)){
188 ei = scheduler.updateObjectSharedness(ti, ei, fi);
189 scheduler.setsSharedObjectCG(ti, insn, ei, fi);
197 public boolean getBoolean__Ljava_lang_Object_2__Z (MJIEnv env, int objRef, int ownerRef) {
198 ThreadInfo ti = env.getThreadInfo();
199 FieldInfo fi = getFieldInfo(env, objRef);
200 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, false);
202 if (checkFieldType(env, fi, BooleanFieldInfo.class)){
203 ei = checkSharedFieldAccess(ti, ei, fi);
204 if (ti.hasNextChoiceGenerator()) {
205 env.repeatInvocation();
209 return ei.getBooleanField(fi);
216 public byte getByte__Ljava_lang_Object_2__B (MJIEnv env, int objRef, int ownerRef) {
217 ThreadInfo ti = env.getThreadInfo();
218 FieldInfo fi = getFieldInfo(env, objRef);
219 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, false);
221 if (checkFieldType(env, fi, BooleanFieldInfo.class)) {
222 ei = checkSharedFieldAccess(ti, ei, fi);
223 if (ti.hasNextChoiceGenerator()) {
224 env.repeatInvocation();
227 return ei.getByteField(fi);
234 public char getChar__Ljava_lang_Object_2__C (MJIEnv env, int objRef, int ownerRef) {
235 ThreadInfo ti = env.getThreadInfo();
236 FieldInfo fi = getFieldInfo(env, objRef);
237 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, false);
239 if (checkFieldType(env, fi, CharFieldInfo.class)) {
240 ei = checkSharedFieldAccess(ti, ei, fi);
241 if (ti.hasNextChoiceGenerator()) {
242 env.repeatInvocation();
245 return ei.getCharField(fi);
252 public short getShort__Ljava_lang_Object_2__S (MJIEnv env, int objRef, int ownerRef) {
253 ThreadInfo ti = env.getThreadInfo();
254 FieldInfo fi = getFieldInfo(env, objRef);
255 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, false);
257 if (checkFieldType(env, fi, ShortFieldInfo.class)){
258 ei = checkSharedFieldAccess(ti, ei, fi);
259 if (ti.hasNextChoiceGenerator()) {
260 env.repeatInvocation();
263 return ei.getShortField(fi);
270 public int getInt__Ljava_lang_Object_2__I (MJIEnv env, int objRef, int ownerRef) {
271 ThreadInfo ti = env.getThreadInfo();
272 FieldInfo fi = getFieldInfo(env, objRef);
273 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, false);
275 if (checkFieldType(env, fi, IntegerFieldInfo.class)){
276 ei = checkSharedFieldAccess(ti, ei, fi);
277 if (ti.hasNextChoiceGenerator()) {
278 env.repeatInvocation();
281 return ei.getIntField(fi);
288 public long getLong__Ljava_lang_Object_2__J (MJIEnv env, int objRef, int ownerRef) {
289 ThreadInfo ti = env.getThreadInfo();
290 FieldInfo fi = getFieldInfo(env, objRef);
291 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, false);
293 if (checkFieldType(env, fi, LongFieldInfo.class)){
294 ei = checkSharedFieldAccess(ti, ei, fi);
295 if (ti.hasNextChoiceGenerator()) {
296 env.repeatInvocation();
299 return ei.getLongField(fi);
306 public float getFloat__Ljava_lang_Object_2__F (MJIEnv env, int objRef, int ownerRef) {
307 ThreadInfo ti = env.getThreadInfo();
308 FieldInfo fi = getFieldInfo(env, objRef);
309 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, false);
311 if (checkFieldType(env, fi, FloatFieldInfo.class)){
312 ei = checkSharedFieldAccess(ti, ei, fi);
313 if (ti.hasNextChoiceGenerator()) {
314 env.repeatInvocation();
317 return ei.getFloatField(fi);
324 public double getDouble__Ljava_lang_Object_2__D (MJIEnv env, int objRef, int ownerRef) {
325 ThreadInfo ti = env.getThreadInfo();
326 FieldInfo fi = getFieldInfo(env, objRef);
327 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, false);
329 if (checkFieldType(env, fi, DoubleFieldInfo.class)){
330 ei = checkSharedFieldAccess(ti, ei, fi);
331 if (ti.hasNextChoiceGenerator()) {
332 env.repeatInvocation();
335 return ei.getDoubleField(fi);
342 public int getAnnotation__Ljava_lang_Class_2__Ljava_lang_annotation_Annotation_2 (MJIEnv env, int objRef, int annotationClsRef) {
343 FieldInfo fi = getFieldInfo(env,objRef);
344 ClassInfo aci = env.getReferredClassInfo(annotationClsRef);
346 AnnotationInfo ai = fi.getAnnotation(aci.getName());
348 ClassInfo aciProxy = aci.getAnnotationProxy();
350 return env.newAnnotationProxy(aciProxy, ai);
351 } catch (ClinitRequired x){
352 env.handleClinitRequest(x.getRequiredClassInfo());
361 public int getAnnotations_____3Ljava_lang_annotation_Annotation_2 (MJIEnv env, int objRef){
362 FieldInfo fi = getFieldInfo(env,objRef);
363 AnnotationInfo[] ai = fi.getAnnotations();
366 return env.newAnnotationProxies(ai);
367 } catch (ClinitRequired x){
368 env.handleClinitRequest(x.getRequiredClassInfo());
374 public void setBoolean__Ljava_lang_Object_2Z__V (MJIEnv env, int objRef, int ownerRef,
376 ThreadInfo ti = env.getThreadInfo();
377 FieldInfo fi = getFieldInfo(env, objRef);
378 if (!isAvailable(env, fi, ownerRef)){
382 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, true);
384 if (checkFieldType(env, fi, BooleanFieldInfo.class)){
385 ei = checkSharedFieldAccess(ti, ei, fi);
386 if (ti.getVM().hasNextChoiceGenerator()) {
387 env.repeatInvocation();
390 ei.setBooleanField(fi, val);
396 public void setByte__Ljava_lang_Object_2B__V (MJIEnv env, int objRef, int ownerRef, byte val) {
397 ThreadInfo ti = env.getThreadInfo();
398 FieldInfo fi = getFieldInfo(env, objRef);
399 if (!isAvailable(env, fi, ownerRef)){
403 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, true);
405 if (checkFieldType(env, fi, ByteFieldInfo.class)){
406 ei = checkSharedFieldAccess(ti, ei, fi);
407 if (ti.getVM().hasNextChoiceGenerator()) {
408 env.repeatInvocation();
411 ei.setByteField(fi, val);
417 public void setChar__Ljava_lang_Object_2C__V (MJIEnv env, int objRef, int ownerRef, char val) {
418 ThreadInfo ti = env.getThreadInfo();
419 FieldInfo fi = getFieldInfo(env, objRef);
420 if (!isAvailable(env, fi, ownerRef)){
424 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, true);
426 if (checkFieldType(env, fi, CharFieldInfo.class)){
427 ei = checkSharedFieldAccess(ti, ei, fi);
428 if (ti.getVM().hasNextChoiceGenerator()) {
429 env.repeatInvocation();
432 ei.setCharField(fi, val);
438 public void setShort__Ljava_lang_Object_2S__V (MJIEnv env, int objRef, int ownerRef, short val) {
439 ThreadInfo ti = env.getThreadInfo();
440 FieldInfo fi = getFieldInfo(env, objRef);
441 if (!isAvailable(env, fi, ownerRef)){
445 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, true);
447 if (checkFieldType(env, fi, ShortFieldInfo.class)){
448 ei = checkSharedFieldAccess(ti, ei, fi);
449 if (ti.getVM().hasNextChoiceGenerator()) {
450 env.repeatInvocation();
453 ei.setShortField(fi, val);
459 public void setInt__Ljava_lang_Object_2I__V (MJIEnv env, int objRef, int ownerRef, int val) {
460 ThreadInfo ti = env.getThreadInfo();
461 FieldInfo fi = getFieldInfo(env, objRef);
462 if (!isAvailable(env, fi, ownerRef)){
466 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, true);
468 if (checkFieldType(env, fi, IntegerFieldInfo.class)){
469 ei = checkSharedFieldAccess(ti, ei, fi);
470 if (ti.getVM().hasNextChoiceGenerator()) {
471 env.repeatInvocation();
474 ei.setIntField(fi, val);
480 public void setLong__Ljava_lang_Object_2J__V (MJIEnv env, int objRef, int ownerRef, long val) {
481 ThreadInfo ti = env.getThreadInfo();
482 FieldInfo fi = getFieldInfo(env, objRef);
483 if (!isAvailable(env, fi, ownerRef)){
487 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, true);
489 if (checkFieldType(env, fi, LongFieldInfo.class)){
490 ei = checkSharedFieldAccess(ti, ei, fi);
491 if (ti.getVM().hasNextChoiceGenerator()) {
492 env.repeatInvocation();
495 ei.setLongField(fi, val);
501 public void setFloat__Ljava_lang_Object_2F__V (MJIEnv env, int objRef, int ownerRef, float val) {
502 ThreadInfo ti = env.getThreadInfo();
503 FieldInfo fi = getFieldInfo(env, objRef);
504 if (!isAvailable(env, fi, ownerRef)){
508 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, true);
510 if (checkFieldType(env, fi, FloatFieldInfo.class)){
511 ei = checkSharedFieldAccess(ti, ei, fi);
512 if (ti.getVM().hasNextChoiceGenerator()) {
513 env.repeatInvocation();
516 ei.setFloatField(fi, val);
522 public void setDouble__Ljava_lang_Object_2D__V (MJIEnv env, int objRef, int ownerRef, double val) {
523 ThreadInfo ti = env.getThreadInfo();
524 FieldInfo fi = getFieldInfo(env, objRef);
525 if (!isAvailable(env, fi, ownerRef)){
529 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, true);
531 if (checkFieldType(env, fi, DoubleFieldInfo.class)){
532 ei = checkSharedFieldAccess(ti, ei, fi);
533 if (ti.getVM().hasNextChoiceGenerator()) {
534 env.repeatInvocation();
537 ei.setDoubleField(fi, val);
543 public int get__Ljava_lang_Object_2__Ljava_lang_Object_2 (MJIEnv env, int objRef, int ownerRef) {
544 ThreadInfo ti = env.getThreadInfo();
545 FieldInfo fi = getFieldInfo(env, objRef);
547 ElementInfo ei = getCheckedElementInfo( env, fi, objRef, ownerRef, false); // no type check here
549 // just return, NPE already thrown by getCheckedElementInfo()
553 ei = checkSharedFieldAccess(ti, ei, fi);
554 if (ti.getVM().hasNextChoiceGenerator()) {
555 env.repeatInvocation();
559 if (!(fi instanceof ReferenceFieldInfo)) { // primitive type, we need to box it
560 if (fi instanceof DoubleFieldInfo){
561 double d = ei.getDoubleField(fi);
562 return env.newDouble(d);
563 } else if (fi instanceof FloatFieldInfo){
564 float f = ei.getFloatField(fi);
565 return env.newFloat(f);
566 } else if (fi instanceof LongFieldInfo){
567 long l = ei.getLongField(fi);
568 return env.newLong(l);
569 } else if (fi instanceof IntegerFieldInfo){
570 // this might actually represent a plethora of types
571 int i = ei.getIntField(fi);
572 return env.newInteger(i);
573 } else if (fi instanceof BooleanFieldInfo){
574 boolean b = ei.getBooleanField(fi);
575 return env.newBoolean(b);
576 } else if (fi instanceof ByteFieldInfo){
577 byte z = ei.getByteField(fi);
578 return env.newByte(z);
579 } else if (fi instanceof CharFieldInfo){
580 char c = ei.getCharField(fi);
581 return env.newCharacter(c);
582 } else if (fi instanceof ShortFieldInfo){
583 short s = ei.getShortField(fi);
584 return env.newShort(s);
587 } else { // it's a reference
588 int ref = ei.getReferenceField(fi); // we internally store it as int
592 env.throwException("java.lang.IllegalArgumentException", "unknown field type");
597 public int getDeclaringClass____Ljava_lang_Class_2 (MJIEnv env, int objref){
598 FieldInfo fi = getFieldInfo(env, objref);
599 ClassInfo ci = fi.getClassInfo();
600 return ci.getClassObjectRef();
604 public boolean isSynthetic____Z (MJIEnv env, int objref){
605 FieldInfo fi = getFieldInfo(env, objref);
606 String fn = fi.getName();
607 return (fn.startsWith("this$") || fn.startsWith("val$"));
611 public int getName____Ljava_lang_String_2 (MJIEnv env, int objRef) {
612 FieldInfo fi = getFieldInfo(env, objRef);
614 int nameRef = env.getReferenceField( objRef, "name");
615 if (nameRef == MJIEnv.NULL) {
616 nameRef = env.newString(fi.getName());
617 env.setReferenceField(objRef, "name", nameRef);
623 static FieldInfo getFieldInfo (MJIEnv env, int objRef) {
624 int fidx = env.getIntField( objRef, "regIdx");
625 assert ((fidx >= 0) || (fidx < nRegistered)) : "illegal FieldInfo request: " + fidx + ", " + nRegistered;
627 return registered[fidx];
630 static boolean isAvailable (MJIEnv env, FieldInfo fi, int ownerRef){
632 ClassInfo fci = fi.getClassInfo();
633 if (fci.initializeClass(env.getThreadInfo())){
634 env.repeatInvocation();
639 if (ownerRef == MJIEnv.NULL){
640 env.throwException("java.lang.NullPointerException");
643 // class had obviously been initialized, otherwise we won't have an instance of it
651 * Peer method for the <code>java.lang.reflect.Field.set</code> method.
653 * <2do> refactor to make boxed type handling more efficient
656 public void set__Ljava_lang_Object_2Ljava_lang_Object_2__V (MJIEnv env, int objRef, int ownerRef, int val) {
657 ThreadInfo ti = env.getThreadInfo();
658 FieldInfo fi = getFieldInfo(env, objRef);
660 if (!isAvailable(env, fi, ownerRef)){
664 ClassInfo ci = fi.getClassInfo();
665 ClassInfo cio = env.getClassInfo(ownerRef);
667 if (!fi.isStatic() && !cio.isInstanceOf(ci)) {
668 env.throwException("java.lang.IllegalArgumentException",
669 fi.getType() + "field " + fi.getName() + " does not belong to this object");
673 Object[] attrs = env.getArgAttributes();
674 Object attr = (attrs==null)? null: attrs[2];
676 String type = getValueType(env, val);
678 if (!isAssignmentCompatible(env, fi, val)){
679 env.throwException("java.lang.IllegalArgumentException",
680 "field of type " + fi.getType() + " not assignment compatible with " + type + " object");
683 ElementInfo ei = getCheckedElementInfo(env, fi, objRef, ownerRef, true);
685 // <2do> what about exposure?
686 ei = checkSharedFieldAccess(ti, ei, fi);
687 if (ti.getVM().hasNextChoiceGenerator()) {
688 env.repeatInvocation();
692 if (!setValue(env, fi, ownerRef, val, attr)) {
693 env.throwException("java.lang.IllegalArgumentException",
694 "Can not set " + fi.getType() + " field " + fi.getFullName() + " to " + ((MJIEnv.NULL != val) ? env.getClassInfo(val).getName() + " object " : "null"));
699 protected String getValueType (MJIEnv env, int ref){
700 if (ref != MJIEnv.NULL){
701 ElementInfo eiVal = env.getElementInfo(ref);
702 return eiVal.getType();
708 protected boolean isAssignmentCompatible (MJIEnv env, FieldInfo fi, int refVal){
709 if (refVal == MJIEnv.NULL){
713 ElementInfo eiVal = env.getElementInfo(refVal);
714 ClassInfo ciVal = eiVal.getClassInfo();
715 String valClsName = ciVal.getName();
717 if (fi.isBooleanField() && valClsName.equals("java.lang.Boolean")) return true;
718 else if (fi.isByteField() && valClsName.equals("java.lang.Byte")) return true;
719 else if (fi.isCharField() && valClsName.equals("java.lang.Char")) return true;
720 else if (fi.isShortField() && valClsName.equals("java.lang.Short")) return true;
721 else if (fi.isIntField() && valClsName.equals("java.lang.Integer")) return true;
722 else if (fi.isLongField() && valClsName.equals("java.lang.Long")) return true;
723 else if (fi.isFloatField() && valClsName.equals("java.lang.Float")) return true;
724 else if (fi.isDoubleField() && valClsName.equals("java.lang.Double")) return true;
726 return ciVal.isInstanceOf(fi.getTypeClassInfo());
731 protected static boolean setValue(MJIEnv env, FieldInfo fi, int obj, int value, Object attr) {
732 ClassInfo fieldClassInfo = fi.getClassInfo();
733 String className = fieldClassInfo.getName();
734 String fieldType = fi.getType();
735 ClassInfo tci = fi.getTypeClassInfo();
737 ElementInfo ei = null;
739 ei = fi.getClassInfo().getModifiableStaticElementInfo();
741 ei = env.getModifiableElementInfo(obj);
744 if (tci.isPrimitive()) {
745 if (value == MJIEnv.NULL) {
749 // checks whether unboxing can be done by accessing the field "value"
750 final String fieldName = "value";
751 FieldInfo finfo = env.getElementInfo(value).getFieldInfo(fieldName);
756 ei.setFieldAttr(fi, attr);
758 if ("boolean".equals(fieldType)){
759 boolean val = env.getBooleanField(value, fieldName);
760 ei.setBooleanField(fi, val);
762 } else if ("byte".equals(fieldType)){
763 byte val = env.getByteField(value, fieldName);
764 ei.setByteField(fi, val);
766 } else if ("char".equals(fieldType)){
767 char val = env.getCharField(value, fieldName);
768 ei.setCharField(fi, val);
770 } else if ("short".equals(fieldType)){
771 short val = env.getShortField(value, fieldName);
772 ei.setShortField(fi, val);
774 } else if ("int".equals(fieldType)){
775 int val = env.getIntField(value, fieldName);
776 ei.setIntField(fi, val);
778 } else if ("long".equals(fieldType)){
779 long val = env.getLongField(value, fieldName);
780 ei.setLongField(fi, val);
782 } else if ("float".equals(fieldType)){
783 float val = env.getFloatField(value, fieldName);
784 ei.setFloatField(fi, val);
786 } else if ("double".equals(fieldType)){
787 double val = env.getDoubleField(value, fieldName);
788 ei.setDoubleField(fi, val);
794 } else { // it's a reference
795 if (value != MJIEnv.NULL) {
796 ClassInfo ciValue = env.getClassInfo(value);
797 if (!ciValue.isInstanceOf(tci)) {
802 ei.setFieldAttr(fi, attr);
805 env.setStaticReferenceField(className, fi.getName(), value);
807 env.setReferenceField(obj, fi.getName(), value);
814 public boolean equals__Ljava_lang_Object_2__Z (MJIEnv env, int objRef, int ownerRef){
815 int fidx = env.getIntField(ownerRef, "regIdx");
816 if (fidx >= 0 && fidx < nRegistered){
817 FieldInfo fi1 = getFieldInfo(env, objRef);
818 FieldInfo fi2 = getFieldInfo(env, ownerRef);
819 return ((fi1.getClassInfo() == fi2.getClassInfo()) && fi1.getName().equals(fi2.getName()) && fi1.getType().equals(fi2.getType()));
825 public int toString____Ljava_lang_String_2 (MJIEnv env, int objRef){
826 StringBuilder sb = new StringBuilder();
827 FieldInfo fi = getFieldInfo(env, objRef);
828 sb.append(Modifier.toString(fi.getModifiers()));
830 sb.append(fi.getType());
832 sb.append(fi.getFullName());
833 int sref = env.newString(sb.toString());
838 public int hashCode____I (MJIEnv env, int objRef){
839 FieldInfo fi = getFieldInfo(env, objRef);
840 return fi.getClassInfo().getName().hashCode() ^ fi.getName().hashCode();
844 public int getDeclaredAnnotations_____3Ljava_lang_annotation_Annotation_2 (MJIEnv env, int objRef){
845 return getAnnotations_____3Ljava_lang_annotation_Annotation_2(env, objRef);