Skip to content
Snippets Groups Projects
Commit ca4db4a4 authored by Zbynek Slajchrt's avatar Zbynek Slajchrt
Browse files

More getNames() occurences treated

parent 9a8a67e9
No related branches found
No related tags found
No related merge requests found
......@@ -39,6 +39,7 @@ import com.oracle.truffle.r.nodes.EmptyTypeSystemFlatLayout;
import com.oracle.truffle.r.nodes.access.vector.ElementAccessMode;
import com.oracle.truffle.r.nodes.access.vector.ExtractListElement;
import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode;
import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
import com.oracle.truffle.r.nodes.builtin.CastBuilder;
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
import com.oracle.truffle.r.runtime.ArgumentsSignature;
......@@ -69,8 +70,8 @@ abstract class AccessFieldSpecial extends SpecialsUtils.ListFieldSpecialBase {
}
@Specialization(contains = "doList", guards = {"isSimpleList(list)", "list.getNames() != null"})
public Object doListDynamic(RList list, String field) {
return doList(list, field, getIndex(list.getNames(), field));
public Object doListDynamic(RList list, String field, @Cached("create()") GetNamesAttributeNode getNamesNode) {
return doList(list, field, getIndex(getNamesNode.getNames(list), field));
}
@Fallback
......
......@@ -26,6 +26,7 @@ import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.profiles.ValueProfile;
import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.GetNamesAttributeNode;
import com.oracle.truffle.r.nodes.function.ClassHierarchyNode;
import com.oracle.truffle.r.runtime.ArgumentsSignature;
import com.oracle.truffle.r.runtime.data.RList;
......@@ -84,12 +85,13 @@ class SpecialsUtils {
@CompilationFinal private String cachedField;
@CompilationFinal private RStringVector cachedNames;
@Child private ClassHierarchyNode hierarchyNode = ClassHierarchyNode.create();
@Child protected GetNamesAttributeNode getNamesNode = GetNamesAttributeNode.create();
protected final void updateCache(RList list, String field) {
if (cachedField == null) {
CompilerDirectives.transferToInterpreterAndInvalidate();
cachedField = field;
cachedNames = list.getNames();
cachedNames = getNamesNode.getNames(list);
}
}
......@@ -98,7 +100,7 @@ class SpecialsUtils {
}
protected final boolean isCached(RList list, String field) {
return cachedField == null || (cachedField == field && list.getNames() == cachedNames);
return cachedField == null || (cachedField == field && getNamesNode.getNames(list) == cachedNames);
}
protected static int getIndex(RStringVector names, String field) {
......
......@@ -83,7 +83,7 @@ abstract class UpdateFieldSpecial extends SpecialsUtils.ListFieldSpecialBase {
@Specialization(contains = "doList", guards = {"isSimpleList(list)", "!list.isShared()", "list.getNames() != null", "isNotRNullRList(value)"})
public RList doListDynamic(RList list, String field, Object value) {
return doList(list, field, value, getIndex(list.getNames(), field));
return doList(list, field, value, getIndex(getNamesNode.getNames(list), field));
}
@SuppressWarnings("unused")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment