diff --git a/docs/user/Embedding-Permissions.md b/docs/user/Embedding-Permissions.md index 161b7404d4..ff68c0bb2d 100644 --- a/docs/user/Embedding-Permissions.md +++ b/docs/user/Embedding-Permissions.md @@ -76,10 +76,12 @@ The Java backend's state is disconnected from the actual OS state: - **File access checks:** `os.access()` and functionality based on the `faccessat` POSIX function do not support: - Effective IDs - `follow_symlinks=False` unless the mode is only `F_OK` +- **select.select:** Temporarily sets file descriptors to non-blocking mode which could affect other threads. +- **select.poll:** Temporarily sets file descriptors to non-blocking mode which could affect other threads. Only supports `POLLIN` and `POLLOUT` events. EOF is reported as `POLLIN`/`POLLOUT`. ## Context Security Configuration -When embedding GraalPy using the Polyglot API, you can configure security and access permissions through the `Context.Builder` class. +When embedding GraalPy using the Polyglot API, you can configure security and access permissions through the `Context.Builder` class. These settings control what system resources and host functionality your embedded Python code can access. This table shows the common security methods: diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/PatternBuiltins.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/PatternBuiltins.java index 0c0836a211..7d0f041dc5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/PatternBuiltins.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/re/PatternBuiltins.java @@ -868,13 +868,13 @@ abstract Object execute(Node inliningTarget, Object compiledRegex, Object compil @Specialization(guards = "groupCount == 1") static Object count1(Node inliningTarget, Object compiledRegex, Object compiledRegexMustAdvance, TruffleString input, int pos, int endpos, boolean binary, int groupCount, @Cached @Exclusive FindAllInnerNode3 innerNode) { - return innerNode.execute(inliningTarget, compiledRegex, compiledRegexMustAdvance, input, pos, endpos, binary, groupCount, false); + return innerNode.execute(inliningTarget, compiledRegex, compiledRegexMustAdvance, input, pos, endpos, binary, 1, false); } @Specialization(guards = "groupCount == 2") static Object count2(Node inliningTarget, Object compiledRegex, Object compiledRegexMustAdvance, TruffleString input, int pos, int endpos, boolean binary, int groupCount, @Cached @Exclusive FindAllInnerNode3 innerNode) { - return innerNode.execute(inliningTarget, compiledRegex, compiledRegexMustAdvance, input, pos, endpos, binary, groupCount, false); + return innerNode.execute(inliningTarget, compiledRegex, compiledRegexMustAdvance, input, pos, endpos, binary, 2, false); } @Specialization(guards = "groupCount > 2") diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java index f65751169a..a79e2f1a80 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonOptions.java @@ -288,6 +288,9 @@ private PythonOptions() { @EngineOption @Option(category = OptionCategory.EXPERT, usageSyntax = "", help = "") // public static final OptionKey NodeRecursionLimit = new OptionKey<>(1); + @EngineOption @Option(category = OptionCategory.EXPERT, usageSyntax = "", help = "") // + public static final OptionKey MaxTypeInvalidationCount = new OptionKey<>(3); + @Option(category = OptionCategory.EXPERT, usageSyntax = "true|false", help = "Force to automatically import site.py module.", stability = OptionStability.STABLE) // public static final OptionKey ForceImportSite = new OptionKey<>(false); diff --git a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/MroSequenceStorage.java b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/MroSequenceStorage.java index f162e20458..a7005102a5 100644 --- a/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/MroSequenceStorage.java +++ b/graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/sequence/storage/MroSequenceStorage.java @@ -43,7 +43,9 @@ import java.util.HashMap; import java.util.Map; +import com.oracle.graal.python.PythonLanguage; import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass; +import com.oracle.graal.python.runtime.PythonOptions; import com.oracle.graal.python.util.PythonUtils; import com.oracle.truffle.api.Assumption; import com.oracle.truffle.api.CompilerAsserts; @@ -53,7 +55,6 @@ import com.oracle.truffle.api.Truffle; import com.oracle.truffle.api.dsl.NonIdempotent; import com.oracle.truffle.api.strings.TruffleString; -import com.oracle.truffle.api.utilities.CyclicAssumption; import com.oracle.truffle.api.utilities.TruffleWeakReference; public final class MroSequenceStorage extends ArrayBasedSequenceStorage { @@ -62,7 +63,8 @@ public final class MroSequenceStorage extends ArrayBasedSequenceStorage { /** * This assumption will be invalidated whenever the mro changes. */ - private final CyclicAssumption lookupStableAssumption; + private Assumption lookupStableAssumption; + private int lookupStableAssumptionInvalidations; /** * These assumptions will be invalidated whenever the value of the given slot changes. All @@ -123,7 +125,7 @@ public MroSequenceStorage(TruffleString className, PythonAbstractClass[] element this.values = elements; this.capacity = elements.length; this.length = elements.length; - this.lookupStableAssumption = new CyclicAssumption(className.toJavaStringUncached()); + this.lookupStableAssumption = createLookupStableAssumption(); this.attributesInMROFinalAssumptions = new HashMap<>(); } @@ -133,7 +135,7 @@ public MroSequenceStorage(TruffleString className, int capacity) { this.values = new PythonAbstractClass[capacity]; this.capacity = capacity; this.length = 0; - this.lookupStableAssumption = new CyclicAssumption(className.toJavaStringUncached()); + this.lookupStableAssumption = createLookupStableAssumption(); this.attributesInMROFinalAssumptions = new HashMap<>(); } @@ -186,7 +188,7 @@ public StorageType getElementType() { } public Assumption getLookupStableAssumption() { - return lookupStableAssumption.getAssumption(); + return lookupStableAssumption; } public FinalAttributeAssumptionPair getFinalAttributeAssumption(TruffleString name) { @@ -221,7 +223,19 @@ public void lookupChanged() { assumptionPair.invalidate(); } } - lookupStableAssumption.invalidate(); + if (lookupStableAssumption != Assumption.NEVER_VALID) { + lookupStableAssumption.invalidate(); + if (lookupStableAssumptionInvalidations < PythonLanguage.get(null).getEngineOption(PythonOptions.MaxTypeInvalidationCount)) { + lookupStableAssumption = createLookupStableAssumption(); + lookupStableAssumptionInvalidations++; + } else { + lookupStableAssumption = Assumption.NEVER_VALID; + } + } + } + + private Assumption createLookupStableAssumption() { + return Truffle.getRuntime().createAssumption(className.toJavaStringUncached()); } public NativeSequenceStorage getNativeMirror() {