Skip to content

Commit

Permalink
Showing 2 changed files with 49 additions and 20 deletions.
28 changes: 17 additions & 11 deletions core/src/main/java/org/jruby/RubyModule.java
Original file line number Diff line number Diff line change
@@ -1662,19 +1662,25 @@ private DynamicMethod searchForAliasMethod(Ruby runtime, String name) {
if (anno == null) return method;

if (anno.reads().length > 0 || anno.writes().length > 0) {
String baseName = getBaseName();
char refChar = '#';
String simpleName = getSimpleName();

if (baseName == null && this instanceof MetaClass) {
IRubyObject attached = ((MetaClass)this).getAttached();
if (attached instanceof RubyModule) {
simpleName = ((RubyModule)attached).getSimpleName();
refChar = '.';

MethodIndex.addMethodReadFields(name, anno.reads());
MethodIndex.addMethodWriteFields(name, anno.writes());

if (runtime.isVerbose()) {
String baseName = getBaseName();
char refChar = '#';
String simpleName = getSimpleName();

if (baseName == null && this instanceof MetaClass) {
IRubyObject attached = ((MetaClass) this).getAttached();
if (attached instanceof RubyModule) {
simpleName = ((RubyModule) attached).getSimpleName();
refChar = '.';
}
}
}

runtime.getWarnings().warning(simpleName + refChar + name + " accesses caller method's state and should not be aliased");
runtime.getWarnings().warning(simpleName + refChar + name + " accesses caller method's state and should not be aliased");
}
}
}

41 changes: 32 additions & 9 deletions core/src/main/java/org/jruby/runtime/MethodIndex.java
Original file line number Diff line number Diff line change
@@ -33,6 +33,7 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@@ -224,14 +225,21 @@ public static CallSite getSuperCallSite() {
}

public static void addMethodReadFieldsPacked(int readBits, String methodsPacked) {
Set<FrameField> reads = FrameField.unpack(readBits);
Set<FrameField> reads = Collections.synchronizedSet(FrameField.unpack(readBits));

if (DEBUG) LOG.debug("Adding method field reads: {} for {}", reads, methodsPacked);

for (String name : Helpers.SEMICOLON_PATTERN.split(methodsPacked)) {
if (FrameField.needsFrame(readBits)) FRAME_AWARE_METHODS.add(name);
if (FrameField.needsScope(readBits)) SCOPE_AWARE_METHODS.add(name);
METHOD_FRAME_READS.put(name, reads);
String[] names = Helpers.SEMICOLON_PATTERN.split(methodsPacked);

if (FrameField.needsFrame(readBits)) FRAME_AWARE_METHODS.addAll(Arrays.asList(names));
if (FrameField.needsScope(readBits)) SCOPE_AWARE_METHODS.addAll(Arrays.asList(names));

for (String name : names) {
Set<FrameField> current = METHOD_FRAME_READS.putIfAbsent(name, reads);

if (current != null) {
current.addAll(reads);
}
}
}

@@ -240,13 +248,28 @@ public static void addMethodWriteFieldsPacked(int writeBits, String methodsPacke

if (DEBUG) LOG.debug("Adding scope-aware method names: {} for {}", writes, methodsPacked);

for (String name : Helpers.SEMICOLON_PATTERN.split(methodsPacked)) {
if (FrameField.needsFrame(writeBits)) FRAME_AWARE_METHODS.add(name);
if (FrameField.needsScope(writeBits)) SCOPE_AWARE_METHODS.add(name);
METHOD_FRAME_WRITES.put(name, writes);
String[] names = Helpers.SEMICOLON_PATTERN.split(methodsPacked);

if (FrameField.needsFrame(writeBits)) FRAME_AWARE_METHODS.addAll(Arrays.asList(names));
if (FrameField.needsScope(writeBits)) SCOPE_AWARE_METHODS.addAll(Arrays.asList(names));

for (String name : names) {
Set<FrameField> current = METHOD_FRAME_WRITES.putIfAbsent(name, writes);

if (current != null) {
current.addAll(writes);
}
}
}

public static void addMethodReadFields(String name, FrameField[] reads) {
addMethodReadFieldsPacked(FrameField.pack(reads), name);
}

public static void addMethodWriteFields(String name, FrameField[] write) {
addMethodWriteFieldsPacked(FrameField.pack(write), name);
}

@Deprecated
public static void addFrameAwareMethods(String... methods) {
if (DEBUG) LOG.debug("Adding frame-aware method names: {}", Arrays.toString(methods));

0 comments on commit 34aae7c

Please sign in to comment.