Skip to content

Commit db78ed6

Browse files
committed
[GR-67255] implement _sha2 builtin module
PullRequest: graalpython/3907
2 parents a5374e5 + 3cbb7f2 commit db78ed6

File tree

10 files changed

+74
-116
lines changed

10 files changed

+74
-116
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_cprofile.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
test.test_cprofile.CProfileTest.test_output_file_when_changing_directory @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64
2-
test.test_cprofile.CProfileTest.test_run_profile_as_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64
2+
# transient: inconsistent running time [GR-67706]
3+
!test.test_cprofile.CProfileTest.test_run_profile_as_module @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64
34
test.test_cprofile.CProfileTest.test_throw @ darwin-arm64,darwin-x86_64,linux-x86_64,win32-AMD64
45
test.test_cprofile.TestCommandLine.test_sort @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64
56
test.test_profile.ProfileTest.test_calling_conventions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,8 @@
172172
import com.oracle.graal.python.builtins.modules.hashlib.HashlibModuleBuiltins;
173173
import com.oracle.graal.python.builtins.modules.hashlib.Md5ModuleBuiltins;
174174
import com.oracle.graal.python.builtins.modules.hashlib.Sha1ModuleBuiltins;
175-
import com.oracle.graal.python.builtins.modules.hashlib.Sha256ModuleBuiltins;
175+
import com.oracle.graal.python.builtins.modules.hashlib.Sha2ModuleBuiltins;
176176
import com.oracle.graal.python.builtins.modules.hashlib.Sha3ModuleBuiltins;
177-
import com.oracle.graal.python.builtins.modules.hashlib.Sha512ModuleBuiltins;
178177
import com.oracle.graal.python.builtins.modules.hashlib.ShakeDigestObjectBuiltins;
179178
import com.oracle.graal.python.builtins.modules.io.BufferedIOBaseBuiltins;
180179
import com.oracle.graal.python.builtins.modules.io.BufferedIOMixinBuiltins;
@@ -691,8 +690,7 @@ private static PythonBuiltins[] initializeBuiltins(TruffleLanguage.Env env) {
691690
// hashlib
692691
PythonImageBuildOptions.WITHOUT_DIGEST ? null : new Md5ModuleBuiltins(),
693692
PythonImageBuildOptions.WITHOUT_DIGEST ? null : new Sha1ModuleBuiltins(),
694-
PythonImageBuildOptions.WITHOUT_DIGEST ? null : new Sha256ModuleBuiltins(),
695-
PythonImageBuildOptions.WITHOUT_DIGEST ? null : new Sha512ModuleBuiltins(),
693+
PythonImageBuildOptions.WITHOUT_DIGEST ? null : new Sha2ModuleBuiltins(),
696694
PythonImageBuildOptions.WITHOUT_DIGEST ? null : new Sha3ModuleBuiltins(),
697695
PythonImageBuildOptions.WITHOUT_DIGEST ? null : new Blake2ModuleBuiltins(),
698696
PythonImageBuildOptions.WITHOUT_DIGEST ? null : new DigestObjectBuiltins(),

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import static com.oracle.graal.python.nodes.BuiltinNames.J_DICT_VALUES;
4242
import static com.oracle.graal.python.nodes.BuiltinNames.J_GENERIC;
4343
import static com.oracle.graal.python.nodes.BuiltinNames.J_LRU_CACHE_WRAPPER;
44+
import static com.oracle.graal.python.nodes.BuiltinNames.J_MD5;
4445
import static com.oracle.graal.python.nodes.BuiltinNames.J_MEMBER_DESCRIPTOR;
4546
import static com.oracle.graal.python.nodes.BuiltinNames.J_ORDERED_DICT;
4647
import static com.oracle.graal.python.nodes.BuiltinNames.J_PARAM_SPEC;
@@ -50,6 +51,9 @@
5051
import static com.oracle.graal.python.nodes.BuiltinNames.J_POLYGLOT;
5152
import static com.oracle.graal.python.nodes.BuiltinNames.J_POSIX;
5253
import static com.oracle.graal.python.nodes.BuiltinNames.J_PROPERTY;
54+
import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA1;
55+
import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA2;
56+
import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA3;
5357
import static com.oracle.graal.python.nodes.BuiltinNames.J_SIMPLE_QUEUE;
5458
import static com.oracle.graal.python.nodes.BuiltinNames.J_TUPLE_GETTER;
5559
import static com.oracle.graal.python.nodes.BuiltinNames.J_TYPES;
@@ -1173,18 +1177,18 @@ def takewhile(predicate, iterable):
11731177
PEncodingMap("EncodingMap", PythonObject, newBuilder().disallowInstantiation()),
11741178

11751179
// hashlib
1176-
MD5Type("md5", PythonObject, newBuilder().publishInModule("_md5").basetype().disallowInstantiation()),
1177-
SHA1Type("sha1", PythonObject, newBuilder().publishInModule("_sha1").basetype().disallowInstantiation()),
1178-
SHA224Type("sha224", PythonObject, newBuilder().publishInModule("_sha256").basetype().disallowInstantiation()),
1179-
SHA256Type("sha256", PythonObject, newBuilder().publishInModule("_sha256").basetype().disallowInstantiation()),
1180-
SHA384Type("sha384", PythonObject, newBuilder().publishInModule("_sha512").basetype().disallowInstantiation()),
1181-
SHA512Type("sha512", PythonObject, newBuilder().publishInModule("_sha512").basetype().disallowInstantiation()),
1182-
Sha3SHA224Type("sha3_224", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)),
1183-
Sha3SHA256Type("sha3_256", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)),
1184-
Sha3SHA384Type("sha3_384", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)),
1185-
Sha3SHA512Type("sha3_512", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)),
1186-
Sha3Shake128Type("shake_128", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)),
1187-
Sha3Shake256Type("shake_256", PythonObject, newBuilder().publishInModule("_sha3").basetype().slots(Sha3Builtins.SLOTS)),
1180+
MD5Type("md5", PythonObject, newBuilder().publishInModule(J_MD5).basetype().disallowInstantiation()),
1181+
SHA1Type("sha1", PythonObject, newBuilder().publishInModule(J_SHA1).basetype().disallowInstantiation()),
1182+
SHA224Type("SHA224Type", PythonObject, newBuilder().publishInModule(J_SHA2).basetype().disallowInstantiation()),
1183+
SHA256Type("SHA256Type", PythonObject, newBuilder().publishInModule(J_SHA2).basetype().disallowInstantiation()),
1184+
SHA384Type("SHA384Type", PythonObject, newBuilder().publishInModule(J_SHA2).basetype().disallowInstantiation()),
1185+
SHA512Type("SHA512Type", PythonObject, newBuilder().publishInModule(J_SHA2).basetype().disallowInstantiation()),
1186+
Sha3SHA224Type("sha3_224", PythonObject, newBuilder().publishInModule(J_SHA3).basetype().slots(Sha3Builtins.SLOTS)),
1187+
Sha3SHA256Type("sha3_256", PythonObject, newBuilder().publishInModule(J_SHA3).basetype().slots(Sha3Builtins.SLOTS)),
1188+
Sha3SHA384Type("sha3_384", PythonObject, newBuilder().publishInModule(J_SHA3).basetype().slots(Sha3Builtins.SLOTS)),
1189+
Sha3SHA512Type("sha3_512", PythonObject, newBuilder().publishInModule(J_SHA3).basetype().slots(Sha3Builtins.SLOTS)),
1190+
Sha3Shake128Type("shake_128", PythonObject, newBuilder().publishInModule(J_SHA3).basetype().slots(Sha3Builtins.SLOTS)),
1191+
Sha3Shake256Type("shake_256", PythonObject, newBuilder().publishInModule(J_SHA3).basetype().slots(Sha3Builtins.SLOTS)),
11881192
Blake2bType("blake2b", PythonObject, newBuilder().publishInModule("_blake2").basetype().slots(Blake2bObjectBuiltins.SLOTS)),
11891193
/* Note we reuse the blake2b slots */
11901194
Blake2sType("blake2s", PythonObject, newBuilder().publishInModule("_blake2").basetype().slots(Blake2bObjectBuiltins.SLOTS)),

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SysModuleBuiltins.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@
8282
import static com.oracle.graal.python.nodes.BuiltinNames.J_DISPLAYHOOK;
8383
import static com.oracle.graal.python.nodes.BuiltinNames.J_EXCEPTHOOK;
8484
import static com.oracle.graal.python.nodes.BuiltinNames.J_EXIT;
85+
import static com.oracle.graal.python.nodes.BuiltinNames.J_MD5;
86+
import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA1;
87+
import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA2;
88+
import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA3;
8589
import static com.oracle.graal.python.nodes.BuiltinNames.J_UNRAISABLEHOOK;
8690
import static com.oracle.graal.python.nodes.BuiltinNames.T_BREAKPOINTHOOK;
8791
import static com.oracle.graal.python.nodes.BuiltinNames.T_BUILTINS;
@@ -437,8 +441,8 @@ public final class SysModuleBuiltins extends PythonBuiltins {
437441
private static final String[] STDLIB_MODULE_NAMES = new String[]{"__future__", "_abc", "_aix_support", "_ast", "_asyncio", "_bisect", "_blake2", "_bootsubprocess", "_bz2", "_codecs", "_codecs_cn",
438442
"_codecs_hk", "_codecs_iso2022", "_codecs_jp", "_codecs_kr", "_codecs_tw", "_collections", "_collections_abc", "_compat_pickle", "_compression", "_contextvars", "_crypt", "_csv",
439443
"_ctypes", "_curses", "_curses_panel", "_datetime", "_dbm", "_decimal", "_elementtree", "_frozen_importlib", "_frozen_importlib_external", "_functools", "_gdbm", "_hashlib",
440-
"_heapq", "_imp", "_io", "_json", "_locale", "_lsprof", "_lzma", "_markupbase", "_md5", "_msi", "_multibytecodec", "_multiprocessing", "_opcode", "_operator", "_osx_support",
441-
"_overlapped", "_pickle", "_posixshmem", "_posixsubprocess", "_py_abc", "_pydecimal", "_pyio", "_queue", "_random", "_scproxy", "_sha1", "_sha256", "_sha3", "_sha512", "_signal",
444+
"_heapq", "_imp", "_io", "_json", "_locale", "_lsprof", "_lzma", "_markupbase", J_MD5, "_msi", "_multibytecodec", "_multiprocessing", "_opcode", "_operator", "_osx_support",
445+
"_overlapped", "_pickle", "_posixshmem", "_posixsubprocess", "_py_abc", "_pydecimal", "_pyio", "_queue", "_random", "_scproxy", J_SHA1, J_SHA2, J_SHA3, "_signal",
442446
"_sitebuiltins", "_socket", "_sqlite3", "_sre", "_ssl", "_stat", "_statistics", "_string", "_strptime", "_struct", "_symtable", "_thread", "_threading_local", "_tkinter",
443447
"_tracemalloc", "_uuid", "_warnings", "_weakref", "_weakrefset", "_winapi", "_zoneinfo", "abc", "aifc", "antigravity", "argparse", "array", "ast", "asynchat", "asyncio",
444448
"asyncore", "atexit", "audioop", "base64", "bdb", "binascii", "binhex", "bisect", "builtins", "bz2", "cProfile", "calendar", "cgi", "cgitb", "chunk", "cmath", "cmd", "code",

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/HashlibModuleBuiltins.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@
4242

4343
import static com.oracle.graal.python.builtins.objects.PNone.NO_VALUE;
4444
import static com.oracle.graal.python.nodes.BuiltinNames.J_HASHLIB;
45+
import static com.oracle.graal.python.nodes.BuiltinNames.J_MD5;
46+
import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA1;
47+
import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA2;
4548
import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA3;
4649
import static com.oracle.graal.python.nodes.BuiltinNames.T_HASHLIB;
4750
import static com.oracle.graal.python.nodes.BuiltinNames.T_SHA3;
@@ -140,12 +143,12 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
140143
"shake_256", "SHAKE256");
141144

142145
private static final String[] DIGEST_ALIASES = new String[]{
143-
"md5", "_md5",
144-
"sha1", "_sha1",
145-
"sha224", "_sha256",
146-
"sha256", "_sha256",
147-
"sha384", "_sha512",
148-
"sha512", "_sha512",
146+
"md5", J_MD5,
147+
"sha1", J_SHA1,
148+
"sha224", J_SHA2,
149+
"sha256", J_SHA2,
150+
"sha384", J_SHA2,
151+
"sha512", J_SHA2,
149152
"sha3_224", J_SHA3,
150153
"sha3_256", J_SHA3,
151154
"sha3_384", J_SHA3,

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha1ModuleBuiltins.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules.hashlib;
4242

43+
import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA1;
44+
4345
import java.util.List;
4446

4547
import com.oracle.graal.python.builtins.Builtin;
@@ -56,7 +58,7 @@
5658
import com.oracle.truffle.api.frame.VirtualFrame;
5759
import com.oracle.truffle.api.nodes.Node;
5860

59-
@CoreFunctions(defineModule = "_sha1")
61+
@CoreFunctions(defineModule = J_SHA1)
6062
public final class Sha1ModuleBuiltins extends PythonBuiltins {
6163
@Override
6264
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules.hashlib;
4242

43+
import static com.oracle.graal.python.nodes.BuiltinNames.J_SHA2;
44+
4345
import java.util.List;
4446

4547
import com.oracle.graal.python.builtins.Builtin;
@@ -56,11 +58,11 @@
5658
import com.oracle.truffle.api.frame.VirtualFrame;
5759
import com.oracle.truffle.api.nodes.Node;
5860

59-
@CoreFunctions(defineModule = "_sha256")
60-
public final class Sha256ModuleBuiltins extends PythonBuiltins {
61+
@CoreFunctions(defineModule = J_SHA2)
62+
public final class Sha2ModuleBuiltins extends PythonBuiltins {
6163
@Override
6264
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
63-
return Sha256ModuleBuiltinsFactory.getFactories();
65+
return Sha2ModuleBuiltinsFactory.getFactories();
6466
}
6567

6668
@Builtin(name = "sha224", minNumOfPositionalArgs = 0, parameterNames = {"string"}, keywordOnlyNames = {"usedforsecurity"})
@@ -84,4 +86,26 @@ static Object newDigest(VirtualFrame frame, Object buffer, @SuppressWarnings("un
8486
return createNode.execute(frame, inliningTarget, PythonBuiltinClassType.SHA256Type, "sha256", "sha256", buffer);
8587
}
8688
}
89+
90+
@Builtin(name = "sha384", minNumOfPositionalArgs = 0, parameterNames = {"string"}, keywordOnlyNames = {"usedforsecurity"})
91+
@GenerateNodeFactory
92+
abstract static class Sha384FunctionNode extends PythonBuiltinNode {
93+
@Specialization
94+
static Object newDigest(VirtualFrame frame, Object buffer, @SuppressWarnings("unused") Object usedForSecurity,
95+
@Bind Node inliningTarget,
96+
@Cached HashlibModuleBuiltins.CreateDigestNode createNode) {
97+
return createNode.execute(frame, inliningTarget, PythonBuiltinClassType.SHA384Type, "sha384", "sha384", buffer);
98+
}
99+
}
100+
101+
@Builtin(name = "sha512", minNumOfPositionalArgs = 0, parameterNames = {"string"}, keywordOnlyNames = {"usedforsecurity"})
102+
@GenerateNodeFactory
103+
abstract static class Sha512FunctionNode extends PythonBuiltinNode {
104+
@Specialization
105+
static Object newDigest(VirtualFrame frame, Object buffer, @SuppressWarnings("unused") Object usedForSecurity,
106+
@Bind Node inliningTarget,
107+
@Cached HashlibModuleBuiltins.CreateDigestNode createNode) {
108+
return createNode.execute(frame, inliningTarget, PythonBuiltinClassType.SHA512Type, "sha512", "sha512", buffer);
109+
}
110+
}
87111
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/hashlib/Sha512ModuleBuiltins.java

Lines changed: 0 additions & 87 deletions
This file was deleted.

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/PythonAbstractObject.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,13 +1264,16 @@ public abstract static class IsImmutable extends Node {
12641264

12651265
@Specialization
12661266
public static boolean isImmutable(Node inliningTarget, Object object,
1267+
@Cached GetObjectSlotsNode getSlotsNode,
12671268
@Cached GetClassNode getClassNode) {
12681269
// TODO(fa) The first condition is too general; we should check if the object's type is
12691270
// 'type'
12701271
if (object instanceof PythonBuiltinClass || object instanceof PythonBuiltinObject || PGuards.isNativeClass(object) || PGuards.isNativeObject(object)) {
12711272
return true;
12721273
} else if (object instanceof PythonClass || object instanceof PythonModule) {
12731274
return false;
1275+
} else if (getSlotsNode.execute(inliningTarget, object).combined_tp_setattro_setattr() != null) {
1276+
return false;
12741277
} else {
12751278
Object klass = getClassNode.execute(inliningTarget, object);
12761279
return klass instanceof PythonBuiltinClassType || klass instanceof PythonBuiltinClass || PGuards.isNativeClass(object);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/BuiltinNames.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,12 @@ public abstract class BuiltinNames {
471471
public static final String J_HASHLIB = "_hashlib";
472472
public static final TruffleString T_HASHLIB = tsLiteral(J_HASHLIB);
473473

474+
public static final String J_MD5 = "_md5";
475+
476+
public static final String J_SHA1 = "_sha1";
477+
478+
public static final String J_SHA2 = "_sha2";
479+
474480
public static final String J_SHA3 = "_sha3";
475481
public static final TruffleString T_SHA3 = tsLiteral(J_SHA3);
476482

0 commit comments

Comments
 (0)