Skip to content

Commit

Permalink
Showing 3 changed files with 24 additions and 44 deletions.
Original file line number Diff line number Diff line change
@@ -490,21 +490,11 @@ public void visitObjectGraphChildren(ObjectSpaceManager.ObjectGraphVisitor visit
}
}

for (Object classVariable : classVariables.values()) {
if (classVariable instanceof RubyBasicObject) {
((RubyBasicObject) classVariable).visitObjectGraph(visitor);
}
}

for (InternalMethod method : methods.values()) {
if (method.getDeclarationFrame() != null) {
getContext().getObjectSpaceManager().visitFrame(method.getDeclarationFrame(), visitor);
}
}

for (RubyModule ancestor : ancestors()) {
ancestor.visitObjectGraph(visitor);
}
}

public ModuleChain getParentModule() {
Original file line number Diff line number Diff line change
@@ -17,14 +17,8 @@
import org.jruby.truffle.runtime.control.ReturnException;
import org.jruby.truffle.runtime.control.ThreadExitException;
import org.jruby.truffle.runtime.subsystems.ThreadManager;
import org.jruby.truffle.runtime.subsystems.ObjectSpaceManager.ObjectGraphVisitor;
import org.jruby.truffle.runtime.subsystems.ThreadManager.BlockingActionWithoutGlobalLock;

import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.frame.Frame;
import com.oracle.truffle.api.frame.FrameInstance;
import com.oracle.truffle.api.frame.FrameInstanceVisitor;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
@@ -179,31 +173,6 @@ public String getName() {
return name;
}

@Override
public void visitObjectGraphChildren(ObjectGraphVisitor visitor) {
visitCallStack(visitor);
}

private void visitCallStack(final ObjectGraphVisitor visitor) {
FrameInstance currentFrame = Truffle.getRuntime().getCurrentFrame();
if (currentFrame != null) {
visitFrameInstance(currentFrame, visitor);
}

Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<Object>() {
@Override
public Void visitFrame(FrameInstance frameInstance) {
visitFrameInstance(frameInstance, visitor);
return null;
}
});
}

private void visitFrameInstance(FrameInstance frameInstance, ObjectGraphVisitor visitor) {
Frame frame = frameInstance.getFrame(FrameInstance.FrameAccess.READ_ONLY, true);
getContext().getObjectSpaceManager().visitFrame(frame, visitor);
}

public static class ThreadAllocator implements Allocator {

@Override
Original file line number Diff line number Diff line change
@@ -160,14 +160,16 @@ public boolean visit(RubyBasicObject object) {

};

context.getCoreLibrary().getGlobalVariablesObject().visitObjectGraph(visitor);

context.getSafepointManager().pauseAllThreadsAndExecute(new Consumer<RubyThread>() {

@Override
public void accept(RubyThread currentThread) {
synchronized (liveObjects) {
currentThread.visitObjectGraph(visitor);
visitor.visit(currentThread);
context.getCoreLibrary().getGlobalVariablesObject().visitObjectGraph(visitor);
context.getCoreLibrary().getMainObject().visitObjectGraph(visitor);
context.getCoreLibrary().getObjectClass().visitObjectGraph(visitor);
visitCallStack(visitor);
}
}

@@ -176,6 +178,25 @@ public void accept(RubyThread currentThread) {
return Collections.unmodifiableMap(liveObjects);
}

public void visitCallStack(final ObjectGraphVisitor visitor) {
FrameInstance currentFrame = Truffle.getRuntime().getCurrentFrame();
if (currentFrame != null) {
visitFrameInstance(currentFrame, visitor);
}

Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<Object>() {
@Override
public Void visitFrame(FrameInstance frameInstance) {
visitFrameInstance(frameInstance, visitor);
return null;
}
});
}

public void visitFrameInstance(FrameInstance frameInstance, ObjectGraphVisitor visitor) {
visitFrame(frameInstance.getFrame(FrameInstance.FrameAccess.READ_ONLY, true), visitor);
}

public void visitFrame(Frame frame, ObjectGraphVisitor visitor) {
if (frame == null) {
return;

0 comments on commit c6ef3ee

Please sign in to comment.