You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by dl...@apache.org on 2006/04/05 07:13:59 UTC

svn commit: r391502 - /incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/linkage.c

Author: dlydick
Date: Tue Apr  4 22:13:58 2006
New Revision: 391502

URL: http://svn.apache.org/viewcvs?rev=391502&view=rev
Log:
Scan for superclass in field, method, and interface
method reference linkages.

Comment out pieces currently unused that might be needed later.

Small white space changes.

Modified:
    incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/linkage.c

Modified: incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/linkage.c
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/linkage.c?rev=391502&r1=391501&r2=391502&view=diff
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/linkage.c (original)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/bootjvm/bootJVM/jvm/src/linkage.c Tue Apr  4 22:13:58 2006
@@ -182,7 +182,7 @@
                     else
                     {
                         PTR_THIS_CP_Class(pcpd)
-                           ->LOCAL_Class_binding.clsidxJVM = clsidxFIND;
+                          ->LOCAL_Class_binding.clsidxJVM = clsidxFIND;
 
                         /* Add reference unless it references itself */
                         if (clsidx != clsidxFIND)
@@ -213,7 +213,7 @@
                     clsidxFIND = class_find_by_cp_entry(clsname);
 
                     pcpd_Fieldref
-                        ->LOCAL_Fieldref_binding.clsidxJVM = clsidxFIND;
+                      ->LOCAL_Fieldref_binding.clsidxJVM = clsidxFIND;
 
                     if (jvm_class_index_null == clsidxFIND)
                     {
@@ -222,18 +222,52 @@
                     }
                     else
                     {
-                        pcpd_NameAndType =
-                            PTR_THIS_CP_NameAndType(
-                                pcfs->constant_pool
-                                  [pcpd_Fieldref->name_and_type_index]);
+                        /*!
+                         * @todo HARMONY-6-jvm-linkage.c-3 The
+                         *       @c @b while() loop that scans for
+                         *       the field in a superclass needs
+                         *       unit testing w/ real data.
+                         */
+                        while(rtrue)
+                        {
+                            pcpd_NameAndType =
+                                PTR_THIS_CP_NameAndType(
+                                    pcfs->constant_pool
+                                      [pcpd_Fieldref
+                                         ->name_and_type_index]);
 
-                        fldidxFIND =
-                            field_find_by_cp_entry(
-                                clsidxFIND,
-                                pcfs->constant_pool
-                                    [pcpd_NameAndType->name_index],
-                                pcfs->constant_pool
-                                  [pcpd_NameAndType->descriptor_index]);
+                            fldidxFIND =
+                                field_find_by_cp_entry(
+                                    clsidxFIND,
+                                    pcfs->constant_pool
+                                            [pcpd_NameAndType
+                                               ->name_index],
+                                    pcfs->constant_pool
+                                            [pcpd_NameAndType
+                                               ->descriptor_index]);
+
+                            /* Done if field located */
+                            if (jvm_field_index_bad != fldidxFIND)
+                            {
+                                break;
+                            }
+
+                            /* Otherwise search superclass */
+                            clsidxFIND =
+                                CLASS_OBJECT_LINKAGE(clsidxFIND)
+                                  ->pcfs
+                                    ->super_class;
+
+                            pcpd_Fieldref
+                              ->LOCAL_Fieldref_binding.clsidxJVM =
+                                clsidxFIND;
+
+                            /* Quit if no more superclasses */
+                            if (jvm_class_index_null == clsidxFIND)
+                            {
+                                break;
+                            }
+                        }
 
                         if (jvm_field_index_bad == fldidxFIND)
                         {
@@ -243,16 +277,16 @@
 /*NOTREACHED*/
 #if 0
                             pcpd_Fieldref
-                                ->LOCAL_Fieldref_binding.fluidxJVM =
-                                    jvm_field_lookup_index_bad;
+                              ->LOCAL_Fieldref_binding.fluidxJVM =
+                                             jvm_field_lookup_index_bad;
 
                             pcpd_Fieldref
-                                ->LOCAL_Fieldref_binding.oiflagJVM =
-                                    rneither_true_nor_false;
+                              ->LOCAL_Fieldref_binding.oiflagJVM =
+                                                rneither_true_nor_false;
 
                             pcpd_Fieldref
-                                ->LOCAL_Fieldref_binding.jvaluetypeJVM =
-                                    LOCAL_BASETYPE_ERROR;
+                              ->LOCAL_Fieldref_binding.jvaluetypeJVM =
+                                                   LOCAL_BASETYPE_ERROR;
 
                             /* No point processing ACC_STATIC bit */
                             continue;
@@ -278,8 +312,8 @@
                         }
 
                         pcpd_Fieldref
-                            ->LOCAL_Fieldref_binding.fluidxJVM =
-                                fluidxFIND;
+                          ->LOCAL_Fieldref_binding.fluidxJVM =
+                                                             fluidxFIND;
 
                         if (jvm_field_lookup_index_bad == fluidxFIND)
                         {
@@ -287,24 +321,25 @@
                             exit_throw_exception(EXIT_JVM_CLASS,
                                    JVMCLASS_JAVA_LANG_NOSUCHFIELDERROR);
 /*NOTREACHED*/
-
+#if 0
                             pcpd_Fieldref
-                                ->LOCAL_Fieldref_binding.oiflagJVM =
-                                    rneither_true_nor_false;
+                              ->LOCAL_Fieldref_binding.oiflagJVM =
+                                                rneither_true_nor_false;
 
                             pcpd_Fieldref
-                                ->LOCAL_Fieldref_binding.jvaluetypeJVM =
-                                    LOCAL_BASETYPE_ERROR;
+                              ->LOCAL_Fieldref_binding.jvaluetypeJVM =
+                                                   LOCAL_BASETYPE_ERROR;
 
                             /*
                              * Don't have valid @b oiflagJVM or
                              * @b jvaluetypeJVM result
                              */
                             continue;
+#endif
                         }
 
                         pcpd_Fieldref
-                            ->LOCAL_Fieldref_binding.oiflagJVM =
+                          ->LOCAL_Fieldref_binding.oiflagJVM =
                                 (FIELD(clsidxFIND, fldidxFIND)
                                    ->access_flags & ACC_STATIC)
                                 ? rfalse
@@ -327,9 +362,8 @@
                          *       or BASETYPE_VOID?
                          */
                         pcpd_Fieldref
-                            ->LOCAL_Fieldref_binding.jvaluetypeJVM =
-
-                                pfldesc->bytes[0];
+                          ->LOCAL_Fieldref_binding.jvaluetypeJVM =
+                                                      pfldesc->bytes[0];
 
                         /* Add reference unless it references itself */
                         if (clsidx != clsidxFIND)
@@ -351,8 +385,10 @@
                     pcpd_Methodref->LOCAL_Methodref_binding.clsidxJVM)
                 {
                     pcpd_Class =
-                        PTR_THIS_CP_Class(pcfs->constant_pool
-                                         [pcpd_Methodref->class_index]);
+                        PTR_THIS_CP_Class(
+                            pcfs
+                              ->constant_pool
+                                [pcpd_Methodref->class_index]);
 
                     clsname =
                         pcfs->constant_pool[pcpd_Class->name_index];
@@ -360,7 +396,7 @@
                     clsidxFIND = class_find_by_cp_entry(clsname);
 
                     pcpd_Methodref
-                        ->LOCAL_Methodref_binding.clsidxJVM =clsidxFIND;
+                      ->LOCAL_Methodref_binding.clsidxJVM = clsidxFIND;
 
                     if (jvm_class_index_null == clsidxFIND)
                     {
@@ -369,22 +405,58 @@
                     }
                     else
                     {
-                        pcpd_NameAndType =
-                            PTR_THIS_CP_NameAndType(
-                                pcfs->constant_pool
-                                 [pcpd_Methodref->name_and_type_index]);
+                        /*!
+                         * @todo HARMONY-6-jvm-linkage.c-4 The
+                         *       @c @b while() loop that scans for
+                         *       the method in a superclass needs
+                         *       unit testing w/ real data.
+                         */
+                        while(rtrue)
+                        {
+                            pcpd_NameAndType =
+                                PTR_THIS_CP_NameAndType(
+                                    pcfs
+                                      ->constant_pool
+                                        [pcpd_Methodref
+                                           ->name_and_type_index]);
 
-                        mthidxFIND =
-                            method_find_by_cp_entry(
-                                clsidxFIND,
-                                pcfs->constant_pool
-                                    [pcpd_NameAndType->name_index],
-                                pcfs->constant_pool
-                                  [pcpd_NameAndType->descriptor_index]);
+                            mthidxFIND =
+                                method_find_by_cp_entry(
+                                    clsidxFIND,
+                                    pcfs
+                                      ->constant_pool
+                                        [pcpd_NameAndType->name_index],
+                                    pcfs
+                                      ->constant_pool
+                                        [pcpd_NameAndType
+                                           ->descriptor_index]);
 
-                        pcpd_Methodref
-                            ->LOCAL_Methodref_binding.mthidxJVM =
-                                mthidxFIND;
+                            pcpd_Methodref
+                              ->LOCAL_Methodref_binding.mthidxJVM =
+                                                             mthidxFIND;
+
+                            /* Done if method located */
+                            if (jvm_method_index_bad != mthidxFIND)
+                            {
+                                break;
+                            }
+
+                            /* Otherwise search superclass */
+                            clsidxFIND =
+                                CLASS_OBJECT_LINKAGE(clsidxFIND)
+                                  ->pcfs
+                                    ->super_class;
+
+                            pcpd_Methodref
+                              ->LOCAL_Methodref_binding.clsidxJVM =
+                                                             clsidxFIND;
+
+                            /* Quit if no more superclasses */
+                            if (jvm_class_index_null == clsidxFIND)
+                            {
+                                break;
+                            }
+                        }
 
                         if (jvm_method_index_bad == mthidxFIND)
                         {
@@ -407,14 +479,14 @@
 
                             pcpd_Methodref
                               ->LOCAL_Methodref_binding
-                                  .nmordJVM =
-                                native_locate_local_method(
-                                        pcfs,
-                                        pcpd_Class->name_index,
-                                        pcpd_NameAndType->name_index,
-                                        pcpd_NameAndType
-                                          ->descriptor_index,
-                                        find_registerNatives);
+                                .nmordJVM =
+                                    native_locate_local_method(
+                                            pcfs,
+                                            pcpd_Class->name_index,
+                                           pcpd_NameAndType->name_index,
+                                            pcpd_NameAndType
+                                              ->descriptor_index,
+                                            find_registerNatives);
                         }
                         else
                         {
@@ -426,8 +498,8 @@
                         }
 
                         pcpd_Methodref
-                            ->LOCAL_Methodref_binding.codeatridxJVM =
-                                atridxFIND;
+                          ->LOCAL_Methodref_binding.codeatridxJVM =
+                                                             atridxFIND;
 
                         if (jvm_attribute_index_bad == atridxFIND)
                         {
@@ -449,8 +521,8 @@
                                 LOCAL_EXCEPTIONS_ATTRIBUTE);
 
                         pcpd_Methodref
-                            ->LOCAL_Methodref_binding.excpatridxJVM =
-                                atridxFIND;
+                          ->LOCAL_Methodref_binding.excpatridxJVM =
+                                                             atridxFIND;
 
                         if (jvm_attribute_index_bad == atridxFIND)
                         {
@@ -476,7 +548,7 @@
                 /* Only resolve this CP slot if it is not yet done. */
                 if (jvm_class_index_null ==
                     pcpd_InterfaceMethodref
-                        ->LOCAL_InterfaceMethodref_binding.clsidxJVM)
+                      ->LOCAL_InterfaceMethodref_binding.clsidxJVM)
                 {
                     pcpd_Class =
                         PTR_THIS_CP_Class(pcfs->constant_pool
@@ -487,8 +559,8 @@
                     clsidxFIND = class_find_by_cp_entry(clsname);
 
                     pcpd_InterfaceMethodref
-                        ->LOCAL_InterfaceMethodref_binding.clsidxJVM =
-                            clsidxFIND;
+                      ->LOCAL_InterfaceMethodref_binding.clsidxJVM =
+                                                             clsidxFIND;
 
                     if (jvm_class_index_null == clsidxFIND)
                     {
@@ -497,24 +569,60 @@
                     }
                     else
                     {
-                        pcpd_NameAndType =
-                            PTR_THIS_CP_NameAndType(
-                                pcfs->constant_pool
-                                [pcpd_InterfaceMethodref
-                                  ->name_and_type_index]);
+                        /*!
+                         * @todo HARMONY-6-jvm-linkage.c-5 The
+                         *       @c @b while() loop that scans for
+                         *       the interface method in a superclass
+                         *       needs unit testing w/ real data.
+                         */
+                        while(rtrue)
+                        {
+                            pcpd_NameAndType =
+                                PTR_THIS_CP_NameAndType(
+                                    pcfs
+                                      ->constant_pool
+                                        [pcpd_InterfaceMethodref
+                                           ->name_and_type_index]);
 
-                        mthidxFIND =
-                            method_find_by_cp_entry(
-                                clsidxFIND,
-                                pcfs->constant_pool
-                                    [pcpd_NameAndType->name_index],
-                                pcfs->constant_pool
-                                  [pcpd_NameAndType->descriptor_index]);
+                            mthidxFIND =
+                                method_find_by_cp_entry(
+                                    clsidxFIND,
+                                    pcfs
+                                      ->constant_pool
+                                        [pcpd_NameAndType->name_index],
+                                    pcfs
+                                      ->constant_pool
+                                        [pcpd_NameAndType
+                                           ->descriptor_index]);
 
-                        pcpd_InterfaceMethodref
-                            ->LOCAL_InterfaceMethodref_binding
-                              .mthidxJVM =
-                                  mthidxFIND;
+                            pcpd_InterfaceMethodref
+                              ->LOCAL_InterfaceMethodref_binding
+                                .mthidxJVM =
+                                    mthidxFIND;
+
+                            /* Done if interface method located */
+                            if (jvm_method_index_bad != mthidxFIND)
+                            {
+                                break;
+                            }
+
+                            /* Otherwise search superclass */
+                            clsidxFIND =
+                                CLASS_OBJECT_LINKAGE(clsidxFIND)
+                                  ->pcfs
+                                    ->super_class;
+
+                            pcpd_InterfaceMethodref
+                              ->LOCAL_InterfaceMethodref_binding
+                                .clsidxJVM =
+                                    clsidxFIND;
+
+                            /* Quit if no more superclasses */
+                            if (jvm_class_index_null == clsidxFIND)
+                            {
+                                break;
+                            }
+                        }
 
                         if (jvm_method_index_bad == mthidxFIND)
                         {
@@ -548,14 +656,14 @@
                              */
                             pcpd_InterfaceMethodref
                               ->LOCAL_InterfaceMethodref_binding
-                                  .nmordJVM =
-                                native_locate_local_method(
-                                        pcfs,
-                                        pcpd_Class->name_index,
-                                        pcpd_NameAndType->name_index,
-                                        pcpd_NameAndType
-                                          ->descriptor_index,
-                                        find_registerNatives);
+                                .nmordJVM =
+                                    native_locate_local_method(
+                                            pcfs,
+                                            pcpd_Class->name_index,
+                                           pcpd_NameAndType->name_index,
+                                            pcpd_NameAndType
+                                              ->descriptor_index,
+                                            find_registerNatives);
                         }
                         else
                         {
@@ -567,9 +675,9 @@
                         }
 
                         pcpd_InterfaceMethodref
-                            ->LOCAL_InterfaceMethodref_binding
-                              .codeatridxJVM =
-                                  atridxFIND;
+                          ->LOCAL_InterfaceMethodref_binding
+                            .codeatridxJVM =
+                                atridxFIND;
 
                         if (jvm_attribute_index_bad == atridxFIND)
                         {
@@ -591,9 +699,9 @@
                                 LOCAL_EXCEPTIONS_ATTRIBUTE);
 
                         pcpd_InterfaceMethodref
-                            ->LOCAL_InterfaceMethodref_binding
-                              .excpatridxJVM =
-                                  atridxFIND;
+                          ->LOCAL_InterfaceMethodref_binding
+                            .excpatridxJVM =
+                                atridxFIND;
 
                         if (jvm_attribute_index_bad == atridxFIND)
                         {
@@ -757,20 +865,20 @@
                     }
 
                     pcpd_Fieldref
-                        ->LOCAL_Fieldref_binding.clsidxJVM =
-                            jvm_class_index_null;
+                      ->LOCAL_Fieldref_binding.clsidxJVM =
+                                                   jvm_class_index_null;
 
                     pcpd_Fieldref
-                        ->LOCAL_Fieldref_binding.fluidxJVM =
-                            jvm_field_lookup_index_bad;
+                      ->LOCAL_Fieldref_binding.fluidxJVM =
+                                             jvm_field_lookup_index_bad;
 
                     pcpd_Fieldref
-                        ->LOCAL_Fieldref_binding.oiflagJVM =
-                            rneither_true_nor_false;
+                      ->LOCAL_Fieldref_binding.oiflagJVM =
+                                                rneither_true_nor_false;
 
                     pcpd_Fieldref
-                        ->LOCAL_Fieldref_binding.jvaluetypeJVM =
-                            LOCAL_BASETYPE_ERROR;
+                      ->LOCAL_Fieldref_binding.jvaluetypeJVM =
+                                                   LOCAL_BASETYPE_ERROR;
                 }
                 break;
 
@@ -794,24 +902,24 @@
                     }
 
                     pcpd_Methodref
-                        ->LOCAL_Methodref_binding.clsidxJVM =
-                            jvm_class_index_null;
+                      ->LOCAL_Methodref_binding.clsidxJVM =
+                                                   jvm_class_index_null;
 
                     pcpd_Methodref
-                        ->LOCAL_Methodref_binding.mthidxJVM =
-                            jvm_method_index_bad;
+                      ->LOCAL_Methodref_binding.mthidxJVM =
+                                                   jvm_method_index_bad;
 
                     pcpd_Methodref
-                        ->LOCAL_Methodref_binding.codeatridxJVM =
-                            jvm_attribute_index_bad;
+                      ->LOCAL_Methodref_binding.codeatridxJVM =
+                                                jvm_attribute_index_bad;
 
                     pcpd_Methodref
-                        ->LOCAL_Methodref_binding.excpatridxJVM =
-                            jvm_attribute_index_bad;
+                      ->LOCAL_Methodref_binding.excpatridxJVM =
+                                                jvm_attribute_index_bad;
 
                     pcpd_Methodref
-                        ->LOCAL_Methodref_binding.nmordJVM =
-                            jvm_native_method_ordinal_null;
+                      ->LOCAL_Methodref_binding.nmordJVM =
+                                         jvm_native_method_ordinal_null;
                 }
                 break;
 
@@ -823,7 +931,7 @@
                 /* Only unresolve this CP slot if it was resolved */
                 if (jvm_class_index_null !=
                     pcpd_InterfaceMethodref
-                        ->LOCAL_InterfaceMethodref_binding.clsidxJVM)
+                      ->LOCAL_InterfaceMethodref_binding.clsidxJVM)
                 {
                     /* Remove reference unless it references itself */
                     if (clsidx != 
@@ -838,24 +946,24 @@
                     }
 
                     pcpd_InterfaceMethodref
-                        ->LOCAL_InterfaceMethodref_binding.clsidxJVM =
-                            jvm_class_index_null;
+                      ->LOCAL_InterfaceMethodref_binding.clsidxJVM =
+                                                   jvm_class_index_null;
 
                     pcpd_InterfaceMethodref
-                        ->LOCAL_InterfaceMethodref_binding.mthidxJVM =
-                            jvm_method_index_bad;
+                      ->LOCAL_InterfaceMethodref_binding.mthidxJVM =
+                                                   jvm_method_index_bad;
 
                     pcpd_InterfaceMethodref
-                       ->LOCAL_InterfaceMethodref_binding.codeatridxJVM=
-                            jvm_attribute_index_bad;
+                      ->LOCAL_InterfaceMethodref_binding.codeatridxJVM =
+                                                jvm_attribute_index_bad;
 
                     pcpd_InterfaceMethodref
-                       ->LOCAL_InterfaceMethodref_binding.excpatridxJVM=
-                            jvm_attribute_index_bad;
+                      ->LOCAL_InterfaceMethodref_binding.excpatridxJVM =
+                                                jvm_attribute_index_bad;
 
                     pcpd_InterfaceMethodref
-                       ->LOCAL_InterfaceMethodref_binding.nmordJVM=
-                            jvm_native_method_ordinal_null;
+                      ->LOCAL_InterfaceMethodref_binding.nmordJVM =
+                                         jvm_native_method_ordinal_null;
                 }
                 break;