private Class<?>[] createTargetParameters(ForeignCallDescriptor descriptor) { Class<?>[] parameters = descriptor.getArgumentTypes(); if (prependThread) { Class<?>[] newParameters = new Class<?>[parameters.length + 1]; System.arraycopy(parameters, 0, newParameters, 1, parameters.length); newParameters[0] = Word.class; return newParameters; } return parameters; }
public Signature getSignature() { ForeignCallDescriptor d = linkage.getDescriptor(); MetaAccessProvider metaAccess = providers.getMetaAccess(); Class<?>[] arguments = d.getArgumentTypes(); ResolvedJavaType[] parameters = new ResolvedJavaType[arguments.length]; for (int i = 0; i < arguments.length; i++) { parameters[i] = metaAccess.lookupJavaType(arguments[i]); } return new HotSpotSignature( jvmciRuntime, metaAccess.lookupJavaType(d.getResultType()), parameters); }
/** Gets a calling convention for a given descriptor and call type. */ public static CallingConvention createCallingConvention( MetaAccessProvider metaAccess, CodeCacheProvider codeCache, ForeignCallDescriptor descriptor, Type ccType) { assert ccType != null; Class<?>[] argumentTypes = descriptor.getArgumentTypes(); JavaType[] parameterTypes = new JavaType[argumentTypes.length]; for (int i = 0; i < parameterTypes.length; ++i) { parameterTypes[i] = asJavaType(argumentTypes[i], metaAccess, codeCache); } TargetDescription target = codeCache.getTarget(); JavaType returnType = asJavaType(descriptor.getResultType(), metaAccess, codeCache); RegisterConfig regConfig = codeCache.getRegisterConfig(); return regConfig.getCallingConvention(ccType, returnType, parameterTypes, target); }