private static JavaType asJavaType(
     Class<?> type, MetaAccessProvider metaAccess, CodeCacheProvider codeCache) {
   if (WordBase.class.isAssignableFrom(type)) {
     return metaAccess.lookupJavaType(codeCache.getTarget().wordJavaKind.toJavaClass());
   } else {
     return metaAccess.lookupJavaType(type);
   }
 }
 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);
 }
 public StackTraceElement getApplySourceLocation(MetaAccessProvider metaAccess) {
   Class<?> c = getClass();
   for (Method m : c.getDeclaredMethods()) {
     if (m.getName().equals("execute")) {
       return metaAccess.lookupJavaMethod(m).asStackTraceElement(0);
     }
   }
   throw new JVMCIError("could not find method named \"execute\" in " + c.getName());
 }
 /**
  * Gets a {@link Classfile} created by parsing the class file bytes for {@code c}.
  *
  * @throws NoClassDefFoundError if the class file cannot be found
  */
 private synchronized Classfile getClassfile(Class<?> c) {
   assert !c.isPrimitive() && !c.isArray() : c;
   Classfile classfile = classfiles.get(c);
   if (classfile == null) {
     try {
       ResolvedJavaType type = metaAccess.lookupJavaType(c);
       InputStream in = getClassfileAsStream(c);
       if (in != null) {
         DataInputStream stream = new DataInputStream(in);
         classfile = new Classfile(type, stream, this);
         classfiles.put(c, classfile);
         return classfile;
       }
       throw new NoClassDefFoundError(c.getName());
     } catch (IOException e) {
       throw (NoClassDefFoundError) new NoClassDefFoundError(c.getName()).initCause(e);
     }
   }
   return classfile;
 }
 /** Gets the substitute method, resolving it first if necessary. */
 public ResolvedJavaMethod getSubstitute(MetaAccessProvider metaAccess) {
   if (cachedSubstitute == null) {
     cachedSubstitute = metaAccess.lookupJavaMethod(getJavaSubstitute());
   }
   return cachedSubstitute;
 }