Navigation Menu

Skip to content

Commit

Permalink
Move more lazy cacheable invariants into indy call sites.
Browse files Browse the repository at this point in the history
  • Loading branch information
headius committed Sep 16, 2014
1 parent 4303b57 commit b9df6cd
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 10 deletions.
30 changes: 30 additions & 0 deletions core/src/main/java/org/jruby/ir/targets/Bootstrap.java
Expand Up @@ -378,6 +378,36 @@ public static IRubyObject array(ThreadContext context, IRubyObject[] elts) {
return RubyArray.newArrayNoCopy(context.runtime, elts);
}

public static Handle contextValue() {
return new Handle(Opcodes.H_INVOKESTATIC, p(Bootstrap.class), "contextValue", sig(CallSite.class, Lookup.class, String.class, MethodType.class));
}

public static CallSite contextValue(Lookup lookup, String name, MethodType type) {
MutableCallSite site = new MutableCallSite(type);
site.setTarget(Binder.from(type).append(site).invokeStaticQuiet(lookup, Bootstrap.class, name));
return site;
}

public static IRubyObject nil(ThreadContext context, MutableCallSite site) {
site.setTarget(dropArguments(constant(IRubyObject.class, context.nil), 0, ThreadContext.class));
return context.nil;
}

public static IRubyObject True(ThreadContext context, MutableCallSite site) {
site.setTarget(dropArguments(constant(IRubyObject.class, context.runtime.getTrue()), 0, ThreadContext.class));
return context.runtime.getTrue();
}

public static IRubyObject False(ThreadContext context, MutableCallSite site) {
site.setTarget(dropArguments(constant(IRubyObject.class, context.runtime.getFalse()), 0, ThreadContext.class));
return context.runtime.getFalse();
}

public static Ruby runtime(ThreadContext context, MutableCallSite site) {
site.setTarget(dropArguments(constant(Ruby.class, context.runtime), 0, ThreadContext.class));
return context.runtime;
}

public static IRubyObject hash(ThreadContext context, IRubyObject[] pairs) {
Ruby runtime = context.runtime;
RubyHash hash = RubyHash.newHash(runtime);
Expand Down
13 changes: 3 additions & 10 deletions core/src/main/java/org/jruby/ir/targets/IRBytecodeAdapter.java
Expand Up @@ -87,7 +87,7 @@ public void pushSymbol(String sym) {

public void loadRuntime() {
loadContext();
adapter.getfield(p(ThreadContext.class), "runtime", ci(Ruby.class));
adapter.invokedynamic("runtime", sig(Ruby.class, ThreadContext.class), Bootstrap.contextValue());
}

public void loadLocal(int i) {
Expand Down Expand Up @@ -244,20 +244,13 @@ public void poll() {
}

public void pushNil() {
// FIXME: avoid traversing context
loadContext();
adapter.getfield(p(ThreadContext.class), "nil", ci(IRubyObject.class));
adapter.invokedynamic("nil", sig(IRubyObject.class, ThreadContext.class), Bootstrap.contextValue());
}

public void pushBoolean(boolean b) {
// FIXME: avoid traversing runtime
loadContext();
adapter.getfield(p(ThreadContext.class), "runtime", ci(Ruby.class));
if (b) {
adapter.invokevirtual(p(Ruby.class), "getTrue", sig(RubyBoolean.class));
} else {
adapter.invokevirtual(p(Ruby.class), "getFalse", sig(RubyBoolean.class));
}
adapter.invokedynamic(b ? "True" : "False", sig(IRubyObject.class, ThreadContext.class), Bootstrap.contextValue());
}

public void pushObjectClass() {
Expand Down

0 comments on commit b9df6cd

Please sign in to comment.