Skip to content

Commit efbe0a0

Browse files
committed
[GR-29378] Native implementation of posix.getuid(), getsid(), getppid(), ctermid(), putenv(), execv() and system()
PullRequest: graalpython/1614
2 parents 279c38d + 18b2c4c commit efbe0a0

File tree

11 files changed

+681
-247
lines changed

11 files changed

+681
-247
lines changed

graalpython/com.oracle.graal.python.cext/posix/posix.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
#include <fcntl.h>
5454
#include <stdio.h>
5555
#include <stdint.h>
56+
#include <stdlib.h>
5657
#include <string.h>
5758
#include <sys/ioctl.h>
5859
#include <sys/stat.h>
@@ -467,6 +468,43 @@ int32_t call_kill(int64_t pid, int32_t signal) {
467468
return kill(pid, signal);
468469
}
469470

471+
int64_t call_getuid() {
472+
return getuid();
473+
}
474+
475+
int64_t call_getppid() {
476+
return getppid();
477+
}
478+
479+
int64_t call_getsid(int64_t pid) {
480+
return getsid(pid);
481+
}
482+
483+
int32_t call_ctermid(char *buf) {
484+
return ctermid(buf) == NULL ? -1 : 0;
485+
}
486+
487+
int32_t call_setenv(char *name, char *value, int overwrite) {
488+
return setenv(name, value, overwrite);
489+
}
490+
491+
// See comment in NFiPosixSupport.execv() for the description of arguments
492+
void call_execv(char *data, int64_t *offsets, int32_t offsetsLen) {
493+
// We reuse the memory allocated for offsets to avoid the need to allocate and reliably free another array
494+
char **strings = (char **) offsets;
495+
for (int32_t i = 0; i < offsetsLen; ++i) {
496+
strings[i] = offsets[i] == -1 ? NULL : data + offsets[i];
497+
}
498+
499+
char *pathname = strings[0];
500+
char **argv = strings + 1;
501+
execv(pathname, argv);
502+
}
503+
504+
int32_t call_system(const char *pathname) {
505+
return system(pathname);
506+
}
507+
470508
int32_t get_errno() {
471509
return errno;
472510
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@
100100
*graalpython.lib-python.3.test.test_os.PathTConverterTests.test_path_t_converter
101101
*graalpython.lib-python.3.test.test_os.PathTConverterTests.test_path_t_converter_and_custom_class
102102
*graalpython.lib-python.3.test.test_os.Pep383Tests.test_statvfs
103-
*graalpython.lib-python.3.test.test_os.PidTests.test_getppid
104103
*graalpython.lib-python.3.test.test_os.PidTests.test_waitpid_windows
105104
*graalpython.lib-python.3.test.test_os.PosixUidGidTests.test_setegid
106105
*graalpython.lib-python.3.test.test_os.PosixUidGidTests.test_seteuid
@@ -157,6 +156,8 @@
157156
*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_fstat
158157
*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_fstatvfs
159158
*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_isatty
159+
*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_lseek
160+
*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_read
160161
*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_readv
161162
*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_tcgetpgrp
162163
*graalpython.lib-python.3.test.test_os.TestInvalidFD.test_tcsetpgrpt

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

Lines changed: 254 additions & 177 deletions
Large diffs are not rendered by default.

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

Lines changed: 1 addition & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,19 @@
5555
import com.oracle.graal.python.builtins.Builtin;
5656
import com.oracle.graal.python.builtins.CoreFunctions;
5757
import com.oracle.graal.python.builtins.PythonBuiltins;
58-
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.FspathNode;
58+
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.ObjectToOpaquePathNode;
5959
import com.oracle.graal.python.builtins.modules.PosixSubprocessModuleBuiltinsClinicProviders.NewForkExecNodeClinicProviderGen;
6060
import com.oracle.graal.python.builtins.modules.PosixSubprocessModuleBuiltinsFactory.EnvConversionNodeGen;
6161
import com.oracle.graal.python.builtins.modules.PosixSubprocessModuleBuiltinsFactory.ProcessArgsConversionNodeGen;
6262
import com.oracle.graal.python.builtins.objects.PNone;
6363
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes.ToBytesNode;
64-
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
6564
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetSequenceStorageNode;
6665
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.GetItemNode;
6766
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.LenNode;
6867
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
69-
import com.oracle.graal.python.builtins.objects.str.PString;
7068
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
7169
import com.oracle.graal.python.nodes.ErrorMessages;
7270
import com.oracle.graal.python.nodes.PGuards;
73-
import com.oracle.graal.python.nodes.PNodeWithRaise;
7471
import com.oracle.graal.python.nodes.builtins.ListNodes.FastConstructListNode;
7572
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7673
import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode;
@@ -79,7 +76,6 @@
7976
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
8077
import com.oracle.graal.python.nodes.util.CannotCastException;
8178
import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
82-
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
8379
import com.oracle.graal.python.runtime.PosixSupportLibrary;
8480
import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException;
8581
import com.oracle.graal.python.runtime.PythonContext;
@@ -96,7 +92,6 @@
9692
import com.oracle.truffle.api.dsl.Specialization;
9793
import com.oracle.truffle.api.frame.VirtualFrame;
9894
import com.oracle.truffle.api.library.CachedLibrary;
99-
import com.oracle.truffle.api.nodes.Node;
10095

10196
@CoreFunctions(defineModule = "_posixsubprocess")
10297
public class PosixSubprocessModuleBuiltins extends PythonBuiltins {
@@ -105,61 +100,6 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
105100
return PosixSubprocessModuleBuiltinsFactory.getFactories();
106101
}
107102

108-
/**
109-
* Helper node that accepts either str or bytes and converts it to a representation specific to
110-
* the {@link PosixSupportLibrary} in use. Basically equivalent of
111-
* {@code PyUnicode_EncodeFSDefault}.
112-
*/
113-
abstract static class StringOrBytesToOpaquePathNode extends PNodeWithRaise {
114-
abstract Object execute(Object obj);
115-
116-
@Specialization(limit = "1")
117-
Object doString(String str,
118-
@CachedContext(PythonLanguage.class) PythonContext context,
119-
@CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) {
120-
return checkPath(posixLib.createPathFromString(context.getPosixSupport(), str));
121-
}
122-
123-
@Specialization(limit = "1")
124-
Object doPString(PString pstr,
125-
@Cached CastToJavaStringNode castToJavaStringNode,
126-
@CachedContext(PythonLanguage.class) PythonContext context,
127-
@CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) {
128-
String str = castToJavaStringNode.execute(pstr);
129-
return checkPath(posixLib.createPathFromString(context.getPosixSupport(), str));
130-
}
131-
132-
@Specialization(limit = "1")
133-
Object doBytes(PBytes bytes,
134-
@Cached ToBytesNode toBytesNode,
135-
@CachedContext(PythonLanguage.class) PythonContext context,
136-
@CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib) {
137-
return checkPath(posixLib.createPathFromBytes(context.getPosixSupport(), toBytesNode.execute(bytes)));
138-
}
139-
140-
private Object checkPath(Object path) {
141-
if (path == null) {
142-
throw raise(ValueError, ErrorMessages.EMBEDDED_NULL_BYTE);
143-
}
144-
return path;
145-
}
146-
}
147-
148-
/**
149-
* Similar to {@code PyUnicode_FSConverter}, but the actual conversion is delegated to the
150-
* {@link PosixSupportLibrary} implementation.
151-
*/
152-
abstract static class ObjectToOpaquePathNode extends Node {
153-
abstract Object execute(VirtualFrame frame, Object obj);
154-
155-
@Specialization
156-
Object doIt(VirtualFrame frame, Object obj,
157-
@Cached FspathNode fspathNode,
158-
@Cached StringOrBytesToOpaquePathNode stringOrBytesToOpaquePathNode) {
159-
return stringOrBytesToOpaquePathNode.execute(fspathNode.call(frame, obj));
160-
}
161-
}
162-
163103
/**
164104
* Helper converter which iterates the argv argument and converts each element to the opaque
165105
* path representation used by {@link PosixSupportLibrary}.

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public abstract class ErrorMessages {
6262
public static final String ARG_MUST_BE_STRING_OR_NUMBER = "%s argument must be a string or a number, not '%p'";
6363
public static final String ARG_MUST_BE_UNICODE = "%s argument %d must be a unicode character, not %p";
6464
public static final String ARG_MUST_NOT_BE_ZERO = "%s arg %d must not be zero";
65+
public static final String ARG_MUST_NOT_BE_EMPTY = "%s arg %d must not be empty";
6566
public static final String ARG_NOT_IN_RANGE = "%s arg not in range(%s)";
6667
public static final String ARG_SHOULD_BE_INT_BYTESLIKE_OBJ = "argument should be integer or bytes-like object, not '%p'";
6768
public static final String ARG_SHOULD_BE_INT_OR_NONE = "argument should be integer or None, not %p";
@@ -293,6 +294,7 @@ public abstract class ErrorMessages {
293294
public static final String IF_YOU_GIVE_ONLY_ONE_ARG_TO_DICT = "if you give only one argument to maketrans it must be a dict";
294295
public static final String INVALID_INDEXING_OF_0_DIM_MEMORY = "invalid indexing of 0-dim memory";
295296
public static final String ILLEGAL_ARG = "illegal argument";
297+
public static final String ILLEGAL_ENVIRONMENT_VARIABLE_NAME = "illegal environment variable name";
296298
public static final String ILLEGAL_EXPRESSION_FOR_AUGMENTED_ASSIGNEMNT = "illegal expression for augmented assignment";
297299
public static final String ILLEGAL_IP_STRING_PASSED_TO = "illegal IP address string passed to %s";
298300
public static final String ILLEGAL_SOCKET_ADDR_ARG = "%s: illegal sockaddr argument";

0 commit comments

Comments
 (0)