Package org.jnode.vm.compiler

Source Code of org.jnode.vm.compiler.EntryPoints

/*
* $Id$
*
* Copyright (C) 2003-2014 JNode.org
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library 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 Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; If not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jnode.vm.compiler;

import org.jnode.vm.classmgr.VmClassLoader;
import org.jnode.vm.classmgr.VmField;
import org.jnode.vm.classmgr.VmInstanceField;
import org.jnode.vm.classmgr.VmMethod;
import org.jnode.vm.classmgr.VmType;
import org.jnode.vm.facade.VmHeapManager;
import org.jnode.vm.facade.VmWriteBarrier;
import org.jnode.vm.objects.VmSystemObject;

/**
* @author epr
*/
public class EntryPoints extends VmSystemObject {

    private final VmType vmMethodCodeClass;

    private final VmType vmInstanceMethodClass;

    private final VmType vmInstanceFieldClass;

    private final VmType vmStaticFieldClass;

    private final VmInstanceField vmMemberDeclaringClassField;

    private final VmInstanceField vmFieldOffsetField;

    private final VmInstanceField vmFieldStaticsIndexField;

    private final VmInstanceField vmMethodTibOffsetField;

    private final VmInstanceField vmMethodSelectorField;

    private final VmInstanceField vmMethodNativeCodeField;

    private final VmInstanceField vmConstIMethodRefSelectorField;

    private final VmInstanceField vmProcessorMeField;

    private final int vmThreadSwitchIndicatorOffset;

    private final VmType vmSoftByteCodesClass;

    private final VmType vmMonitorManagerClass;

    private final VmMethod anewarrayMethod;

    private final VmMethod allocArrayMethod;

    private final VmMethod allocPrimitiveArrayMethod;

    private final VmMethod allocMultiArrayMethod;

    private final VmMethod resolveFieldMethod;

    private final VmMethod resolveMethodMethod;

    private final VmMethod resolveClassMethod;

    private final VmMethod allocObjectMethod;

    private final VmMethod monitorEnterMethod;

    private final VmMethod monitorExitMethod;

    private final VmMethod ldivMethod;

    private final VmMethod lremMethod;

    private final VmMethod systemExceptionMethod;

    private final VmMethod classCastFailedMethod;

    private final VmMethod getClassForVmTypeMethod;

    private final VmMethod vmTypeInitialize;

    private final VmMethod throwArrayOutOfBounds;

    private final VmInstanceField vmTypeModifiers;

    private final VmInstanceField vmTypeState;

    private final VmInstanceField vmTypeCp;

    private final VmInstanceField vmCPCp;

    private final VmInstanceField vmProcessorStackEnd;

    private final VmInstanceField vmProcessorSharedStaticsTable;

    private final VmInstanceField vmProcessorIsolatedStaticsTable;

    private final VmMethod arrayStoreWriteBarrier;

    private final VmMethod putfieldWriteBarrier;

    private final VmMethod putstaticWriteBarrier;

    private final VmWriteBarrier writeBarrier;

    private final VmMethod recompileMethod;

    private final int magic;

    /**
     * Create a new instance
     *
     * @param loader  the VmClassLoader instance
     * @param heapManager heap manager
     * @param magic the compiler magic ID
     */
    public EntryPoints(VmClassLoader loader, VmHeapManager heapManager, int magic) {
        try {
            this.magic = magic;
            // VmMember class
            final VmType vmMemberType = loader.loadClass(
                "org.jnode.vm.classmgr.VmMember", true);
            this.vmMemberDeclaringClassField = (VmInstanceField) testField(vmMemberType
                .getField("declaringClass"));

            // SoftByteCode
            this.vmSoftByteCodesClass = loader.loadClass(
                "org.jnode.vm.SoftByteCodes", true);
            anewarrayMethod = testMethod(vmSoftByteCodesClass.getMethod(
                "anewarray",
                "(Lorg/jnode/vm/classmgr/VmType;I)Ljava/lang/Object;"));
            allocArrayMethod = testMethod(vmSoftByteCodesClass.getMethod(
                "allocArray",
                "(Lorg/jnode/vm/classmgr/VmType;I)Ljava/lang/Object;"));
            allocMultiArrayMethod = testMethod(vmSoftByteCodesClass.getMethod(
                "allocMultiArray",
                "(Lorg/jnode/vm/classmgr/VmType;[I)Ljava/lang/Object;"));
            allocPrimitiveArrayMethod = testMethod(vmSoftByteCodesClass
                .getMethod("allocPrimitiveArray", "(Lorg/jnode/vm/classmgr/VmType;II)Ljava/lang/Object;"));
            resolveFieldMethod = testMethod(vmSoftByteCodesClass.getMethod("resolveField",
                "(Lorg/jnode/vm/classmgr/VmMethod;Lorg/jnode/vm/classmgr/VmConstFieldRef;Z)" +
                    "Lorg/jnode/vm/classmgr/VmField;"));
            resolveMethodMethod = testMethod(vmSoftByteCodesClass.getMethod("resolveMethod",
                "(Lorg/jnode/vm/classmgr/VmMethod;Lorg/jnode/vm/classmgr/VmConstMethodRef;)" +
                    "Lorg/jnode/vm/classmgr/VmMethod;"));
            resolveClassMethod = testMethod(vmSoftByteCodesClass.getMethod("resolveClass",
                "(Lorg/jnode/vm/classmgr/VmConstClass;)Lorg/jnode/vm/classmgr/VmType;"));
            allocObjectMethod = testMethod(vmSoftByteCodesClass.getMethod("allocObject",
                "(Lorg/jnode/vm/classmgr/VmType;I)Ljava/lang/Object;"));
            classCastFailedMethod = testMethod(vmSoftByteCodesClass.getMethod(
                "classCastFailed", "(Ljava/lang/Object;Lorg/jnode/vm/classmgr/VmType;)V"));
            throwArrayOutOfBounds = testMethod(vmSoftByteCodesClass.getMethod(
                "throwArrayOutOfBounds", "(Ljava/lang/Object;I)V"));
            getClassForVmTypeMethod = testMethod(vmSoftByteCodesClass.getMethod("getClassForVmType",
                "(Lorg/jnode/vm/classmgr/VmType;)Ljava/lang/Class;"));

            // Write barrier
            writeBarrier = (heapManager != null) ? heapManager
                .getWriteBarrier() : null;
            if (writeBarrier != null) {
                final VmType wbClass = loader.loadClass(writeBarrier.getClass().getName(), true);
                arrayStoreWriteBarrier = testMethod(wbClass.getMethod(
                    "arrayStoreWriteBarrier",
                    "(Ljava/lang/Object;ILjava/lang/Object;)V"));
                putfieldWriteBarrier = testMethod(wbClass.getMethod(
                    "putfieldWriteBarrier",
                    "(Ljava/lang/Object;ILjava/lang/Object;)V"));
                putstaticWriteBarrier = testMethod(wbClass.getMethod(
                    "putstaticWriteBarrier", "(ILjava/lang/Object;)V"));
            } else {
                arrayStoreWriteBarrier = null;
                putfieldWriteBarrier = null;
                putstaticWriteBarrier = null;
            }

            // MonitorManager
            this.vmMonitorManagerClass = loader.loadClass("org.jnode.vm.scheduler.MonitorManager", true);
            monitorEnterMethod = testMethod(vmMonitorManagerClass.getMethod("monitorEnter", "(Ljava/lang/Object;)V"));
            monitorExitMethod = testMethod(vmMonitorManagerClass.getMethod("monitorExit", "(Ljava/lang/Object;)V"));

            // MathSupport
            final VmType vmClass = loader.loadClass("org.jnode.vm.MathSupport", true);
            ldivMethod = testMethod(vmClass.getMethod("ldiv", "(JJ)J"));
            lremMethod = testMethod(vmClass.getMethod("lrem", "(JJ)J"));

            // VmInstanceField
            this.vmInstanceFieldClass = loader.loadClass("org.jnode.vm.classmgr.VmInstanceField", true);
            vmFieldOffsetField = (VmInstanceField) testField(vmInstanceFieldClass.getField("offset"));

            // VmStaticField
            this.vmStaticFieldClass = loader.loadClass("org.jnode.vm.classmgr.VmStaticField", true);
            vmFieldStaticsIndexField = (VmInstanceField) testField(vmStaticFieldClass.getField("staticsIndex"));

            // VmInstanceMethod
            this.vmInstanceMethodClass = loader.loadClass("org.jnode.vm.classmgr.VmInstanceMethod", true);
            vmMethodTibOffsetField = (VmInstanceField) testField(vmInstanceMethodClass.getField("tibOffset"));

            // VmMethodCode
            this.vmMethodCodeClass = loader.loadClass("org.jnode.vm.classmgr.VmMethodCode", true);
            vmMethodSelectorField = (VmInstanceField) testField(vmInstanceMethodClass.getField("selector"));
            vmMethodNativeCodeField = (VmInstanceField) testField(vmInstanceMethodClass.getField("nativeCode"));

            // VmConstIMethodRef
            final VmType cimrClass = loader.loadClass("org.jnode.vm.classmgr.VmConstIMethodRef", true);
            this.vmConstIMethodRefSelectorField = (VmInstanceField) testField(cimrClass.getField("selector"));

            // VmProcessor
            final VmType processorClass = loader.loadClass("org.jnode.vm.scheduler.VmProcessor", true);
            vmThreadSwitchIndicatorOffset =
                ((VmInstanceField) testField(processorClass.getField("threadSwitchIndicator"))).getOffset();
            vmProcessorMeField = (VmInstanceField) testField(processorClass.getField("me"));
            vmProcessorStackEnd = (VmInstanceField) testField(processorClass.getField("stackEnd"));
            vmProcessorSharedStaticsTable = (VmInstanceField) testField(processorClass.getField("staticsTable"));
            vmProcessorIsolatedStaticsTable = (VmInstanceField) testField(processorClass
                .getField("isolatedStaticsTable"));

            // VmType
            final VmType typeClass = loader.loadClass("org.jnode.vm.classmgr.VmType", true);
            vmTypeInitialize = testMethod(typeClass.getMethod("initialize", "()V"));
            vmTypeModifiers = (VmInstanceField) testField(typeClass.getField("modifiers"));
            vmTypeState = (VmInstanceField) testField(typeClass.getField("state"));
            vmTypeCp = (VmInstanceField) testField(typeClass.getField("cp"));

            // VmCP
            final VmType cpClass = loader.loadClass("org.jnode.vm.classmgr.VmCP", true);
            vmCPCp = (VmInstanceField) testField(cpClass.getField("cp"));

            // VmProcessor
            // VmThread
            final VmType vmThreadClass = loader.loadClass("org.jnode.vm.scheduler.VmThread", true);
            systemExceptionMethod = testMethod(vmThreadClass.getMethod("systemException", "(II)Ljava/lang/Throwable;"));

            // VmMethod
            final VmType vmMethodClass = loader.loadClass("org.jnode.vm.classmgr.VmMethod", true);
            recompileMethod = testMethod(vmMethodClass.getDeclaredMethod("recompileMethod", "(II)V"));

        } catch (ClassNotFoundException ex) {
            throw new NoClassDefFoundError(ex.getMessage());
        }
    }

    private VmMethod testMethod(VmMethod method) {
        if (method == null) {
            throw new RuntimeException("Cannot find a method");
        }
        return method;
    }

    private VmField testField(VmField field) {
        if (field == null) {
            throw new RuntimeException("Cannot find a field");
        }
        return field;
    }

    /**
     * Gets the allocArray method
     *
     * @return method
     */
    public final VmMethod getAllocArrayMethod() {
        return allocArrayMethod;
    }

    /**
     * Gets the allocObject method
     *
     * @return method
     */
    public final VmMethod getAllocObjectMethod() {
        return allocObjectMethod;
    }

    /**
     * Gets the anewArray
     *
     * @return method
     */
    public final VmMethod getAnewarrayMethod() {
        return anewarrayMethod;
    }

    /**
     * Gets the ldiv method
     *
     * @return method
     */
    public final VmMethod getLdivMethod() {
        return ldivMethod;
    }

    /**
     * Gets the lrem method
     *
     * @return method
     */
    public final VmMethod getLremMethod() {
        return lremMethod;
    }

    /**
     * Gets the monitorEnter method
     *
     * @return method
     */
    public final VmMethod getMonitorEnterMethod() {
        return monitorEnterMethod;
    }

    /**
     * Gets the monitorExit method
     *
     * @return method
     */
    public final VmMethod getMonitorExitMethod() {
        return monitorExitMethod;
    }

    /**
     * Gets the resolveClass method
     *
     * @return method
     */
    public final VmMethod getResolveClassMethod() {
        return resolveClassMethod;
    }

    /**
     * Gets the resolveField method
     *
     * @return method
     */
    public final VmMethod getResolveFieldMethod() {
        return resolveFieldMethod;
    }

    /**
     * Gets the resolveMethod method
     *
     * @return method
     */
    public final VmMethod getResolveMethodMethod() {
        return resolveMethodMethod;
    }

    /**
     * Gets the offset field of VmInstanceField
     *
     * @return field
     */
    public final VmInstanceField getVmFieldOffsetField() {
        return vmFieldOffsetField;
    }

    /**
     * Gets the VmInstanceField class
     *
     * @return type
     */
    public final VmType getVmInstanceFieldClass() {
        return vmInstanceFieldClass;
    }

    /**
     * Gets the VmInstanceMethod class
     *
     * @return type
     */
    public final VmType getVmInstanceMethodClass() {
        return vmInstanceMethodClass;
    }

    /**
     * Gets the VmMethodCode class
     *
     * @return type
     */
    public final VmType getVmMethodCodeClass() {
        return vmMethodCodeClass;
    }

    /**
     * Gets the vmtOffset field of VmMethod
     *
     * @return field
     */
    public final VmInstanceField getVmMethodVmtOffsetField() {
        return vmMethodTibOffsetField;
    }

    /**
     * Gets the MonitorManager class
     *
     * @return type
     */
    public final VmType getVmMonitorManagerClass() {
        return vmMonitorManagerClass;
    }

    /**
     * Gets the SoftByteCodes class
     *
     * @return type
     */
    public final VmType getVmSoftByteCodesClass() {
        return vmSoftByteCodesClass;
    }

    /**
     * Gets the VmStaticField class
     *
     * @return type
     */
    public final VmType getVmStaticFieldClass() {
        return vmStaticFieldClass;
    }

    /**
     * Gets the selector field of VmConstIMethodRef
     *
     * @return type
     */
    public final VmInstanceField getVmConstIMethodRefSelectorField() {
        return vmConstIMethodRefSelectorField;
    }

    /**
     * Gets the selector field of VmMethod
     *
     * @return type
     */
    public final VmInstanceField getVmMethodSelectorField() {
        return vmMethodSelectorField;
    }

    /**
     * Gets the systemException method of SoftByteCodes
     *
     * @return type
     */
    public final VmMethod getSystemExceptionMethod() {
        return systemExceptionMethod;
    }

    /**
     * @return Returns the offset of the vmThreadSwitchIndicator field.
     */
    public final int getVmThreadSwitchIndicatorOffset() {
        return this.vmThreadSwitchIndicatorOffset;
    }

    /**
     * @return Returns the vmTypeInitialize.
     */
    public final VmMethod getVmTypeInitialize() {
        return this.vmTypeInitialize;
    }

    /**
     * @return Returns the vmTypeModifiers.
     */
    public final VmInstanceField getVmTypeModifiers() {
        return this.vmTypeModifiers;
    }

    /**
     * @return Returns the vmTypeState.
     */
    public final VmInstanceField getVmTypeState() {
        return this.vmTypeState;
    }

    /**
     * @return Returns the vmMemberDeclaringClassField.
     */
    public final VmInstanceField getVmMemberDeclaringClassField() {
        return this.vmMemberDeclaringClassField;
    }

    /**
     * @return Returns the vmProcessorStackEnd.
     */
    public final VmInstanceField getVmProcessorStackEnd() {
        return this.vmProcessorStackEnd;
    }

    /**
     * @return Returns the vmMethodNativeCodeField.
     */
    public final VmInstanceField getVmMethodNativeCodeField() {
        return this.vmMethodNativeCodeField;
    }

    /**
     * @return Returns the vmTypeCp.
     */
    public final VmInstanceField getVmTypeCp() {
        return this.vmTypeCp;
    }

    /**
     * @return Returns the vmCPCp.
     */
    public final VmInstanceField getVmCPCp() {
        return this.vmCPCp;
    }

    /**
     * @return Returns the allocPrimitiveArrayMethod.
     */
    public final VmMethod getAllocPrimitiveArrayMethod() {
        return this.allocPrimitiveArrayMethod;
    }

    /**
     * @return Returns the vmFieldStaticsIndexField.
     */
    public final VmInstanceField getVmFieldStaticsIndexField() {
        return this.vmFieldStaticsIndexField;
    }

    /**
     * @return Returns the vmProcessorStaticsTable.
     */
    public final VmInstanceField getVmProcessorSharedStaticsTable() {
        return this.vmProcessorSharedStaticsTable;
    }

    /**
     * @return Returns the arrayStoreWriteBarrier.
     */
    public final VmMethod getArrayStoreWriteBarrier() {
        return this.arrayStoreWriteBarrier;
    }

    /**
     * @return Returns the putfieldWriteBarrier.
     */
    public final VmMethod getPutfieldWriteBarrier() {
        return this.putfieldWriteBarrier;
    }

    /**
     * @return Returns the putstaticWriteBarrier.
     */
    public final VmMethod getPutstaticWriteBarrier() {
        return this.putstaticWriteBarrier;
    }

    /**
     * @return Returns the writeBarrier.
     */
    public final VmWriteBarrier getWriteBarrier() {
        return this.writeBarrier;
    }

    /**
     * @return Returns the magic.
     */
    public final int getMagic() {
        return this.magic;
    }

    /**
     * @return Returns the allocMultiArrayMethod.
     */
    public final VmMethod getAllocMultiArrayMethod() {
        return this.allocMultiArrayMethod;
    }

    /**
     * @return Returns the throwArrayOutOfBounds.
     */
    public final VmMethod getThrowArrayOutOfBounds() {
        return throwArrayOutOfBounds;
    }

    /**
     * @return Returns the classCastFailedMethod.
     */
    public final VmMethod getClassCastFailedMethod() {
        return classCastFailedMethod;
    }

    /**
     * @return Returns the recompileMethod.
     * @see VmMethod#recompileMethod(int, int)
     */
    public final VmMethod getRecompileMethod() {
        return recompileMethod;
    }

    /**
     * @return Returns the getClassForVmTypeMethod.
     * @see org.jnode.vm.SoftByteCodes#getClassForVmType(VmType)
     */
    public final VmMethod getGetClassForVmTypeMethod() {
        return getClassForVmTypeMethod;
    }

    /**
     * @return Returns the vmProcessorIsolatedStaticsTable.
     */
    public final VmInstanceField getVmProcessorIsolatedStaticsTable() {
        return vmProcessorIsolatedStaticsTable;
    }

    /**
     * @return Returns the vmProcessorMeField.
     */
    public final VmInstanceField getVmProcessorMeField() {
        return vmProcessorMeField;
    }
}
TOP

Related Classes of org.jnode.vm.compiler.EntryPoints

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.