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

Commits on Jul 27, 2017

  1. Copy the full SHA
    6bcc1d7 View commit details
  2. Copy the full SHA
    3c239e8 View commit details

Commits on Jul 28, 2017

  1. Half-hazard conversion of method definitions and their lookup to be R…

    …ubySymbol.
    
    At this point I suspect quite a bit of overhead because I am constantly
    converting from String to RubySymbol.  gem list might be about 5% slower which
    is much less than I anticipated with this extra temporary working being done.
    enebo committed Jul 28, 2017
    Copy the full SHA
    81eb28a View commit details
  2. Copy the full SHA
    596765e View commit details

Commits on Jul 29, 2017

  1. Copy the full SHA
    fe8ab47 View commit details

Commits on Jul 31, 2017

  1. Copy the full SHA
    a11a57d View commit details

Commits on Aug 7, 2017

  1. callsite uses Symbol instead of String. Note: There are still a few c…

    …ases where
    
    we provide a String in the JIT and it bombs on RubySymbol.  I needed to focus on
    some other stuff for now so I decided to commit a tiny bit broken.
    enebo committed Aug 7, 2017
    Copy the full SHA
    5e29f10 View commit details
Showing with 1,861 additions and 1,172 deletions.
  1. +8 −3 core/src/main/java/org/jruby/IncludedModuleWrapper.java
  2. +2 −2 core/src/main/java/org/jruby/PrependedModule.java
  3. +32 −6 core/src/main/java/org/jruby/Ruby.java
  4. +5 −5 core/src/main/java/org/jruby/RubyBasicObject.java
  5. +36 −47 core/src/main/java/org/jruby/RubyClass.java
  6. +1 −4 core/src/main/java/org/jruby/RubyComplex.java
  7. +178 −95 core/src/main/java/org/jruby/RubyModule.java
  8. +6 −3 core/src/main/java/org/jruby/RubyNumeric.java
  9. +10 −11 core/src/main/java/org/jruby/RubyObject.java
  10. +1 −4 core/src/main/java/org/jruby/RubyRational.java
  11. +45 −8 core/src/main/java/org/jruby/RubySymbol.java
  12. +3 −3 core/src/main/java/org/jruby/RubyTime.java
  13. +6 −2 core/src/main/java/org/jruby/ast/FCallNode.java
  14. +4 −0 core/src/main/java/org/jruby/ast/OpAsgnConstDeclNode.java
  15. +15 −1 core/src/main/java/org/jruby/ast/OpAsgnNode.java
  16. +4 −0 core/src/main/java/org/jruby/ast/OpElementAsgnNode.java
  17. +6 −3 core/src/main/java/org/jruby/ast/SymbolNode.java
  18. +10 −10 core/src/main/java/org/jruby/ast/VCallNode.java
  19. +0 −24 core/src/main/java/org/jruby/ast/executable/AbstractScript.java
  20. +0 −43 core/src/main/java/org/jruby/ast/executable/RuntimeCache.java
  21. +14 −6 core/src/main/java/org/jruby/ext/ffi/AutoPointer.java
  22. +4 −3 core/src/main/java/org/jruby/ext/ffi/MappedType.java
  23. +19 −11 core/src/main/java/org/jruby/ext/ffi/StructLayout.java
  24. +6 −3 core/src/main/java/org/jruby/ext/ffi/jffi/DataConverters.java
  25. +13 −15 core/src/main/java/org/jruby/ext/ffi/jffi/JITNativeInvoker.java
  26. +2 −2 core/src/main/java/org/jruby/ext/ffi/jffi/JITRuntime.java
  27. +4 −3 core/src/main/java/org/jruby/ext/ffi/jffi/NativeCallbackFactory.java
  28. +1 −1 core/src/main/java/org/jruby/ext/ffi/jffi/NativeClosureProxy.java
  29. +30 −13 core/src/main/java/org/jruby/internal/runtime/methods/AliasMethod.java
  30. +10 −2 core/src/main/java/org/jruby/internal/runtime/methods/AttrReaderMethod.java
  31. +16 −6 core/src/main/java/org/jruby/internal/runtime/methods/AttrWriterMethod.java
  32. +45 −44 core/src/main/java/org/jruby/ir/IRBuilder.java
  33. +4 −0 core/src/main/java/org/jruby/ir/IRManager.java
  34. +2 −2 core/src/main/java/org/jruby/ir/IRScope.java
  35. +6 −6 core/src/main/java/org/jruby/ir/instructions/ArrayDerefInstr.java
  36. +5 −4 core/src/main/java/org/jruby/ir/instructions/AttrAssignInstr.java
  37. +12 −3 core/src/main/java/org/jruby/ir/instructions/BacktickInstr.java
  38. +10 −8 core/src/main/java/org/jruby/ir/instructions/CallBase.java
  39. +8 −7 core/src/main/java/org/jruby/ir/instructions/CallInstr.java
  40. +3 −2 core/src/main/java/org/jruby/ir/instructions/ClassSuperInstr.java
  41. +11 −7 core/src/main/java/org/jruby/ir/instructions/ConstMissingInstr.java
  42. +10 −9 core/src/main/java/org/jruby/ir/instructions/EQQInstr.java
  43. +4 −3 core/src/main/java/org/jruby/ir/instructions/InstanceSuperInstr.java
  44. +4 −4 core/src/main/java/org/jruby/ir/instructions/MatchInstr.java
  45. +5 −4 core/src/main/java/org/jruby/ir/instructions/NoResultCallInstr.java
  46. +5 −4 core/src/main/java/org/jruby/ir/instructions/ReceiveKeywordArgInstr.java
  47. +1 −0 core/src/main/java/org/jruby/ir/instructions/TraceInstr.java
  48. +6 −6 core/src/main/java/org/jruby/ir/instructions/UnresolvedSuperInstr.java
  49. +4 −4 core/src/main/java/org/jruby/ir/instructions/ZSuperInstr.java
  50. +3 −2 core/src/main/java/org/jruby/ir/instructions/specialized/OneArgOperandAttrAssignInstr.java
  51. +3 −2 core/src/main/java/org/jruby/ir/instructions/specialized/OneFixnumArgNoBlockCallInstr.java
  52. +3 −2 core/src/main/java/org/jruby/ir/instructions/specialized/OneFloatArgNoBlockCallInstr.java
  53. +3 −2 core/src/main/java/org/jruby/ir/instructions/specialized/OneOperandArgBlockCallInstr.java
  54. +4 −3 core/src/main/java/org/jruby/ir/instructions/specialized/OneOperandArgNoBlockCallInstr.java
  55. +3 −2 core/src/main/java/org/jruby/ir/instructions/specialized/OneOperandArgNoBlockNoResultCallInstr.java
  56. +4 −3 core/src/main/java/org/jruby/ir/instructions/specialized/TwoOperandArgNoBlockCallInstr.java
  57. +3 −3 core/src/main/java/org/jruby/ir/instructions/specialized/ZeroOperandArgNoBlockCallInstr.java
  58. +1 −1 core/src/main/java/org/jruby/ir/operands/Hash.java
  59. +23 −21 core/src/main/java/org/jruby/ir/operands/Symbol.java
  60. +20 −15 core/src/main/java/org/jruby/ir/runtime/IRRuntimeHelpers.java
  61. +24 −13 core/src/main/java/org/jruby/ir/targets/IRBytecodeAdapter.java
  62. +46 −24 core/src/main/java/org/jruby/ir/targets/IRBytecodeAdapter6.java
  63. +42 −29 core/src/main/java/org/jruby/ir/targets/IRBytecodeAdapter7.java
  64. +18 −17 core/src/main/java/org/jruby/ir/targets/JVMVisitor.java
  65. +1 −1 core/src/main/java/org/jruby/java/codegen/RealClassGenerator.java
  66. +9 −6 core/src/main/java/org/jruby/java/proxies/ConcreteJavaProxy.java
  67. +4 −3 core/src/main/java/org/jruby/java/util/BlankSlateWrapper.java
  68. +2 −2 core/src/main/java/org/jruby/javasupport/Java.java
  69. +22 −16 core/src/main/java/org/jruby/javasupport/JavaPackage.java
  70. +15 −9 core/src/main/java/org/jruby/javasupport/proxy/JavaProxyClass.java
  71. +13 −13 core/src/main/java/org/jruby/lexer/yacc/RubyLexer.java
  72. +19 −21 core/src/main/java/org/jruby/parser/RubyParser.java
  73. +18 −20 core/src/main/java/org/jruby/parser/RubyParser.y
  74. +1 −1 core/src/main/java/org/jruby/parser/StaticScope.java
  75. +4 −3 core/src/main/java/org/jruby/runtime/CallSite.java
  76. +15 −6 core/src/main/java/org/jruby/runtime/Helpers.java
  77. +671 −297 core/src/main/java/org/jruby/runtime/JavaSites.java
  78. +41 −41 core/src/main/java/org/jruby/runtime/MethodIndex.java
  79. +9 −3 core/src/main/java/org/jruby/runtime/ThreadContext.java
  80. +3 −2 core/src/main/java/org/jruby/runtime/callsite/ArefCallSite.java
  81. +2 −2 core/src/main/java/org/jruby/runtime/callsite/AsetCallSite.java
  82. +3 −2 core/src/main/java/org/jruby/runtime/callsite/BitAndCallSite.java
  83. +3 −2 core/src/main/java/org/jruby/runtime/callsite/BitOrCallSite.java
  84. +39 −34 core/src/main/java/org/jruby/runtime/callsite/CachingCallSite.java
  85. +3 −2 core/src/main/java/org/jruby/runtime/callsite/CmpCallSite.java
  86. +3 −2 core/src/main/java/org/jruby/runtime/callsite/DivCallSite.java
  87. +3 −2 core/src/main/java/org/jruby/runtime/callsite/EqCallSite.java
  88. +2 −1 core/src/main/java/org/jruby/runtime/callsite/FunctionalCachingCallSite.java
  89. +3 −2 core/src/main/java/org/jruby/runtime/callsite/GeCallSite.java
  90. +3 −2 core/src/main/java/org/jruby/runtime/callsite/GtCallSite.java
  91. +3 −2 core/src/main/java/org/jruby/runtime/callsite/LeCallSite.java
  92. +3 −2 core/src/main/java/org/jruby/runtime/callsite/LtCallSite.java
  93. +3 −2 core/src/main/java/org/jruby/runtime/callsite/MinusCallSite.java
  94. +3 −2 core/src/main/java/org/jruby/runtime/callsite/ModCallSite.java
  95. +3 −2 core/src/main/java/org/jruby/runtime/callsite/MulCallSite.java
  96. +3 −2 core/src/main/java/org/jruby/runtime/callsite/NormalCachingCallSite.java
  97. +3 −2 core/src/main/java/org/jruby/runtime/callsite/PlusCallSite.java
  98. +27 −17 core/src/main/java/org/jruby/runtime/callsite/RefinedCachingCallSite.java
  99. +29 −30 core/src/main/java/org/jruby/runtime/callsite/RespondToCallSite.java
  100. +3 −2 core/src/main/java/org/jruby/runtime/callsite/ShiftLeftCallSite.java
  101. +3 −2 core/src/main/java/org/jruby/runtime/callsite/ShiftRightCallSite.java
  102. +3 −2 core/src/main/java/org/jruby/runtime/callsite/SuperCallSite.java
  103. +2 −1 core/src/main/java/org/jruby/runtime/callsite/VariableCachingCallSite.java
  104. +3 −2 core/src/main/java/org/jruby/runtime/callsite/XorCallSite.java
  105. +6 −4 core/src/main/java/org/jruby/util/IOChannel.java
  106. +6 −2 core/src/main/java/org/jruby/util/IOInputStream.java
  107. +6 −3 core/src/main/java/org/jruby/util/IOOutputStream.java
  108. +5 −3 core/src/main/java/org/jruby/util/TypeConverter.java
11 changes: 8 additions & 3 deletions core/src/main/java/org/jruby/IncludedModuleWrapper.java
Original file line number Diff line number Diff line change
@@ -107,12 +107,12 @@ protected boolean isSame(RubyModule module) {
}

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

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

@@ -209,7 +209,7 @@ protected IRubyObject getAutoloadConstant(String name, boolean forceLoad) {
}

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

return null;
}

@Deprecated
protected DynamicMethod searchMethodCommon(String name) {
return searchMethodCommon(getRuntime().newSymbol(name));
}
}
4 changes: 2 additions & 2 deletions core/src/main/java/org/jruby/PrependedModule.java
Original file line number Diff line number Diff line change
@@ -44,9 +44,9 @@ public class PrependedModule extends IncludedModule {
public PrependedModule(Ruby runtime, RubyClass superClass, RubyModule origin) {
super(runtime, superClass, origin);
methods = origin.methods;
origin.methods = new ConcurrentHashMap<String, DynamicMethod>(0, 0.9f, 1);
origin.methods = new ConcurrentHashMap<RubySymbol, DynamicMethod>(0, 0.9f, 1);
origin.methodLocation = this;
for (Map.Entry<String, DynamicMethod> entry : methods.entrySet()) {
for (Map.Entry<RubySymbol, DynamicMethod> entry : methods.entrySet()) {
DynamicMethod method = entry.getValue();
method.setImplementationClass(this);
method.setDefinedClass(origin);
38 changes: 32 additions & 6 deletions core/src/main/java/org/jruby/Ruby.java
Original file line number Diff line number Diff line change
@@ -52,6 +52,8 @@
import org.jruby.ast.WhileNode;
import org.jruby.compiler.Constantizable;
import org.jruby.compiler.NotCompilableException;
import org.jruby.ext.ffi.Struct;
import org.jruby.ext.ffi.StructLayout;
import org.jruby.ext.thread.ConditionVariable;
import org.jruby.ext.thread.Mutex;
import org.jruby.ext.thread.SizedQueue;
@@ -65,6 +67,7 @@
import org.jruby.runtime.JavaSites;
import org.jruby.runtime.invokedynamic.InvokeDynamicSupport;
import org.jruby.util.MRIRecursionGuard;
import org.jruby.util.StringSupport;
import org.jruby.util.StrptimeParser;
import org.jruby.util.StrptimeToken;
import org.objectweb.asm.util.TraceClassVisitor;
@@ -707,7 +710,7 @@ private RootNode addGetsLoop(RootNode oldRoot, boolean printing, boolean process
GlobalVarNode dollarUnderscore = new GlobalVarNode(pos, newSymbol("$_"));

BlockNode whileBody = new BlockNode(pos);
newBody.add(new WhileNode(pos, new VCallNode(pos, "gets"), whileBody));
newBody.add(new WhileNode(pos, new VCallNode(pos, newSymbol("gets")), whileBody));

if (processLineEndings) whileBody.add(new CallNode(pos, dollarUnderscore, newSymbol("chop!"), null, null, false));
if (split) whileBody.add(new GlobalAsgnNode(pos, newSymbol("$F"), new CallNode(pos, dollarUnderscore, newSymbol("split"), null, null, false)));
@@ -1302,22 +1305,28 @@ private void initRoot() {
objectClass = RubyClass.createBootstrapClass(this, "Object", basicObjectClass, RubyObject.OBJECT_ALLOCATOR);
moduleClass = RubyClass.createBootstrapClass(this, "Module", objectClass, RubyModule.MODULE_ALLOCATOR);
classClass = RubyClass.createBootstrapClass(this, "Class", moduleClass, RubyClass.CLASS_ALLOCATOR);
symbolClass = RubyClass.createBootstrapClass(this, "Symbol", objectClass, ObjectAllocator.NOT_ALLOCATABLE_ALLOCATOR);

basicObjectClass.setMetaClass(classClass);
objectClass.setMetaClass(basicObjectClass);
moduleClass.setMetaClass(classClass);
classClass.setMetaClass(classClass);
symbolClass.setMetaClass(classClass);

sites = new JavaSites(this);

RubyClass metaClass;
metaClass = basicObjectClass.makeMetaClass(classClass);
metaClass = objectClass.makeMetaClass(metaClass);
metaClass = moduleClass.makeMetaClass(metaClass);
metaClass = classClass.makeMetaClass(metaClass);
symbolClass.makeMetaClass(classClass);

RubyBasicObject.createBasicObjectClass(this, basicObjectClass);
RubyObject.createObjectClass(this, objectClass);
RubyModule.createModuleClass(this, moduleClass);
RubyClass.createClassClass(this, classClass);
RubySymbol.createSymbolClass(this, symbolClass);

// set constants now that they're initialized
basicObjectClass.setConstant("BasicObject", basicObjectClass);
@@ -1378,7 +1387,7 @@ private void initCore() {

encodingService = new EncodingService(this);

RubySymbol.createSymbolClass(this);
RubySymbol.finishCreatingSymbolClass(this, symbolClass);

if (profile.allowClass("ThreadGroup")) {
RubyThreadGroup.createThreadGroupClass(this);
@@ -3491,7 +3500,7 @@ public RubyString newStringShared(ByteList byteList) {
}

public RubySymbol newSymbol(String name) {
return symbolTable.getSymbol(name);
return symbolTable.getSymbol(new String(name.getBytes(), RubyEncoding.ISO));
}

public RubySymbol newSymbol(String name, Encoding encoding) {
@@ -4448,11 +4457,17 @@ public List<StrptimeToken> getCachedStrptimePattern(String pattern) {
* @param name the name of the method
* @param method
*/
void addProfiledMethod(final String name, final DynamicMethod method) {
void addProfiledMethod(final RubySymbol name, final DynamicMethod method) {
if (!config.isProfiling()) return;
if (method.isUndefined()) return;

getProfilingService().addProfiledMethod( name, method );
// FIXME: profiled methods must end up as symbols eventually
getProfilingService().addProfiledMethod(StringSupport.byteListAsString(name.getBytes()), method );
}

@Deprecated
void addProfiledMethod(final String name, final DynamicMethod method) {
addProfiledMethod(newSymbol(name), method);
}

/**
@@ -4895,6 +4910,16 @@ private MRIRecursionGuard oldRecursionGuard() {

private RubyThreadGroup defaultThreadGroup;

private StructLayout.FieldIO structLayoutDefaultIO;

public void setStructLayoutDefaultIO(StructLayout.FieldIO defaultIO) {
this.structLayoutDefaultIO = defaultIO;
}

public StructLayout.FieldIO getStructLayoutDefaultIO() {
return structLayoutDefaultIO;
}

/**
* All the core classes we keep hard references to. These are here largely
* so that if someone redefines String or Array we won't start blowing up
@@ -5175,7 +5200,8 @@ protected TypePopulator computeValue(Class<?> type) {
}
};

public final JavaSites sites = new JavaSites();
// FIXME: Removed final here but we cannot setup sites until we have RubySymbol bootstrapped
public JavaSites sites;

private volatile MRIRecursionGuard mriRecursionGuard;

10 changes: 5 additions & 5 deletions core/src/main/java/org/jruby/RubyBasicObject.java
Original file line number Diff line number Diff line change
@@ -2370,7 +2370,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<String> seen = new HashSet<>();
final Set<RubySymbol> seen = new HashSet<>();

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

if (klass.isSingleton()) {
Set<RubySymbol> names = new HashSet<>();
for (Map.Entry<String, DynamicMethod> entry : klass.getMethods().entrySet()) {
for (Map.Entry<RubySymbol, 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()));
names.add(entry.getKey());
}

if (all) {
klass = klass.getSuperClass();
while (klass != null && (klass.isSingleton() || klass.isIncluded())) {
if (klass != origin) {
for (Map.Entry<String, DynamicMethod> entry : klass.getMethods().entrySet()) {
for (Map.Entry<RubySymbol, 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()));
names.add(entry.getKey());
}
}
klass = klass.getSuperClass();
83 changes: 36 additions & 47 deletions core/src/main/java/org/jruby/RubyClass.java
Original file line number Diff line number Diff line change
@@ -91,6 +91,7 @@
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;
@@ -237,14 +238,6 @@ public IRubyObject allocate() {
return obj;
}

public CallSite getBaseCallSite(int idx) {
return baseCallSites[idx];
}

public CallSite[] getBaseCallSites() {
return baseCallSites;
}

public CallSite[] getExtraCallSites() {
return extraCallSites;
}
@@ -734,9 +727,11 @@ private IRubyObject checkFuncallDefault(ThreadContext context, IRubyObject self,

DynamicMethod me = sites.site.retrieveCache(klass).method;
if (!checkFuncallCallable(context, me, CallType.FUNCTIONAL, self)) {
return checkFuncallMissing(context, klass, self, sites.methodName, sites.respond_to_missing, sites.method_missing, args);
// FIXME: Broken for mbc strings which are not Java charsets
return checkFuncallMissing(context, klass, self, sites.methodName.asJavaString(), sites.respond_to_missing, sites.method_missing, args);
}
return me.call(context, self, klass, sites.methodName, args);
// FIXME: Broken for mbc strings which are not Java charsets
return me.call(context, self, klass, sites.methodName.asJavaString(), args);
}

// MRI: rb_check_funcall_default
@@ -746,9 +741,11 @@ private IRubyObject checkFuncallDefault(ThreadContext context, IRubyObject self,

DynamicMethod me = sites.site.retrieveCache(klass).method;
if (!checkFuncallCallable(context, me, CallType.FUNCTIONAL, self)) {
return checkFuncallMissing(context, klass, self, sites.methodName, sites.respond_to_missing, sites.method_missing);
// FIXME: Broken for mbc strings which are not Java charsets
return checkFuncallMissing(context, klass, self, sites.methodName.asJavaString(), sites.respond_to_missing, sites.method_missing);
}
return me.call(context, self, klass, sites.methodName);
// FIXME: Broken for mbc strings which are not Java charsets
return me.call(context, self, klass, sites.methodName.asJavaString());
}

// MRI: check_funcall_exec
@@ -986,41 +983,52 @@ public IRubyObject invokeInherited(ThreadContext context, IRubyObject self, IRub
return method.call(context, self, getMetaClass(), "inherited", subclass, Block.NULL_BLOCK);
}

protected CacheEntry initializeCacheEntry(ThreadContext context) {
CacheEntry entry = initializeCallCacheEntry;
if (entry == null) {
DynamicMethod method = searchMethod(context.runtime.newSymbol("initialize"));
entry = new CacheEntry(method, getGeneration());
initializeCallCacheEntry = entry;
}

return entry;
}

/** rb_class_new_instance
*
*/
@JRubyMethod(name = "new", omit = true)
public IRubyObject newInstance(ThreadContext context, Block block) {
IRubyObject obj = allocate();
baseCallSites[CS_IDX_INITIALIZE].call(context, obj, obj, block);
initializeCacheEntry(context).method.call(context, obj, this, "initialize", block);
return obj;
}

@JRubyMethod(name = "new", omit = true)
public IRubyObject newInstance(ThreadContext context, IRubyObject arg0, Block block) {
IRubyObject obj = allocate();
baseCallSites[CS_IDX_INITIALIZE].call(context, obj, obj, arg0, block);
initializeCacheEntry(context).method.call(context, obj, this, "initialize", arg0, block);
return obj;
}

@JRubyMethod(name = "new", omit = true)
public IRubyObject newInstance(ThreadContext context, IRubyObject arg0, IRubyObject arg1, Block block) {
IRubyObject obj = allocate();
baseCallSites[CS_IDX_INITIALIZE].call(context, obj, obj, arg0, arg1, block);
initializeCacheEntry(context).method.call(context, obj, this, "initialize", arg0, arg1, block);
return obj;
}

@JRubyMethod(name = "new", omit = true)
public IRubyObject newInstance(ThreadContext context, IRubyObject arg0, IRubyObject arg1, IRubyObject arg2, Block block) {
IRubyObject obj = allocate();
baseCallSites[CS_IDX_INITIALIZE].call(context, obj, obj, arg0, arg1, arg2, block);
initializeCacheEntry(context).method.call(context, obj, this, "initialize", arg0, arg1, arg2, block);
return obj;
}

@JRubyMethod(name = "new", rest = true, omit = true)
public IRubyObject newInstance(ThreadContext context, IRubyObject[] args, Block block) {
IRubyObject obj = allocate();
baseCallSites[CS_IDX_INITIALIZE].call(context, obj, obj, args, block);
initializeCacheEntry(context).method.call(context, obj, this, "initialize", args, block);
return obj;
}

@@ -1546,8 +1554,10 @@ byte[] reify(final String javaName, final String javaPath) {
final Set<String> instanceMethods = new HashSet<String>(getMethods().size());

// define instance methods
for (Map.Entry<String,DynamicMethod> methodEntry : getMethods().entrySet()) {
final String methodName = methodEntry.getKey();
for (Map.Entry<RubySymbol,DynamicMethod> methodEntry : getMethods().entrySet()) {
// FIXME: this unravels too much to convert this to Symbol. Accept limitation for now plus
// we cannot reify all ruby method names so this might be a touch different?
final String methodName = StringSupport.byteListAsString(methodEntry.getKey().getBytes());

if ( ! JavaNameMangler.willMethodMangleOk(methodName) ) {
LOG.debug("{} method: '{}' won't be part of reified Java class", getName(), methodName);
@@ -1656,8 +1666,8 @@ byte[] reify(final String javaName, final String javaPath) {
}

// define class/static methods
for (Map.Entry<String,DynamicMethod> methodEntry : getMetaClass().getMethods().entrySet()) {
String methodName = methodEntry.getKey();
for (Map.Entry<RubySymbol,DynamicMethod> methodEntry : getMetaClass().getMethods().entrySet()) {
String methodName = StringSupport.byteListAsString(methodEntry.getKey().getBytes());

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

@@ -2321,33 +2331,12 @@ public IRubyObject invoke(ThreadContext context, IRubyObject self, String name,
private ObjectAllocator allocator; // the default allocator
protected ObjectMarshal marshal;
private Set<RubyClass> subclasses;
public static final int CS_IDX_INITIALIZE = 0;
public enum CS_NAMES {
INITIALIZE("initialize");

CS_NAMES(String id) {
this.id = id;
}

private static final CS_NAMES[] VALUES = values();
public static final int length = VALUES.length;

public static CS_NAMES fromOrdinal(int ordinal) {
if (ordinal < 0 || ordinal >= VALUES.length) {
throw new RuntimeException("invalid rest: " + ordinal);
}
return VALUES[ordinal];
}

public final String id;
}

private final CallSite[] baseCallSites = new CallSite[CS_NAMES.length];
{
for(int i = 0; i < baseCallSites.length; i++) {
baseCallSites[i] = MethodIndex.getFunctionalCallSite(CS_NAMES.fromOrdinal(i).id);
}
}
/**
* Because we need classes during bootstrap to callsite cache initialize and RubySymbol has not yet
* come into being we just maintain the cache entry manually.
*/
private CacheEntry initializeCallCacheEntry;

private CallSite[] extraCallSites;

5 changes: 1 addition & 4 deletions core/src/main/java/org/jruby/RubyComplex.java
Original file line number Diff line number Diff line change
@@ -438,12 +438,9 @@ public static IRubyObject convert(ThreadContext context, IRubyObject recv, IRuby
}

private static boolean responds_to_to_c(ThreadContext context, IRubyObject obj) {
return respond_to_to_c.respondsTo(context, obj, obj);
return sites(context).respond_to_to_c.respondsTo(context, obj, obj);
}

// TODO: wasn't sure whether to put this on NumericSites, here for now - should move
static final RespondToCallSite respond_to_to_c = new RespondToCallSite("to_c");

/** nucomp_s_convert
*
*/
Loading