src/jdk.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotConstantReflectionProvider.java

Print this page




  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package jdk.vm.ci.hotspot;
  24 
  25 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayBaseOffset;
  26 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayIndexScale;
  27 
  28 import java.lang.reflect.Array;
  29 

  30 import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
  31 import jdk.vm.ci.meta.Constant;
  32 import jdk.vm.ci.meta.ConstantReflectionProvider;
  33 import jdk.vm.ci.meta.JavaConstant;
  34 import jdk.vm.ci.meta.JavaKind;
  35 import jdk.vm.ci.meta.JavaType;
  36 import jdk.vm.ci.meta.MemoryAccessProvider;
  37 import jdk.vm.ci.meta.MethodHandleAccessProvider;
  38 import jdk.vm.ci.meta.ResolvedJavaField;
  39 import jdk.vm.ci.meta.ResolvedJavaType;
  40 
  41 /**
  42  * HotSpot implementation of {@link ConstantReflectionProvider}.
  43  */
  44 public class HotSpotConstantReflectionProvider implements ConstantReflectionProvider, HotSpotProxified {
  45 
  46     protected final HotSpotJVMCIRuntimeProvider runtime;
  47     protected final HotSpotMethodHandleAccessProvider methodHandleAccess;
  48     protected final HotSpotMemoryAccessProviderImpl memoryAccess;
  49 


 338     public JavaConstant readStableFieldValue(ResolvedJavaField field, JavaConstant receiver, boolean isDefaultStable) {
 339         JavaConstant fieldValue = readNonStableFieldValue(field, receiver);
 340         if (fieldValue.isNonNull()) {
 341             JavaType declaredType = field.getType();
 342             if (declaredType.getComponentType() != null) {
 343                 int stableDimension = getArrayDimension(declaredType);
 344                 return HotSpotObjectConstantImpl.forStableArray(((HotSpotObjectConstantImpl) fieldValue).object(), stableDimension, isDefaultStable);
 345             }
 346         }
 347         return fieldValue;
 348     }
 349 
 350     private static int getArrayDimension(JavaType type) {
 351         int dimensions = 0;
 352         JavaType componentType = type;
 353         while ((componentType = componentType.getComponentType()) != null) {
 354             dimensions++;
 355         }
 356         return dimensions;
 357     }














 358 }


  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package jdk.vm.ci.hotspot;
  24 
  25 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayBaseOffset;
  26 import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayIndexScale;
  27 
  28 import java.lang.reflect.Array;
  29 
  30 import jdk.vm.ci.common.JVMCIError;
  31 import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
  32 import jdk.vm.ci.meta.Constant;
  33 import jdk.vm.ci.meta.ConstantReflectionProvider;
  34 import jdk.vm.ci.meta.JavaConstant;
  35 import jdk.vm.ci.meta.JavaKind;
  36 import jdk.vm.ci.meta.JavaType;
  37 import jdk.vm.ci.meta.MemoryAccessProvider;
  38 import jdk.vm.ci.meta.MethodHandleAccessProvider;
  39 import jdk.vm.ci.meta.ResolvedJavaField;
  40 import jdk.vm.ci.meta.ResolvedJavaType;
  41 
  42 /**
  43  * HotSpot implementation of {@link ConstantReflectionProvider}.
  44  */
  45 public class HotSpotConstantReflectionProvider implements ConstantReflectionProvider, HotSpotProxified {
  46 
  47     protected final HotSpotJVMCIRuntimeProvider runtime;
  48     protected final HotSpotMethodHandleAccessProvider methodHandleAccess;
  49     protected final HotSpotMemoryAccessProviderImpl memoryAccess;
  50 


 339     public JavaConstant readStableFieldValue(ResolvedJavaField field, JavaConstant receiver, boolean isDefaultStable) {
 340         JavaConstant fieldValue = readNonStableFieldValue(field, receiver);
 341         if (fieldValue.isNonNull()) {
 342             JavaType declaredType = field.getType();
 343             if (declaredType.getComponentType() != null) {
 344                 int stableDimension = getArrayDimension(declaredType);
 345                 return HotSpotObjectConstantImpl.forStableArray(((HotSpotObjectConstantImpl) fieldValue).object(), stableDimension, isDefaultStable);
 346             }
 347         }
 348         return fieldValue;
 349     }
 350 
 351     private static int getArrayDimension(JavaType type) {
 352         int dimensions = 0;
 353         JavaType componentType = type;
 354         while ((componentType = componentType.getComponentType()) != null) {
 355             dimensions++;
 356         }
 357         return dimensions;
 358     }
 359 
 360     @Override
 361     public JavaConstant asJavaClass(ResolvedJavaType type) {
 362         return HotSpotObjectConstantImpl.forObject(((HotSpotResolvedJavaType) type).mirror());
 363     }
 364 
 365     @Override
 366     public Constant asObjectHub(ResolvedJavaType type) {
 367         if (type instanceof HotSpotResolvedObjectType) {
 368             return ((HotSpotResolvedObjectType) type).klass();
 369         } else {
 370             throw JVMCIError.unimplemented();
 371         }
 372     }
 373 }