Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 90cfd8529bce^
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 8ece95a99892
Choose a head ref

Commits on Mar 22, 2016

  1. Copy the full SHA
    90cfd85 View commit details
  2. NOTE on previous package module meta-class attaching

    ... should no longer be necessary with the refactored JavaPackage
    kares committed Mar 22, 2016
    Copy the full SHA
    2d68d24 View commit details
  3. Copy the full SHA
    3600dca View commit details
  4. Copy the full SHA
    600562a View commit details
  5. Copy the full SHA
    3e74bc9 View commit details
  6. Copy the full SHA
    744bf4e View commit details
  7. Copy the full SHA
    1e5a937 View commit details
  8. Copy the full SHA
    a77d2a8 View commit details
  9. Copy the full SHA
    c62453d View commit details
  10. Copy the full SHA
    08094bc View commit details
  11. Copy the full SHA
    a5d1f48 View commit details
  12. Copy the full SHA
    08e3c3a View commit details
  13. Copy the full SHA
    f15a8ac View commit details
  14. handle more Kernel methods in Java packages "right" (including name)

    - `pkg.name` has been working since 1.7.22/9.0.1.0 (#2468)
    - handling :object_id as it is quite surprising to not have
    - can handle :throw/:catch since they're not valid package names
    - commented-out methods that would be good to have as well
    kares committed Mar 22, 2016
    Copy the full SHA
    92f513c View commit details
  15. Copy the full SHA
    234299b View commit details
  16. Copy the full SHA
    a322678 View commit details
  17. Copy the full SHA
    604a69c View commit details
  18. Copy the full SHA
    1c955ed View commit details
  19. Copy the full SHA
    5eb3634 View commit details
  20. [test] how packages behave when a method collides (e.g. on pkg.name)

    and assert that `pkg.object_id` works as expected!
    kares committed Mar 22, 2016
    Copy the full SHA
    6c5fb08 View commit details
  21. Copy the full SHA
    8ece95a View commit details
2 changes: 2 additions & 0 deletions core/src/main/java/org/jruby/java/util/BlankSlateWrapper.java
Original file line number Diff line number Diff line change
@@ -19,6 +19,8 @@
* Because this is in the hierarchy, it does mean any methods that are not Java
* packages or otherwise defined on the JavaPackageModuleTemplate module will
* be inaccessible.
*
* @deprecated no longer used - probably needs revamp if needed to be re-usable
*/
public class BlankSlateWrapper extends IncludedModuleWrapper {
public BlankSlateWrapper(Ruby runtime, RubyClass superClass, RubyModule delegate) {
80 changes: 10 additions & 70 deletions core/src/main/java/org/jruby/javasupport/Java.java
Original file line number Diff line number Diff line change
@@ -52,7 +52,6 @@

import org.jcodings.Encoding;

import org.jruby.MetaClass;
import org.jruby.Ruby;
import org.jruby.RubyArray;
import org.jruby.RubyBasicObject;
@@ -115,10 +114,9 @@ public class Java implements Library {

@Override
public void load(Ruby runtime, boolean wrap) {
createJavaModule(runtime);
final RubyModule Java = createJavaModule(runtime);

RubyModule jpmt = runtime.defineModule("JavaPackageModuleTemplate");
jpmt.getSingletonClass().setSuperClass(new BlankSlateWrapper(runtime, jpmt.getMetaClass().getSuperClass(), runtime.getKernel()));
JavaPackage.createJavaPackageClass(runtime, Java);

// load Ruby parts of the 'java' library
runtime.getLoadService().load("jruby/java.rb", false);
@@ -289,40 +287,6 @@ private static void addNameClassMappings(final Ruby runtime, final Map<String, J
nameClassMap.put("Void", JavaClass.get(runtime, Void.class));
}

private static class JavaPackageClassProvider implements ClassProvider {

static final JavaPackageClassProvider INSTANCE = new JavaPackageClassProvider();

public RubyClass defineClassUnder(RubyModule pkg, String name, RubyClass superClazz) {
// shouldn't happen, but if a superclass is specified, it's not ours
if ( superClazz != null ) return null;

String packageName = getPackageName(pkg);
// again, shouldn't happen. TODO: might want to throw exception instead.
if ( packageName == null ) return null;

final Ruby runtime = pkg.getRuntime();
JavaClass javaClass = JavaClass.forNameVerbose(runtime, packageName + name);
return (RubyClass) get_proxy_class(runtime.getJavaSupport().getJavaUtilitiesModule(), javaClass);
}

public RubyModule defineModuleUnder(RubyModule pkg, String name) {
String packageName = getPackageName(pkg);
// again, shouldn't happen. TODO: might want to throw exception instead.
if ( packageName == null ) return null;

final Ruby runtime = pkg.getRuntime();
JavaClass javaClass = JavaClass.forNameVerbose(runtime, packageName + name);
return get_interface_module(runtime, javaClass);
}

private static String getPackageName(final RubyModule pkg) {
final IRubyObject package_name = pkg.getInstanceVariables().getInstanceVariable("@package_name");
return package_name == null ? null : package_name.asJavaString();
}

}

public static IRubyObject create_proxy_class(
IRubyObject self,
IRubyObject name,
@@ -700,7 +664,8 @@ private static void addToJavaPackageModule(RubyModule proxyClass) {
className = parentModule == null ? fullName : fullName.substring(endPackage + 1);
}

if ( parentModule != null && IdUtil.isConstant(className) ) {
if ( parentModule != null && // TODO a Java Ruby class should not validate (as well)
( IdUtil.isConstant(className) || parentModule instanceof JavaPackage ) ) {
if (parentModule.getConstantAt(className) == null) {
parentModule.setConstant(className, proxyClass);
}
@@ -742,23 +707,16 @@ private static RubyModule getJavaPackageModule(final Ruby runtime, final String
private static RubyModule createPackageModule(final Ruby runtime,
final RubyModule parentModule, final String name, final String packageString) {

final RubyModule packageModule = (RubyModule) runtime.getJavaSupport().getPackageModuleTemplate().dup();

final String package_name = packageString.length() > 0 ? packageString + '.' : packageString;
packageModule.setInstanceVariable( "@package_name", runtime.newString(package_name) );

// this is where we'll get connected when classes are opened using
// package module syntax.
packageModule.addClassProvider( JavaPackageClassProvider.INSTANCE );
final RubyModule packageModule = JavaPackage.newPackage(runtime, packageString, parentModule);

synchronized (parentModule) { // guard initializing in multiple threads
final IRubyObject packageAlreadySet = parentModule.fetchConstant(name);
if ( packageAlreadySet != null ) {
return (RubyModule) packageAlreadySet;
}
parentModule.setConstant(name.intern(), packageModule);
MetaClass metaClass = (MetaClass) packageModule.getMetaClass();
metaClass.setAttached(packageModule);
//MetaClass metaClass = (MetaClass) packageModule.getMetaClass();
//metaClass.setAttached(packageModule);
}
return packageModule;
}
@@ -790,19 +748,15 @@ public static IRubyObject get_package_module_dot_format(final IRubyObject self,
return module == null ? runtime.getNil() : module;
}

private static RubyModule getProxyOrPackageUnderPackage(final ThreadContext context,
static RubyModule getProxyOrPackageUnderPackage(final ThreadContext context,
final RubyModule parentPackage, final String name, final boolean cacheMethod) {
final Ruby runtime = context.runtime;

if ( name.length() == 0 ) {
throw runtime.newArgumentError("empty class or package name");
}

IRubyObject package_name = parentPackage.getInstanceVariable("@package_name");
if ( package_name == null ) throw runtime.newArgumentError("invalid package module");

final String parentPackageName = package_name.asJavaString();
final String fullName = parentPackageName + name;
final String fullName = JavaPackage.buildPackageName(parentPackage, name).toString();

final RubyModule result;

@@ -1001,10 +955,7 @@ private static class JavaAccessor extends org.jruby.internal.runtime.methods.Jav
@Override
public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name, IRubyObject[] args, Block block) {
if ( args.length != 0 ) {
IRubyObject packageName = parentPackage.callMethod("package_name");
throw context.runtime.newArgumentError(
"Java package `" + packageName + "' does not have a method `" + name + "'"
);
throw JavaPackage.packageMethodArgumentMismatch(context.runtime, parentPackage, name, args.length);
}
return call(context, self, clazz, name);
}
@@ -1492,17 +1443,6 @@ private static int interfacesHashCode(Class[] a) {
return result;
}

@Deprecated
private static void addToJavaPackageModule(RubyModule proxyClass, JavaClass javaClass) {
addToJavaPackageModule(proxyClass);
}

@Deprecated
private static RubyClass createProxyClass(final Ruby runtime,
final RubyClass baseType, final JavaClass javaClass, boolean invokeInherited) {
return createProxyClass(runtime, RubyClass.newClass(runtime, baseType), javaClass, invokeInherited);
}

/**
* @param iface
* @return the sole un-implemented method for a functional-style interface or null
Loading