Skip to content

Commit 67b9cfb

Browse files
author
Franziska Geiger
committed
Implementation of os.environ support at os.execv
1 parent 21ff9f4 commit 67b9cfb

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

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

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltinsFactory.ConvertPathlikeObjectNodeGen;
101101
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltinsFactory.StatNodeFactory;
102102
import com.oracle.graal.python.builtins.objects.PNone;
103+
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
103104
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes.ToBytesNode;
104105
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
105106
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
@@ -288,34 +289,36 @@ public void postInitialize(PythonCore core) {
288289
((PDict) environAttr).setDictStorage(environ.getDictStorage());
289290
}
290291

291-
@Builtin(name = "execv", minNumOfPositionalArgs = 2)
292+
@Builtin(name = "execv", minNumOfPositionalArgs = 3, declaresExplicitSelf = true)
292293
@GenerateNodeFactory
293294
public abstract static class ExecvNode extends PythonBuiltinNode {
294295

296+
@Child private BytesNodes.ToBytesNode toBytes = BytesNodes.ToBytesNode.create();
297+
295298
@Specialization
296-
Object execute(String path, PList args) {
297-
return doExecute(path, args);
299+
Object execute(PythonModule thisModule, String path, PList args) {
300+
return doExecute(thisModule, path, args);
298301
}
299302

300303
@Specialization
301-
Object execute(PString path, PTuple args) {
302-
return execute(path.getValue(), args);
304+
Object execute(PythonModule thisModule, PString path, PTuple args) {
305+
return execute(thisModule, path.getValue(), args);
303306
}
304307

305308
@Specialization
306-
Object execute(String path, PTuple args) {
309+
Object execute(PythonModule thisModule, String path, PTuple args) {
307310
// in case of execl the PList happens to be in the tuples first entry
308311
Object list = GetItemDynamicNode.getUncached().execute(args.getSequenceStorage(), 0);
309-
return doExecute(path, list instanceof PList ? (PList) list : args);
312+
return doExecute(thisModule, path, list instanceof PList ? (PList) list : args);
310313
}
311314

312315
@Specialization
313-
Object execute(PString path, PList args) {
314-
return doExecute(path.getValue(), args);
316+
Object execute(PythonModule thisModule, PString path, PList args) {
317+
return doExecute(thisModule, path.getValue(), args);
315318
}
316319

317320
@TruffleBoundary
318-
Object doExecute(String path, PSequence args) {
321+
Object doExecute(PythonModule thisModule, String path, PSequence args) {
319322
try {
320323
if (!getContext().isExecutableAccessAllowed()) {
321324
throw raise(OSError, "executable access denied");
@@ -328,22 +331,25 @@ Object doExecute(String path, PSequence args) {
328331
for (int i = 0; i < size; i++) {
329332
cmd[i] = GetItemDynamicNode.getUncached().execute(args.getSequenceStorage(), i).toString();
330333
}
331-
Runtime rt = Runtime.getRuntime();
332-
Process pr = rt.exec(cmd);
334+
PDict environ = (PDict) thisModule.getAttribute("environ");
335+
ProcessBuilder builder = new ProcessBuilder(cmd);
336+
Map<String, String> environment = builder.environment();
337+
environ.entries().forEach(entry -> {
338+
environment.put(new String(toBytes.execute(null, (PBytes) entry.key)), new String(toBytes.execute(null, (PBytes) entry.value)));
339+
});
340+
Process pr = builder.start();
333341
// retrieve output from executed script
334342
BufferedReader bfr = new BufferedReader(new InputStreamReader(pr.getInputStream()));
335343
OutputStream stream = getContext().getEnv().out();
336344
String line = "";
337345
while ((line = bfr.readLine()) != null) {
338346
stream.write(line.getBytes());
339347
}
340-
341348
try {
342349
pr.waitFor();
343350
} catch (InterruptedException e) {
344351
throw new IOException(e);
345352
}
346-
347353
throw new PythonExitException(this, pr.exitValue());
348354
} catch (IOException e) {
349355
throw raise(PythonErrorType.ValueError, "Could not execute script '%s'", e.getMessage());
@@ -362,7 +368,6 @@ String cwd() {
362368
return "";
363369
}
364370
}
365-
366371
}
367372

368373
@Builtin(name = "chdir", minNumOfPositionalArgs = 1)

0 commit comments

Comments
 (0)