@Override public boolean hasImplementation() { return null != method.getImplementation(); }
@Override public final int getParameterSize() { int parameterSize = method.getParameters().size(); if (!isStatic()) { parameterSize += 1; } return parameterSize; }
@Override public boolean isFinal() { return Modifier.isFinal(method.getAccessFlags()); }
@Nonnull public BuilderMethod internMethod(@Nonnull String definingClass, @Nonnull String name, @Nullable List<? extends MethodParameter> parameters, @Nonnull String returnType, int accessFlags, @Nonnull Set<? extends Annotation> annotations, @Nullable MethodImplementation methodImplementation) { if (parameters == null) { parameters = ImmutableList.of(); } return new BuilderMethod(methodSection.internMethod(definingClass, name, parameters, returnType), internMethodParameters(parameters), accessFlags, annotationSetSection.internAnnotationSet(annotations), methodImplementation); }
@Override public String getName() { return method.getName(); }
/** * Get list of types for objects in parameter registers for a given method signature. * This is different {@code Utils.getParameterTypes} in that non-static methods also have * the 'this' (p0) parse virtual in the return value. * Note: For non-static method, * * @return list of internal format parameter types */ @Override public List<String> getParameterTypeNames() { List<String> parameterTypes = method.getParameterTypes().stream().map(BuilderTypeReference::getType).collect(Collectors.toList()); if (!isStatic()) { // First "parameter" for non-static methods is instance parse parameterTypes.add(0, type.getName()); } return parameterTypes; }
@Nonnull public BuilderMethod internMethod(@Nonnull String definingClass, @Nonnull String name, @Nullable List<? extends MethodParameter> parameters, @Nonnull String returnType, int accessFlags, @Nonnull Set<? extends Annotation> annotations, @Nullable MethodImplementation methodImplementation) { if (parameters == null) { parameters = ImmutableList.of(); } return new BuilderMethod(methodSection.internMethod(definingClass, name, parameters, returnType), internMethodParameters(parameters), accessFlags, annotationSetSection.internAnnotationSet(annotations), methodImplementation); }
private static void setRegisterCount(BuilderMethod method, int registerCount) throws Exception { MethodImplementation implementation = method.getImplementation(); Field f = implementation.getClass().getDeclaredField("registerCount"); f.setAccessible(true); // hack the planet f.set(implementation, registerCount); }
@Nullable @Override public Iterable<? extends BuilderStringReference> getParameterNames(@Nonnull BuilderMethod method) { return Iterables.transform(method.getParameters(), new Function<BuilderMethodParameter, BuilderStringReference>() { @Nullable @Override public BuilderStringReference apply(BuilderMethodParameter input) { return input.name; } }); }
@Nonnull public BuilderMethod internMethod(@Nonnull String definingClass, @Nonnull String name, @Nullable List<? extends MethodParameter> parameters, @Nonnull String returnType, int accessFlags, @Nonnull Set<? extends Annotation> annotations, @Nullable MethodImplementation methodImplementation) { if (parameters == null) { parameters = ImmutableList.of(); } return new BuilderMethod(context.methodPool.internMethod(definingClass, name, parameters, returnType), internMethodParameters(parameters), accessFlags, context.annotationSetPool.internAnnotationSet(annotations), methodImplementation); }
@Override public boolean isStatic() { return Modifier.isStatic(method.getAccessFlags()); }
@Override public List<BuilderTryBlock> getTryBlocks() { MutableMethodImplementation implementation = (MutableMethodImplementation) method.getImplementation(); if (implementation == null) { return new LinkedList<>(); } return implementation.getTryBlocks(); }
@Nullable @Override public Iterable<? extends BuilderStringReference> getParameterNames(@Nonnull BuilderMethod method) { return Iterables.transform(method.getParameters(), new Function<BuilderMethodParameter, BuilderStringReference>() { @Nullable @Override public BuilderStringReference apply(BuilderMethodParameter input) { return input.name; } }); }
@Override public boolean isNative() { return Modifier.isNative(getMethodDefinition().getAccessFlags()); }
@Override public MutableMethodImplementation getImplementation() { return (MutableMethodImplementation) getMethodDefinition().getImplementation(); }
@Nullable @Override public Iterable<? extends BuilderStringReference> getParameterNames(@Nonnull BuilderMethod method) { return Iterables.transform(method.getParameters(), new Function<BuilderMethodParameter, BuilderStringReference>() { @Nullable @Override public BuilderStringReference apply(BuilderMethodParameter input) { return input.name; } }); }
int oldRegisterCount = builderMethod.getImplementation().getRegisterCount(); int registerCount = oldRegisterCount + invokeRegisterCount; setRegisterCount(builderMethod, registerCount); int oldRegisterCount = builderMethod.getImplementation().getRegisterCount(); int registerCount = oldRegisterCount + invokeRegisterCount; setRegisterCount(builderMethod, registerCount);
@Nullable @Override public List<? extends BuilderAnnotationSet> getParameterAnnotations( @Nonnull final BuilderMethod method) { final List<? extends BuilderMethodParameter> parameters = method.getParameters(); boolean hasParameterAnnotations = Iterables.any(parameters, HAS_PARAMETER_ANNOTATIONS); if (hasParameterAnnotations) { return new AbstractForwardSequentialList<BuilderAnnotationSet>() { @Nonnull @Override public Iterator<BuilderAnnotationSet> iterator() { return FluentIterable.from(parameters) .transform(PARAMETER_ANNOTATIONS).iterator(); } @Override public int size() { return parameters.size(); } }; } return null; }
@Nullable @Override public Iterable<? extends Instruction> getInstructions(@Nonnull BuilderMethod builderMethod) { MethodImplementation impl = builderMethod.getImplementation(); if (impl == null) { return null; } return impl.getInstructions(); }
@Nullable @Override public List<? extends BuilderAnnotationSet> getParameterAnnotations( @Nonnull final BuilderMethod method) { final List<? extends BuilderMethodParameter> parameters = method.getParameters(); boolean hasParameterAnnotations = Iterables.any(parameters, HAS_PARAMETER_ANNOTATIONS); if (hasParameterAnnotations) { return new AbstractForwardSequentialList<BuilderAnnotationSet>() { @Nonnull @Override public Iterator<BuilderAnnotationSet> iterator() { return FluentIterable.from(parameters) .transform(PARAMETER_ANNOTATIONS).iterator(); } @Override public int size() { return parameters.size(); } }; } return null; }