Skip to content

Commit

Permalink
add prettyParams with StringBuilder passed in helper + less garbage i…
Browse files Browse the repository at this point in the history
…n CodegenUtils
  • Loading branch information
kares committed Mar 25, 2015
1 parent 58487dd commit 250976c
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 59 deletions.
Expand Up @@ -19,8 +19,9 @@
import org.jruby.javasupport.JavaUtil;
import org.jruby.javasupport.ParameterTypes;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.util.CodegenUtils;
import org.jruby.util.collections.IntHashMap;
import static org.jruby.util.CodegenUtils.getBoxType;
import static org.jruby.util.CodegenUtils.prettyParams;

/**
* Method selection logic for calling from Ruby to Java.
Expand Down Expand Up @@ -200,7 +201,7 @@ private static <T extends ParameterTypes> T findMatchingCallableForArgs(final Ru
method = mostSpecific;

if ( ambiguous ) {
runtime.getWarnings().warn("ambiguous Java methods found, using " + ((Member) ((JavaCallable) method).accessibleObject()).getName() + CodegenUtils.prettyParams(msTypes));
runtime.getWarnings().warn("ambiguous Java methods found, using " + ((Member) ((JavaCallable) method).accessibleObject()).getName() + prettyParams(msTypes));
}
}
}
Expand Down Expand Up @@ -336,7 +337,7 @@ private static interface Matcher {
private static final Matcher EXACT = new Matcher() {
public boolean match(final Class<?> type, final IRubyObject arg) {
final Class<?> argClass = getJavaClass(arg);
return type == argClass || (type.isPrimitive() && CodegenUtils.getBoxType(type) == argClass);
return type == argClass || (type.isPrimitive() && getBoxType(type) == argClass);
}
@Override public String toString() { return "EXACT"; } // for debugging
};
Expand Down Expand Up @@ -480,7 +481,7 @@ private static boolean primitivable(final Class<?> type, final IRubyObject arg)
private static int calcTypePreference(Class<?> type, final IRubyObject arg) {
final boolean primitive = type.isPrimitive();

if ( primitive ) type = CodegenUtils.getBoxType(type);
if ( primitive ) type = getBoxType(type);

if ( Number.class.isAssignableFrom(type) || Character.class == type ) {
if ( arg instanceof RubyFixnum ) {
Expand Down
Expand Up @@ -23,7 +23,7 @@
import org.jruby.runtime.Arity;
import org.jruby.runtime.Visibility;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.util.CodegenUtils;
import static org.jruby.util.CodegenUtils.prettyParams;
import org.jruby.util.collections.IntHashMap;

public abstract class RubyToJavaInvoker extends JavaMethod {
Expand Down Expand Up @@ -345,9 +345,9 @@ static RaiseException newNameErrorDueArgumentTypeMismatch(final Ruby runtime,
org.jruby.javasupport.JavaMethod method = (org.jruby.javasupport.JavaMethod) methods[0];
error.append("method '").append( method.getValue().getName() ).append("'");
}
error.append(" for arguments ")
.append( CodegenUtils.prettyParams(argTypes) )
.append(" on ");
error.append(" for arguments ");
prettyParams(error, argTypes);
error.append(" on ");

if (receiver instanceof RubyModule) {
error.append( ((RubyModule) receiver).getName() );
Expand All @@ -359,7 +359,7 @@ static RaiseException newNameErrorDueArgumentTypeMismatch(final Ruby runtime,
error.append("\n available overloads:");
for (ParameterTypes method : methods) {
Class<?>[] paramTypes = method.getParameterTypes();
error.append("\n ").append( CodegenUtils.prettyParams(paramTypes) );
error.append("\n "); prettyParams( error, paramTypes );
}
}

Expand All @@ -371,7 +371,7 @@ private static Class<?> getClass(final IRubyObject object) {
if (object == null) return void.class;

if (object instanceof ConcreteJavaProxy) {
return ((ConcreteJavaProxy)object).getJavaClass();
return ((ConcreteJavaProxy) object).getJavaClass();
}
return object.getClass();
}
Expand Down
15 changes: 8 additions & 7 deletions core/src/main/java/org/jruby/java/proxies/JavaProxy.java
Expand Up @@ -442,9 +442,9 @@ private MethodInvoker getMethodInvoker(Method method) {
private RubyMethod getRubyMethod(String name, Class... argTypes) {
Method jmethod = getMethod(name, argTypes);
if (Modifier.isStatic(jmethod.getModifiers())) {
return RubyMethod.newMethod(metaClass.getSingletonClass(), CodegenUtils.prettyParams(argTypes), metaClass.getSingletonClass(), name, getMethodInvoker(jmethod), getMetaClass());
return RubyMethod.newMethod(metaClass.getSingletonClass(), CodegenUtils.prettyParams(argTypes).toString(), metaClass.getSingletonClass(), name, getMethodInvoker(jmethod), getMetaClass());
} else {
return RubyMethod.newMethod(metaClass, CodegenUtils.prettyParams(argTypes), metaClass, name, getMethodInvoker(jmethod), this);
return RubyMethod.newMethod(metaClass, CodegenUtils.prettyParams(argTypes).toString(), metaClass, name, getMethodInvoker(jmethod), this);
}
}

Expand Down Expand Up @@ -486,14 +486,15 @@ public RubyClass getSingletonClass() {
}

private void confirmCachedProxy(String message) {
RubyClass realClass = metaClass.getRealClass();
if (!realClass.getCacheProxy()) {
final RubyClass realClass = metaClass.getRealClass();
if ( ! realClass.getCacheProxy() ) {
final Ruby runtime = getRuntime();
if (Java.OBJECT_PROXY_CACHE) {
getRuntime().getWarnings().warnOnce(IRubyWarnings.ID.NON_PERSISTENT_JAVA_PROXY, MessageFormat.format(message, realClass));
runtime.getWarnings().warnOnce(IRubyWarnings.ID.NON_PERSISTENT_JAVA_PROXY, MessageFormat.format(message, realClass));
} else {
getRuntime().getWarnings().warn(MessageFormat.format(message, realClass));
runtime.getWarnings().warn(MessageFormat.format(message, realClass));
realClass.setCacheProxy(true);
getRuntime().getJavaSupport().getObjectProxyCache().put(getObject(), this);
runtime.getJavaSupport().getObjectProxyCache().put(getObject(), this);
}
}
}
Expand Down
20 changes: 11 additions & 9 deletions core/src/main/java/org/jruby/javasupport/JavaMethod.java
Expand Up @@ -36,6 +36,13 @@
***** END LICENSE BLOCK *****/
package org.jruby.javasupport;

import java.lang.annotation.Annotation;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;

import org.jruby.Ruby;
import org.jruby.RubyBoolean;
import org.jruby.RubyClass;
Expand All @@ -50,16 +57,11 @@
import org.jruby.javasupport.proxy.JavaProxyMethod;
import org.jruby.runtime.ObjectAllocator;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.util.CodegenUtils;
import org.jruby.util.log.Logger;
import org.jruby.util.log.LoggerFactory;

import java.lang.annotation.Annotation;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Type;
import static org.jruby.util.CodegenUtils.getBoxType;
import static org.jruby.util.CodegenUtils.prettyParams;

@JRubyClass(name="Java::JavaMethod")
public class JavaMethod extends JavaCallable {
Expand Down Expand Up @@ -96,7 +98,7 @@ public JavaMethod(Ruby runtime, Method method) {
this.isFinal = Modifier.isFinal(method.getModifiers());
final Class<?> returnType = method.getReturnType();
if (returnType.isPrimitive() && returnType != void.class) {
this.boxedReturnType = CodegenUtils.getBoxType(returnType);
this.boxedReturnType = getBoxType(returnType);
} else {
this.boxedReturnType = returnType;
}
Expand Down Expand Up @@ -654,6 +656,6 @@ public static RaiseException newMethodNotFoundError(Ruby runtime, Class target,
}

public static RaiseException newArgSizeMismatchError(Ruby runtime, Class ... argTypes) {
return runtime.newArgumentError("argument count mismatch for method signature " + CodegenUtils.prettyParams(argTypes));
return runtime.newArgumentError("argument count mismatch for method signature " + prettyParams(argTypes));
}
}
68 changes: 35 additions & 33 deletions core/src/main/java/org/jruby/util/CodegenUtils.java
Expand Up @@ -109,72 +109,73 @@ public static String humanShort(Class n) {
* Create a method signature from the given param types and return values
*/
public static String sig(Class retval, Class... params) {
return sigParams(params) + ci(retval);
return sigParams(new StringBuilder(), null, params).append( ci(retval) ).toString();
}

public static String sig(Class[] retvalParams) {
Class[] justParams = new Class[retvalParams.length - 1];
System.arraycopy(retvalParams, 1, justParams, 0, justParams.length);
return sigParams(justParams) + ci(retvalParams[0]);
return sigParams(new StringBuilder(), null, justParams).append( ci(retvalParams[0]) ).toString();
}

public static String sig(Class retval, String descriptor, Class... params) {
return sigParams(descriptor, params) + ci(retval);
return sigParams(new StringBuilder(), descriptor, params).append( ci(retval) ).toString();
}

@Deprecated // not used
public static String sigParams(Class... params) {
StringBuilder signature = new StringBuilder("(");

for (int i = 0; i < params.length; i++) {
signature.append(ci(params[i]));
}

signature.append(")");

return signature.toString();
return sigParams(new StringBuilder(), null, params).toString();
}

@Deprecated // not used
public static String sigParams(String descriptor, Class... params) {
StringBuilder signature = new StringBuilder("(");
return sigParams(new StringBuilder(), descriptor, params).toString();
}

signature.append(descriptor);
private static StringBuilder sigParams(final StringBuilder str,
final String descriptor, final Class... params) {
str.append('(');
if ( descriptor != null ) str.append(descriptor);

for (int i = 0; i < params.length; i++) {
signature.append(ci(params[i]));
str.append( ci( params[i] ) );
}

signature.append(")");

return signature.toString();
return str.append(')');
}

public static String pretty(Class retval, Class... params) {
return prettyParams(params) + human(retval);
}

public static String prettyParams(Class... params) {
StringBuilder signature = new StringBuilder("(");
public static CharSequence prettyParams(final Class... types) {
return prettyParams(new StringBuilder(), types);
}

for (int i = 0; i < params.length; i++) {
signature.append(human(params[i]));
if (i < params.length - 1) signature.append(',');
}
public static StringBuilder prettyParams(final StringBuilder str, final Class... types) {
final int len1 = types.length - 1;
str.append('(');

signature.append(")");
for ( int i = 0; i <= len1; i++ ) {
str.append( human( types[i] ) );
if ( i < len1 ) str.append(',');
}

return signature.toString();
return str.append(')');
}

public static String prettyShortParams(Class... params) {
StringBuilder signature = new StringBuilder("(");
public static String prettyShortParams(final Class... types) {
final int len1 = types.length - 1;

for (int i = 0; i < params.length; i++) {
signature.append(humanShort(params[i]));
if (i < params.length - 1) signature.append(',');
}
StringBuilder signature = new StringBuilder();
signature.append('(');

signature.append(")");
for (int i = 0; i <= len1; i++) {
signature.append( humanShort(types[i]) );
if ( i < len1 ) signature.append(',');
}

signature.append(')');
return signature.toString();
}

Expand Down Expand Up @@ -232,6 +233,7 @@ public static void visitAnnotationFields(AnnotationVisitor visitor, Map<String,
String key = fieldEntry.getKey();

if (value instanceof Map) {
@SuppressWarnings("unchecked")
Map<Class, Map<String, Object>> nestedAnnotationMap = (Map<Class, Map<String, Object>>) value;

for (Map.Entry<Class, Map<String, Object>> nestedAnnotation : nestedAnnotationMap.entrySet()) {
Expand Down

0 comments on commit 250976c

Please sign in to comment.