view graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotConstantPool.java @ 12559:ae412befde21

read HotSpotVMConfig fields from HotSpot's vmStructs via annotations
author twisti
date Wed, 23 Oct 2013 19:50:14 -0700
parents 7080a96be216
children 42aaf7306707
line wrap: on
line source

/*
 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */
package com.oracle.graal.hotspot.meta;

import static com.oracle.graal.graph.UnsafeAccess.*;
import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*;

import com.oracle.graal.api.meta.*;
import com.oracle.graal.bytecode.*;
import com.oracle.graal.hotspot.*;

/**
 * Implementation of {@link ConstantPool} for HotSpot.
 */
public class HotSpotConstantPool extends CompilerObject implements ConstantPool {

    private static final long serialVersionUID = -5443206401485234850L;

    private final HotSpotResolvedObjectType type;

    public HotSpotConstantPool(HotSpotResolvedObjectType type) {
        this.type = type;
    }

    @Override
    public int length() {
        HotSpotVMConfig config = runtime().getConfig();
        long constantPoolAddress = unsafe.getAddress(type.metaspaceKlass() + config.instanceKlassConstantsOffset);
        return unsafe.getInt(constantPoolAddress + config.constantPoolLengthOffset);
    }

    @Override
    public Object lookupConstant(int cpi) {
        assert cpi != 0;
        Object constant = runtime().getCompilerToVM().lookupConstantInPool(type, cpi);
        return constant;
    }

    @Override
    public Signature lookupSignature(int cpi) {
        throw new UnsupportedOperationException();
    }

    @Override
    public Object lookupAppendix(int cpi, int opcode) {
        assert Bytecodes.isInvoke(opcode);
        return runtime().getCompilerToVM().lookupAppendixInPool(type, cpi, (byte) opcode);
    }

    @Override
    public JavaMethod lookupMethod(int cpi, int opcode) {
        return runtime().getCompilerToVM().lookupMethodInPool(type, cpi, (byte) opcode);
    }

    @Override
    public JavaType lookupType(int cpi, int opcode) {
        return runtime().getCompilerToVM().lookupTypeInPool(type, cpi);
    }

    @Override
    public JavaField lookupField(int cpi, int opcode) {
        return runtime().getCompilerToVM().lookupFieldInPool(type, cpi, (byte) opcode);
    }

    @Override
    public void loadReferencedType(int cpi, int opcode) {
        runtime().getCompilerToVM().lookupReferencedTypeInPool(type, cpi, (byte) opcode);
    }
}