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: 29edb473f2fd
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 7e8c8489f42d
Choose a head ref
  • 4 commits
  • 86 files changed
  • 1 contributor

Commits on Apr 14, 2018

  1. Finish calls to symbol. Only weird bit here was zsuper and a couple o…

    …f other
    
    calls had implicit names which needed to be symbols but we had no way to make
    them.  Passing in IRScope was the current solution.  Not end of the world, but
    also not totally desirable.
    enebo committed Apr 14, 2018
    Copy the full SHA
    430f2b4 View commit details
  2. AST finalization:

      - Remove getByteName
      - Make getName be getId (maybe to still leave us)
      - Make getSymbolName be getName
    enebo committed Apr 14, 2018
    Copy the full SHA
    0d30f3a View commit details
  3. No more getId in AST.

    global variables now use RubySymbol.
    enebo committed Apr 14, 2018
    Copy the full SHA
    5532950 View commit details
  4. Restore method storage to jlString. Now known as 'id' Strings. This also

    did away with the short-lived StringSupport methods.
    enebo committed Apr 14, 2018
    Copy the full SHA
    7e8c848 View commit details
Showing with 500 additions and 874 deletions.
  1. +7 −8 core/src/main/java/org/jruby/IncludedModuleWrapper.java
  2. +3 −4 core/src/main/java/org/jruby/PrependedModule.java
  3. +3 −3 core/src/main/java/org/jruby/RubyBasicObject.java
  4. +27 −35 core/src/main/java/org/jruby/RubyClass.java
  5. +103 −175 core/src/main/java/org/jruby/RubyModule.java
  6. +4 −15 core/src/main/java/org/jruby/RubyRegexp.java
  7. +0 −1 core/src/main/java/org/jruby/RubySymbol.java
  8. +1 −1 core/src/main/java/org/jruby/anno/AnnotationBinder.java
  9. +1 −11 core/src/main/java/org/jruby/ast/ArgumentNode.java
  10. +1 −11 core/src/main/java/org/jruby/ast/AttrAssignNode.java
  11. +2 −11 core/src/main/java/org/jruby/ast/BlockArgNode.java
  12. +1 −10 core/src/main/java/org/jruby/ast/CallNode.java
  13. +1 −10 core/src/main/java/org/jruby/ast/ClassVarAsgnNode.java
  14. +1 −10 core/src/main/java/org/jruby/ast/ClassVarDeclNode.java
  15. +1 −11 core/src/main/java/org/jruby/ast/ClassVarNode.java
  16. +1 −10 core/src/main/java/org/jruby/ast/Colon3Node.java
  17. +2 −11 core/src/main/java/org/jruby/ast/ConstDeclNode.java
  18. +1 −10 core/src/main/java/org/jruby/ast/ConstNode.java
  19. +1 −10 core/src/main/java/org/jruby/ast/DAsgnNode.java
  20. +1 −10 core/src/main/java/org/jruby/ast/DVarNode.java
  21. +1 −10 core/src/main/java/org/jruby/ast/FCallNode.java
  22. +1 −10 core/src/main/java/org/jruby/ast/GlobalAsgnNode.java
  23. +1 −10 core/src/main/java/org/jruby/ast/GlobalVarNode.java
  24. +1 −10 core/src/main/java/org/jruby/ast/InstAsgnNode.java
  25. +1 −10 core/src/main/java/org/jruby/ast/InstVarNode.java
  26. +1 −10 core/src/main/java/org/jruby/ast/LocalAsgnNode.java
  27. +1 −10 core/src/main/java/org/jruby/ast/LocalVarNode.java
  28. +1 −11 core/src/main/java/org/jruby/ast/MethodDefNode.java
  29. +0 −2 core/src/main/java/org/jruby/ast/NilNode.java
  30. +1 −10 core/src/main/java/org/jruby/ast/OptArgNode.java
  31. +2 −2 core/src/main/java/org/jruby/ast/RestArgNode.java
  32. +2 −19 core/src/main/java/org/jruby/ast/SymbolNode.java
  33. +1 −6 core/src/main/java/org/jruby/ast/UnnamedRestArgNode.java
  34. +1 −10 core/src/main/java/org/jruby/ast/VCallNode.java
  35. +1 −4 core/src/main/java/org/jruby/ast/types/INameNode.java
  36. +5 −3 core/src/main/java/org/jruby/ast/visitor/InstanceVariableFinder.java
  37. +1 −1 core/src/main/java/org/jruby/exceptions/RaiseException.java
  38. +0 −7 core/src/main/java/org/jruby/internal/runtime/methods/AliasMethod.java
  39. +102 −93 core/src/main/java/org/jruby/ir/IRBuilder.java
  40. +1 −1 core/src/main/java/org/jruby/ir/IRScriptBody.java
  41. +3 −3 core/src/main/java/org/jruby/ir/dataflow/analyses/UnboxableOpsAnalysisNode.java
  42. +1 −0 core/src/main/java/org/jruby/ir/dataflow/analyses/UnboxableOpsAnalysisProblem.java
  43. +7 −6 core/src/main/java/org/jruby/ir/instructions/ArrayDerefInstr.java
  44. +6 −9 core/src/main/java/org/jruby/ir/instructions/AttrAssignInstr.java
  45. +18 −29 core/src/main/java/org/jruby/ir/instructions/CallBase.java
  46. +11 −11 core/src/main/java/org/jruby/ir/instructions/CallInstr.java
  47. +6 −6 core/src/main/java/org/jruby/ir/instructions/ClassSuperInstr.java
  48. +1 −1 core/src/main/java/org/jruby/ir/instructions/ConstMissingInstr.java
  49. +3 −2 core/src/main/java/org/jruby/ir/instructions/GetGlobalVariableInstr.java
  50. +7 −7 core/src/main/java/org/jruby/ir/instructions/InstanceSuperInstr.java
  51. +4 −4 core/src/main/java/org/jruby/ir/instructions/MatchInstr.java
  52. +7 −7 core/src/main/java/org/jruby/ir/instructions/NoResultCallInstr.java
  53. +4 −3 core/src/main/java/org/jruby/ir/instructions/PutGlobalVarInstr.java
  54. +6 −6 core/src/main/java/org/jruby/ir/instructions/UnresolvedSuperInstr.java
  55. +4 −4 core/src/main/java/org/jruby/ir/instructions/ZSuperInstr.java
  56. +3 −3 core/src/main/java/org/jruby/ir/instructions/specialized/OneArgOperandAttrAssignInstr.java
  57. +3 −3 core/src/main/java/org/jruby/ir/instructions/specialized/OneFixnumArgNoBlockCallInstr.java
  58. +3 −3 core/src/main/java/org/jruby/ir/instructions/specialized/OneFloatArgNoBlockCallInstr.java
  59. +3 −3 core/src/main/java/org/jruby/ir/instructions/specialized/OneOperandArgBlockCallInstr.java
  60. +4 −4 core/src/main/java/org/jruby/ir/instructions/specialized/OneOperandArgNoBlockCallInstr.java
  61. +3 −3 core/src/main/java/org/jruby/ir/instructions/specialized/OneOperandArgNoBlockNoResultCallInstr.java
  62. +4 −4 core/src/main/java/org/jruby/ir/instructions/specialized/TwoOperandArgNoBlockCallInstr.java
  63. +3 −3 core/src/main/java/org/jruby/ir/instructions/specialized/ZeroOperandArgNoBlockCallInstr.java
  64. +1 −1 core/src/main/java/org/jruby/ir/interpreter/FullInterpreterContext.java
  65. +5 −0 core/src/main/java/org/jruby/ir/operands/FrozenString.java
  66. +4 −3 core/src/main/java/org/jruby/ir/operands/GlobalVariable.java
  67. +4 −3 core/src/main/java/org/jruby/ir/operands/NthRef.java
  68. +9 −4 core/src/main/java/org/jruby/ir/operands/Reference.java
  69. +3 −3 core/src/main/java/org/jruby/ir/persistence/IRDumper.java
  70. +10 −10 core/src/main/java/org/jruby/ir/runtime/IRRuntimeHelpers.java
  71. +11 −11 core/src/main/java/org/jruby/ir/targets/JVMVisitor.java
  72. +4 −3 core/src/main/java/org/jruby/javasupport/JavaClass.java
  73. +3 −2 core/src/main/java/org/jruby/javasupport/JavaMethod.java
  74. +7 −9 core/src/main/java/org/jruby/javasupport/JavaPackage.java
  75. +8 −14 core/src/main/java/org/jruby/javasupport/proxy/JavaProxyClass.java
  76. +1 −2 core/src/main/java/org/jruby/lexer/yacc/RubyLexer.java
  77. +13 −10 core/src/main/java/org/jruby/parser/ParserSupport.java
  78. +2 −2 core/src/main/java/org/jruby/parser/RubyParser.java
  79. +2 −2 core/src/main/java/org/jruby/parser/RubyParser.y
  80. +7 −7 core/src/main/java/org/jruby/runtime/Helpers.java
  81. +1 −1 core/src/main/java/org/jruby/runtime/load/LoadService.java
  82. +1 −1 core/src/main/java/org/jruby/runtime/profile/package-info.java
  83. +0 −53 core/src/main/java/org/jruby/util/StringSupport.java
  84. +1 −1 core/src/test/java/org/jruby/embed/MultipleScriptsRunner.java
  85. +1 −1 core/src/test/java/org/jruby/embed/jsr223/JRubyEngineFactoryTest.java
  86. +1 −1 core/src/test/java/org/jruby/javasupport/TestJavaClass.java
15 changes: 7 additions & 8 deletions core/src/main/java/org/jruby/IncludedModuleWrapper.java
Original file line number Diff line number Diff line change
@@ -41,7 +41,6 @@
import org.jruby.runtime.Visibility;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.runtime.builtin.Variable;
import org.jruby.util.ByteList;

/**
* This class is used to provide an intermediate superclass for modules and classes that include
@@ -82,7 +81,7 @@ public IncludedModuleWrapper newIncludeClass(RubyClass superClass) {
}

@Override
public void addMethod(String name, DynamicMethod method) {
public void addMethod(String id, DynamicMethod method) {
throw new UnsupportedOperationException("An included class is only a wrapper for a module");
}

@@ -106,12 +105,12 @@ protected boolean isSame(RubyModule module) {
}

@Override
public Map<ByteList, DynamicMethod> getMethods() {
public Map<String, DynamicMethod> getMethods() {
return origin.getMethods();
}

@Override
public Map<ByteList, DynamicMethod> getMethodsForWrite() {
public Map<String, DynamicMethod> getMethodsForWrite() {
return origin.getMethodsForWrite();
}

@@ -208,25 +207,25 @@ protected IRubyObject getAutoloadConstant(String name, boolean forceLoad) {
}

@Override
protected DynamicMethod searchMethodCommon(ByteList name) {
protected DynamicMethod searchMethodCommon(String id) {
// IncludedModuleWrapper needs to search prepended modules too, so search until we find methodLocation
RubyModule module = origin;
RubyModule methodLoc = origin.getMethodLocation();

for (; module != methodLoc; module = module.getSuperClass()) {
DynamicMethod method = module.getMethods().get(name);
DynamicMethod method = module.getMethods().get(id);
if (method != null) return method.isNull() ? null : method;
}

// one last search for method location
DynamicMethod method = module.getMethods().get(name);
DynamicMethod method = module.getMethods().get(id);
if (method != null) return method.isNull() ? null : method;

return null;
}

@Override
protected void addMethodSymbols(Ruby runtime, Set<ByteList> seen, RubyArray ary, boolean not, Visibility visibility) {
protected void addMethodSymbols(Ruby runtime, Set<String> seen, RubyArray ary, boolean not, Visibility visibility) {
// IncludedModuleWrapper needs to search prepended modules too, so search until we find methodLocation
RubyModule module = origin;
RubyModule methodLoc = origin.getMethodLocation();
7 changes: 3 additions & 4 deletions core/src/main/java/org/jruby/PrependedModule.java
Original file line number Diff line number Diff line change
@@ -32,7 +32,6 @@
import java.util.concurrent.ConcurrentHashMap;

import org.jruby.internal.runtime.methods.DynamicMethod;
import org.jruby.util.ByteList;

/**
* This class is used as an intermediate superclass for Module#prepend
@@ -47,16 +46,16 @@ public PrependedModule(Ruby runtime, RubyClass superClass, RubyModule origin) {
methods = origin.methods;
origin.methods = new ConcurrentHashMap<>(0, 0.9f, 1);
origin.methodLocation = this;
for (Map.Entry<ByteList, DynamicMethod> entry : methods.entrySet()) {
for (Map.Entry<String, DynamicMethod> entry : methods.entrySet()) {
DynamicMethod method = entry.getValue();
method.setImplementationClass(this);
method.setDefinedClass(origin);
}
}

@Override
public void addMethod(String name, DynamicMethod method) {
super.addMethod(name, method);
public void addMethod(String id, DynamicMethod method) {
super.addMethod(id, method);
method.setDefinedClass(origin);
}

6 changes: 3 additions & 3 deletions core/src/main/java/org/jruby/RubyBasicObject.java
Original file line number Diff line number Diff line change
@@ -2337,7 +2337,7 @@ public IRubyObject methods19(ThreadContext context, IRubyObject[] args) {

final IRubyObject methodsImpl(ThreadContext context, final boolean all) {
final RubyArray methods = RubyArray.newArray(context.runtime);
final Set<ByteList> seen = new HashSet<>();
final Set<String> seen = new HashSet<>();

RubyClass metaClass = getMetaClass();
if (metaClass.isSingleton()) {
@@ -2461,7 +2461,7 @@ public RubyArray singleton_methods(ThreadContext context, IRubyObject[] args) {

if (klass.isSingleton()) {
Set<RubySymbol> names = new HashSet<>();
for (Map.Entry<ByteList, DynamicMethod> entry : klass.getMethods().entrySet()) {
for (Map.Entry<String, DynamicMethod> entry : klass.getMethods().entrySet()) {
if (entry.getValue().getVisibility() == PRIVATE) continue;
// TODO: needs to use method_entry_i logic from MRI
names.add(runtime.newSymbol(entry.getKey()));
@@ -2471,7 +2471,7 @@ public RubyArray singleton_methods(ThreadContext context, IRubyObject[] args) {
klass = klass.getSuperClass();
while (klass != null && (klass.isSingleton() || klass.isIncluded())) {
if (klass != origin) {
for (Map.Entry<ByteList, DynamicMethod> entry : klass.getMethods().entrySet()) {
for (Map.Entry<String, DynamicMethod> entry : klass.getMethods().entrySet()) {
if (entry.getValue().getVisibility() == PRIVATE) continue;
// TODO: needs to use method_entry_i logic from MRI
names.add(runtime.newSymbol(entry.getKey()));
62 changes: 27 additions & 35 deletions core/src/main/java/org/jruby/RubyClass.java
Original file line number Diff line number Diff line change
@@ -87,12 +87,10 @@
import org.jruby.runtime.marshal.UnmarshalStream;
import org.jruby.runtime.opto.Invalidator;
import org.jruby.util.ArraySupport;
import org.jruby.util.ByteList;
import org.jruby.util.OneShotClassLoader;
import org.jruby.util.ClassDefiningClassLoader;
import org.jruby.util.CodegenUtils;
import org.jruby.util.JavaNameMangler;
import org.jruby.util.StringSupport;
import org.jruby.util.collections.WeakHashSet;
import org.jruby.util.log.Logger;
import org.jruby.util.log.LoggerFactory;
@@ -1556,22 +1554,19 @@ byte[] reify(final String javaName, final String javaPath) {
final Set<String> instanceMethods = new HashSet<String>(getMethods().size());

// define instance methods
for (Map.Entry<ByteList, DynamicMethod> methodEntry : getMethods().entrySet()) {
final ByteList name = methodEntry.getKey();
// Since we are reifying to a Java type we should be using method names which are representable
// as a Java charset. If this is not the case we should add some error check or skip those entries?
String methodName = StringSupport.byteListAsString(name);

if (!JavaNameMangler.willMethodMangleOk(methodName)) {
LOG.debug("{} method: '{}' won't be part of reified Java class", getName(), methodName);
for (Map.Entry<String, DynamicMethod> methodEntry : getMethods().entrySet()) {
final String id = methodEntry.getKey();

if (!JavaNameMangler.willMethodMangleOk(id)) {
LOG.debug("{} method: '{}' won't be part of reified Java class", getName(), id);
continue;
}

String javaMethodName = JavaNameMangler.mangleMethodName(methodName);
String javaMethodName = JavaNameMangler.mangleMethodName(id);

Map<Class,Map<String,Object>> methodAnnos = getMethodAnnotations().get(methodName);
List<Map<Class,Map<String,Object>>> parameterAnnos = getParameterAnnotations().get(methodName);
Class[] methodSignature = getMethodSignatures().get(methodName);
Map<Class,Map<String,Object>> methodAnnos = getMethodAnnotations().get(id);
List<Map<Class,Map<String,Object>>> parameterAnnos = getParameterAnnotations().get(id);
Class[] methodSignature = getMethodSignatures().get(id);

final String signature;
if (methodSignature == null) { // non-signature signature with just IRubyObject
@@ -1583,7 +1578,7 @@ byte[] reify(final String javaName, final String javaPath) {
generateMethodAnnotations(methodAnnos, m, parameterAnnos);

m.aload(0);
m.ldc(methodName);
m.ldc(id);
m.invokevirtual(javaPath, "callMethod", sig(IRubyObject.class, String.class));
break;
case 1:
@@ -1592,7 +1587,7 @@ byte[] reify(final String javaName, final String javaPath) {
generateMethodAnnotations(methodAnnos, m, parameterAnnos);

m.aload(0);
m.ldc(methodName);
m.ldc(id);
m.aload(1); // IRubyObject arg1
m.invokevirtual(javaPath, "callMethod", sig(IRubyObject.class, String.class, IRubyObject.class));
break;
@@ -1610,7 +1605,7 @@ byte[] reify(final String javaName, final String javaPath) {
generateMethodAnnotations(methodAnnos, m, parameterAnnos);

m.aload(0);
m.ldc(methodName);
m.ldc(id);

// generate an IRubyObject[] for the method arguments :
m.pushInt(paramCount);
@@ -1629,7 +1624,7 @@ byte[] reify(final String javaName, final String javaPath) {
generateMethodAnnotations(methodAnnos, m, parameterAnnos);

m.aload(0);
m.ldc(methodName);
m.ldc(id);
m.aload(1); // IRubyObject[] arg1
}
m.invokevirtual(javaPath, "callMethod", sig(IRubyObject.class, String.class, IRubyObject[].class));
@@ -1646,42 +1641,39 @@ byte[] reify(final String javaName, final String javaPath) {

signature = sig(methodSignature[0], params);
int mod = ACC_PUBLIC;
if ( isVarArgsSignature(methodName, methodSignature) ) mod |= ACC_VARARGS;
if ( isVarArgsSignature(id, methodSignature) ) mod |= ACC_VARARGS;
m = new SkinnyMethodAdapter(cw, mod, javaMethodName, signature, null, null);
generateMethodAnnotations(methodAnnos, m, parameterAnnos);

m.getstatic(javaPath, "ruby", ci(Ruby.class));
m.astore(rubyIndex);

m.aload(0); // self
m.ldc(methodName); // method name
m.ldc(id); // method name
RealClassGenerator.coerceArgumentsToRuby(m, params, rubyIndex);
m.invokevirtual(javaPath, "callMethod", sig(IRubyObject.class, String.class, IRubyObject[].class));

RealClassGenerator.coerceResultAndReturn(m, methodSignature[0]);
}

if (DEBUG_REIFY) LOG.debug("defining {}#{} as {}#{}", getName(), methodName, javaName, javaMethodName + signature);
if (DEBUG_REIFY) LOG.debug("defining {}#{} as {}#{}", getName(), id, javaName, javaMethodName + signature);

instanceMethods.add(javaMethodName + signature);

m.end();
}

// define class/static methods
for (Map.Entry<ByteList,DynamicMethod> methodEntry : getMetaClass().getMethods().entrySet()) {
ByteList name = methodEntry.getKey();
// Since we are reifying to a Java type we should be using method names which are representable
// as a Java charset. If this is not the case we should add some error check or skip those entries?
String methodName = StringSupport.byteListAsString(name);
for (Map.Entry<String, DynamicMethod> methodEntry : getMetaClass().getMethods().entrySet()) {
String id = methodEntry.getKey();

if (!JavaNameMangler.willMethodMangleOk(methodName)) continue;
if (!JavaNameMangler.willMethodMangleOk(id)) continue;

String javaMethodName = JavaNameMangler.mangleMethodName(methodName);
String javaMethodName = JavaNameMangler.mangleMethodName(id);

Map<Class,Map<String,Object>> methodAnnos = getMetaClass().getMethodAnnotations().get(methodName);
List<Map<Class,Map<String,Object>>> parameterAnnos = getMetaClass().getParameterAnnotations().get(methodName);
Class[] methodSignature = getMetaClass().getMethodSignatures().get(methodName);
Map<Class,Map<String,Object>> methodAnnos = getMetaClass().getMethodAnnotations().get(id);
List<Map<Class,Map<String,Object>>> parameterAnnos = getMetaClass().getParameterAnnotations().get(id);
Class[] methodSignature = getMetaClass().getMethodSignatures().get(id);

String signature;
if (methodSignature == null) {
@@ -1696,7 +1688,7 @@ byte[] reify(final String javaName, final String javaPath) {

m.getstatic(javaPath, "rubyClass", ci(RubyClass.class));
//m.invokevirtual("org/jruby/RubyClass", "getMetaClass", sig(RubyClass.class) );
m.ldc(methodName);
m.ldc(id);
m.invokevirtual("org/jruby/RubyClass", "callMethod", sig(IRubyObject.class, String.class) );
break;
default:
@@ -1706,7 +1698,7 @@ byte[] reify(final String javaName, final String javaPath) {
generateMethodAnnotations(methodAnnos, m, parameterAnnos);

m.getstatic(javaPath, "rubyClass", ci(RubyClass.class));
m.ldc(methodName);
m.ldc(id);
m.aload(0);
m.invokevirtual("org/jruby/RubyClass", "callMethod", sig(IRubyObject.class, String.class, IRubyObject[].class) );
}
@@ -1730,14 +1722,14 @@ byte[] reify(final String javaName, final String javaPath) {

m.getstatic(javaPath, "rubyClass", ci(RubyClass.class));

m.ldc(methodName); // method name
m.ldc(id); // method name
RealClassGenerator.coerceArgumentsToRuby(m, params, rubyIndex);
m.invokevirtual("org/jruby/RubyClass", "callMethod", sig(IRubyObject.class, String.class, IRubyObject[].class));

RealClassGenerator.coerceResultAndReturn(m, methodSignature[0]);
}

if (DEBUG_REIFY) LOG.debug("defining {}.{} as {}.{}", getName(), methodName, javaName, javaMethodName + signature);
if (DEBUG_REIFY) LOG.debug("defining {}.{} as {}.{}", getName(), id, javaName, javaMethodName + signature);

m.end();
}
Loading