Skip to content

Commit e3c8497

Browse files
qunaibitsteve-s
authored andcommitted
Filter out hidden keys
1 parent e5b6bbc commit e3c8497

File tree

1 file changed

+27
-0
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib

1 file changed

+27
-0
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectDir.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,16 @@
5050
import com.oracle.graal.python.nodes.PRaiseNode;
5151
import com.oracle.graal.python.nodes.builtins.ListNodes;
5252
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
53+
import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage;
54+
import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage;
55+
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
5356
import com.oracle.truffle.api.dsl.Cached;
5457
import com.oracle.truffle.api.dsl.GenerateCached;
5558
import com.oracle.truffle.api.dsl.GenerateInline;
5659
import com.oracle.truffle.api.dsl.Specialization;
5760
import com.oracle.truffle.api.frame.VirtualFrame;
5861
import com.oracle.truffle.api.nodes.Node;
62+
import com.oracle.truffle.api.object.HiddenKey;
5963

6064
/**
6165
* Partial equivalent of CPython's {@code PyObject_Dir}. Only supports listing attributes of an
@@ -77,7 +81,30 @@ static PList dir(VirtualFrame frame, Node inliningTarget, Object object,
7781
throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_DOES_NOT_PROVIDE_DIR);
7882
}
7983
PList list = constructListNode.execute(frame, result);
84+
filterHiddenKeys(list.getSequenceStorage());
8085
sortNode.execute(frame, list);
8186
return list;
8287
}
88+
89+
static void filterHiddenKeys(SequenceStorage s) {
90+
if (s instanceof EmptySequenceStorage) {
91+
// noting to do.
92+
} else if (s instanceof ObjectSequenceStorage storage) {
93+
// String do not have a special storage
94+
Object[] oldarray = storage.getInternalArray();
95+
Object[] newarray = new Object[storage.length()];
96+
int j = 0;
97+
for (int i = 0; i < storage.length(); i++) {
98+
Object o = oldarray[i];
99+
if (o instanceof HiddenKey) {
100+
continue;
101+
}
102+
newarray[j++] = o;
103+
}
104+
storage.setInternalArrayObject(newarray);
105+
storage.setNewLength(j);
106+
} else {
107+
assert false : "Unexpected storage type!";
108+
}
109+
}
83110
}

0 commit comments

Comments
 (0)