Skip to content

Commit 7e2aa1f

Browse files
committed
Fix native bytes __hash__
1 parent 3c76203 commit 7e2aa1f

File tree

3 files changed

+29
-53
lines changed

3 files changed

+29
-53
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GETNEWARGS__;
4141
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GE__;
4242
import static com.oracle.graal.python.nodes.SpecialMethodNames.__GT__;
43+
import static com.oracle.graal.python.nodes.SpecialMethodNames.__HASH__;
4344
import static com.oracle.graal.python.nodes.SpecialMethodNames.__IMOD__;
4445
import static com.oracle.graal.python.nodes.SpecialMethodNames.__INIT__;
4546
import static com.oracle.graal.python.nodes.SpecialMethodNames.__ITER__;
@@ -439,6 +440,34 @@ public Object mul(@SuppressWarnings("unused") Object self, Object other) {
439440
}
440441
}
441442

443+
@Builtin(name = __HASH__, minNumOfPositionalArgs = 1)
444+
@GenerateNodeFactory
445+
abstract static class HashNode extends PythonUnaryBuiltinNode {
446+
@Specialization(guards = "isByteStorage(self)")
447+
@TruffleBoundary
448+
static long hash(PBytes self) {
449+
ByteSequenceStorage storage = (ByteSequenceStorage) self.getSequenceStorage();
450+
byte[] array = storage.getInternalByteArray();
451+
int len = storage.length();
452+
int result = 1;
453+
for (int i = 0; i < len; i++) {
454+
result = 31 * result + array[i];
455+
}
456+
return result;
457+
}
458+
459+
@Specialization(guards = "!isByteStorage(self)", limit = "1")
460+
static long hashNative(PBytes self,
461+
@CachedLibrary("self") PythonBufferAccessLibrary bufferLib) {
462+
int result = 1;
463+
int len = bufferLib.getBufferLength(self);
464+
for (int i = 0; i < len; i++) {
465+
result = 31 * result + bufferLib.readByte(self, i);
466+
}
467+
return result;
468+
}
469+
}
470+
442471
@Builtin(name = __EQ__, minNumOfPositionalArgs = 2)
443472
@GenerateNodeFactory
444473
public abstract static class EqNode extends PythonBinaryBuiltinNode {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PByteArray.java

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@
2727

2828
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.BufferError;
2929

30-
import java.util.Arrays;
31-
3230
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAccessLibrary;
3331
import com.oracle.graal.python.builtins.objects.common.IndexNodes;
3432
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
@@ -50,7 +48,6 @@
5048
import com.oracle.truffle.api.library.CachedLibrary;
5149
import com.oracle.truffle.api.library.ExportLibrary;
5250
import com.oracle.truffle.api.library.ExportMessage;
53-
import com.oracle.truffle.api.library.ExportMessage.Ignore;
5451
import com.oracle.truffle.api.object.Shape;
5552

5653
@ExportLibrary(InteropLibrary.class)
@@ -83,24 +80,6 @@ public String formatByteArray(String typeName) {
8380
}
8481
}
8582

86-
@Ignore
87-
@Override
88-
public boolean equals(Object obj) {
89-
if (!(obj instanceof PByteArray)) {
90-
return false;
91-
}
92-
if (this == obj) {
93-
return true;
94-
}
95-
PByteArray other = (PByteArray) obj;
96-
return Arrays.equals(store.getInternalArray(), other.store.getInternalArray());
97-
}
98-
99-
@Override
100-
public final int hashCode() {
101-
return Arrays.hashCode(store.getInternalArray());
102-
}
103-
10483
public final void reverse() {
10584
store.reverse();
10685
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/PBytes.java

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,17 @@
2727

2828
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.BufferError;
2929

30-
import java.util.Arrays;
31-
3230
import com.oracle.graal.python.builtins.objects.buffer.BufferFlags;
3331
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
3432
import com.oracle.graal.python.nodes.ErrorMessages;
3533
import com.oracle.graal.python.nodes.PRaiseNode;
36-
import com.oracle.graal.python.runtime.sequence.PSequence;
3734
import com.oracle.graal.python.runtime.sequence.storage.ByteSequenceStorage;
3835
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
3936
import com.oracle.truffle.api.CompilerAsserts;
4037
import com.oracle.truffle.api.dsl.Cached;
4138
import com.oracle.truffle.api.interop.InteropLibrary;
4239
import com.oracle.truffle.api.library.ExportLibrary;
4340
import com.oracle.truffle.api.library.ExportMessage;
44-
import com.oracle.truffle.api.library.ExportMessage.Ignore;
4541
import com.oracle.truffle.api.object.Shape;
4642

4743
@ExportLibrary(InteropLibrary.class)
@@ -71,34 +67,6 @@ public String toString() {
7167
}
7268
}
7369

74-
@Ignore
75-
@Override
76-
public final boolean equals(Object other) {
77-
// TODO(fa) really required ?
78-
if (!(other instanceof PSequence)) {
79-
return false;
80-
} else {
81-
return equals((PSequence) other);
82-
}
83-
}
84-
85-
@Ignore
86-
public final boolean equals(PSequence other) {
87-
CompilerAsserts.neverPartOfCompilation();
88-
PSequence otherSeq = other;
89-
SequenceStorage otherStore = otherSeq.getSequenceStorage();
90-
return store.equals(otherStore);
91-
}
92-
93-
@Override
94-
public final int hashCode() {
95-
// TODO(fa) really required ?
96-
if (store instanceof ByteSequenceStorage) {
97-
return Arrays.hashCode(((ByteSequenceStorage) store).getInternalByteArray());
98-
}
99-
return store.hashCode();
100-
}
101-
10270
@ExportMessage
10371
@SuppressWarnings("unused")
10472
public static boolean isArrayElementModifiable(PBytes self, long index) {

0 commit comments

Comments
 (0)