+/*-------------------------------------------------------------------------------*/
+/* -- Processes STATIC & PRIVATE methods
+
+ * -- called for INVOKESTATIC, INVOKESPECIAL - PRIVATE and
+ * STATIC / PRIVATE methods used by NATIVE methods
+ *-------------------------------------------------------------------------------*/
+
+// Dez Version but gives too many Missed
+void invokestatic2( methodinfo *mi) {
+
+mi->class->classUsed = PARTUSED;
+/*-- RTA --*/
+addClassInit(mi->class, true, true, true);
+ RTAPRINT04invokestatic1
+
+if (opt_rt) {
+ ADDTOCALLGRAPH(mi)
+ } /* end RTA */
+
+/*-- XTA --*/
+if ((XTAOPTbypass) || (opt_xta)) {
+ mi->class->classUsed = PARTUSED;
+ rt_method->xta->XTAclassSet = add2ClassSet(rt_method->xta->XTAclassSet,mi->class);
+ xtaAddCallEdges(mi,MONO);
+ } /* end XTA */
+}
+
+
+
+//// from just RTA version before Dez changes
+void invokestatic(methodinfo *mi){
+ RTAPRINT04invokestatic1
+if (mi->class->classUsed == NOTUSED) {
+ mi->class->classUsed = USED;
+ RTAPRINT05invokestatic2
+ }
+ addClassInit(mi->class,true, true, true);
+
+ if (opt_rt) {
+ ADDTOCALLGRAPH(mi)
+ } /* end RTA */
+ /*-- XTA --*/
+ if ((XTAOPTbypass) || (opt_xta)) {
+ xtaAddCallEdges(mi,MONO);
+ } /* end XTA */
+}
+
+
+/*-------------------------------------------------------------------------------*/
+/* -- Processes <INIT> methods
+
+ * -- called for INVOKESPECIAL - <init> and
+ * <init> methods used by NATIVE methods
+ *-------------------------------------------------------------------------------*/
+
+void initMethods(methodinfo *mi) {
+
+classinfo *ci = mi->class;
+
+/* new class so add marked methods */
+if (opt_rt) {
+ if (( mi->methodUsed != USED) || (mi->class->classUsed == PARTUSED)) {
+ /*--- process NORMAL <init> method ---------------------------------------------*/
+ if ( mi->methodUsed != USED) {
+ /* Normal <init>
+ - mark class as USED and <init> to callgraph */
+
+ /*-- RTA --*/
+// addClassInit(mi->class,true, true, false);
+ ci->classUsed = USED;
+ rtaAddMarkedMethods(ci); /* add to callgraph marked methods */
+ RTAPRINT06Binvoke_spec_init
+ rtaAddUsedInterfaceMethods(ci);
+ ADDTOCALLGRAPH(mi)
+ }
+ }
+ }
+
+/*-- XTA --*/
+if ((XTAOPTbypass) || (opt_xta)) {
+ if (mi->xta == NULL) {
+ mi->xta = xtainfoInit(mi);
+ }
+ if ((mi->xta->XTAmethodUsed != USED) || (mi->class->classUsed == PARTUSED)) {
+ ci->classUsed = USED;
+ rt_method->xta->XTAclassSet = add2ClassSet(rt_method->xta->XTAclassSet,ci );
+ xtaAddMarkedMethods(ci); /* add to callgraph marked methods */
+ xtaAddUsedInterfaceMethods(ci);
+ xtaAddCallEdges(mi,MONO);
+ RTAPRINT06CXTAinvoke_spec_init1
+ } /* end XTA */
+ }
+}
+
+/*-------------------------------------------------------------------------------*/
+/* -- Processes VIRTUAL methods
+
+ * -- called for INVOKEVIRTUAL and
+ * virtual methods used by NATIVE methods
+ *-------------------------------------------------------------------------------*/
+
+void invokevirtual(methodinfo *mi) {
+
+/*--- RTA ---*/
+ RTAPRINT07invoke_spec_virt2
+mi->class->classUsed = USED; // Should this be later?
+
+if ((mi->flags & ACC_STATIC) || (mi->flags & ACC_PRIVATE) || (mi->flags & ACC_FINAL) ) {
+ invokestatic(mi);
+ return;
+ }
+
+
+mi->monoPoly = POLY;
+
+if (opt_rt) {
+ rtaMarkSubs(mi->class,mi);
+ }
+
+/*--- XTA ---*/
+if ((XTAOPTbypass) || (opt_xta)) {
+ classSetNode *subtypesUsedSet = NULL;
+ if (rt_method->xta->XTAclassSet != NULL)
+ subtypesUsedSet =
+ intersectSubtypesWithSet(mi->class, rt_method->xta->XTAclassSet->head);
+ else
+ subtypesUsedSet = addElement(subtypesUsedSet, rt_method->class);
+ /*****/
+ printf(" \nXTA subtypesUsedSet: "); fflush(stdout);
+ printSet(subtypesUsedSet);
+ /*****/
+ xtaMarkSubs(mi->class, mi, subtypesUsedSet);
+ } /* end XTA */
+}
+