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

Commits on Jul 2, 2015

  1. Copy the full SHA
    a21af9c View commit details
  2. Copy the full SHA
    ebe28b9 View commit details
3 changes: 3 additions & 0 deletions spec/ruby/core/module/fixtures/classes.rb
Original file line number Diff line number Diff line change
@@ -313,10 +313,13 @@ class B < A
class CVars
@@cls = :class

# Singleton class lexical scopes are ignored for class variables
class << self
def cls
# This looks in the parent lexical scope, class CVars
@@cls
end
# This actually adds it to the parent lexical scope, class CVars
@@meta = :meta
end

Original file line number Diff line number Diff line change
@@ -12,10 +12,12 @@
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.source.SourceSection;

import org.jruby.truffle.nodes.RubyNode;
import org.jruby.truffle.runtime.LexicalScope;
import org.jruby.truffle.runtime.ModuleOperations;
import org.jruby.truffle.runtime.RubyContext;
import org.jruby.truffle.runtime.core.RubyClass;
import org.jruby.truffle.runtime.core.RubyModule;

public class ReadClassVariableNode extends RubyNode {
@@ -29,13 +31,21 @@ public ReadClassVariableNode(RubyContext context, SourceSection sourceSection, S
this.lexicalScope = lexicalScope;
}

public static RubyModule resolveTargetModule(LexicalScope lexicalScope) {
// MRI logic: ignore lexical scopes (cref) referring to singleton classes
while ((lexicalScope.getLiveModule() instanceof RubyClass) && ((RubyClass) lexicalScope.getLiveModule()).isSingleton()) {
lexicalScope = lexicalScope.getParent();
}
return lexicalScope.getLiveModule();
}

@Override
public Object execute(VirtualFrame frame) {
CompilerDirectives.transferToInterpreter();

final RubyModule moduleObject = lexicalScope.getLiveModule();
final RubyModule module = resolveTargetModule(lexicalScope);

final Object value = ModuleOperations.lookupClassVariable(moduleObject, name);
final Object value = ModuleOperations.lookupClassVariable(module, name);

if (value == null) {
// TODO(CS): is this right?
@@ -48,9 +58,9 @@ public Object execute(VirtualFrame frame) {

@Override
public Object isDefined(VirtualFrame frame) {
final RubyModule moduleObject = lexicalScope.getLiveModule();
final RubyModule module = resolveTargetModule(lexicalScope);

final Object value = ModuleOperations.lookupClassVariable(moduleObject, name);
final Object value = ModuleOperations.lookupClassVariable(module, name);

if (value == null) {
return nil();
Original file line number Diff line number Diff line change
@@ -39,12 +39,7 @@ public Object execute(VirtualFrame frame) {

final Object rhsValue = rhs.execute(frame);

// MRI logic: ignore lexical scopes (cref) referring to singleton classes
LexicalScope scope = this.lexicalScope;
while ((scope.getLiveModule() instanceof RubyClass) && ((RubyClass) scope.getLiveModule()).isSingleton()) {
scope = scope.getParent();
}
final RubyModule module = scope.getLiveModule();
final RubyModule module = ReadClassVariableNode.resolveTargetModule(lexicalScope);

ModuleOperations.setClassVariable(module, name, rhsValue, this);