Skip to content

Commit 86391f9

Browse files
committed
[GR-22136] [GR-22252] Fix Python coverage reporting
PullRequest: graalpython/873
2 parents 7579b3c + 3a699a4 commit 86391f9

File tree

4 files changed

+182
-33
lines changed

4 files changed

+182
-33
lines changed

graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ public static void main(String[] args) {
8888
@Override
8989
protected List<String> preprocessArguments(List<String> givenArgs, Map<String, String> polyglotOptions) {
9090
ArrayList<String> unrecognized = new ArrayList<>();
91-
ArrayList<String> inputArgs = new ArrayList<>();
91+
List<String> defaultEnvironmentArgs = getDefaultEnvironmentArgs();
92+
ArrayList<String> inputArgs = new ArrayList<>(defaultEnvironmentArgs);
9293
inputArgs.addAll(givenArgs);
9394
givenArguments = new ArrayList<>(inputArgs);
9495
List<String> arguments = new ArrayList<>(inputArgs);
@@ -308,10 +309,19 @@ private String[] getExecutableList() {
308309
ArrayList<String> exec_list = new ArrayList<>();
309310
sb.append(System.getProperty("java.home")).append(File.separator).append("bin").append(File.separator).append("java");
310311
exec_list.add(sb.toString());
312+
String javaOptions = System.getenv("_JAVA_OPTIONS");
313+
String javaToolOptions = System.getenv("JAVA_TOOL_OPTIONS");
311314
for (String arg : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
312315
if (arg.matches("-Xrunjdwp:transport=dt_socket,server=y,address=\\d+,suspend=y")) {
313316
arg = arg.replace("suspend=y", "suspend=n");
314317
}
318+
if ((javaOptions != null && javaOptions.contains(arg)) || (javaToolOptions != null && javaToolOptions.contains(arg))) {
319+
// both _JAVA_OPTIONS and JAVA_TOOL_OPTIONS are adeed during
320+
// JVM startup automatically. We do not want to repeat these
321+
// for subprocesses, because they should also pick up those
322+
// variables.
323+
continue;
324+
}
315325
exec_list.add(arg);
316326
}
317327
exec_list.add("-classpath");
@@ -576,6 +586,10 @@ protected void printHelp(OptionCategory maxCategory) {
576586
" as specifying the -R option: a random value is used to seed the hashes of\n" +
577587
" str, bytes and datetime objects. It can also be set to an integer\n" +
578588
" in the range [0,4294967295] to get hash values with a predictable seed.\n" +
589+
"GRAAL_PYTHON_ARGS: the value is added as arguments as if passed on the\n" +
590+
" commandline. There is one special case: any `$$' in the value is replaced\n" +
591+
" with the current process id. To pass a literal `$$', you must escape the\n" +
592+
" second `$' like so: `$\\$'\n" +
579593
(wantsExperimental ? "\nArguments specific to the Graal Python launcher:\n" +
580594
"--show-version : print the Python version number and continue.\n" +
581595
"-CC : run the C compiler used for generating GraalPython C extensions.\n" +
@@ -808,6 +822,72 @@ private static final class ExitException extends RuntimeException {
808822
}
809823
}
810824

825+
private static enum State {
826+
NORMAL,
827+
SINGLE_QUOTE,
828+
DOUBLE_QUOTE,
829+
ESCAPE_SINGLE_QUOTE,
830+
ESCAPE_DOUBLE_QUOTE,
831+
}
832+
833+
private static List<String> getDefaultEnvironmentArgs() {
834+
String pid;
835+
if (isAOT()) {
836+
pid = String.valueOf(ProcessProperties.getProcessID());
837+
} else {
838+
pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
839+
}
840+
String envArgsOpt = System.getenv("GRAAL_PYTHON_ARGS");
841+
ArrayList<String> envArgs = new ArrayList<>();
842+
State s = State.NORMAL;
843+
StringBuilder sb = new StringBuilder();
844+
if (envArgsOpt != null) {
845+
for (char x : envArgsOpt.toCharArray()) {
846+
if (s == State.NORMAL && Character.isWhitespace(x)) {
847+
addArgument(pid, envArgs, sb);
848+
} else {
849+
if (x == '"') {
850+
if (s == State.NORMAL) {
851+
s = State.DOUBLE_QUOTE;
852+
} else if (s == State.DOUBLE_QUOTE) {
853+
s = State.NORMAL;
854+
} else if (s == State.ESCAPE_DOUBLE_QUOTE) {
855+
s = State.DOUBLE_QUOTE;
856+
sb.append(x);
857+
}
858+
} else if (x == '\'') {
859+
if (s == State.NORMAL) {
860+
s = State.SINGLE_QUOTE;
861+
} else if (s == State.SINGLE_QUOTE) {
862+
s = State.NORMAL;
863+
} else if (s == State.ESCAPE_SINGLE_QUOTE) {
864+
s = State.SINGLE_QUOTE;
865+
sb.append(x);
866+
}
867+
} else if (x == '\\') {
868+
if (s == State.SINGLE_QUOTE) {
869+
s = State.ESCAPE_SINGLE_QUOTE;
870+
} else if (s == State.DOUBLE_QUOTE) {
871+
s = State.ESCAPE_DOUBLE_QUOTE;
872+
}
873+
} else {
874+
sb.append(x);
875+
}
876+
}
877+
}
878+
addArgument(pid, envArgs, sb);
879+
}
880+
return envArgs;
881+
}
882+
883+
private static void addArgument(String pid, ArrayList<String> envArgs, StringBuilder sb) {
884+
if (sb.length() > 0) {
885+
String arg = sb.toString().replace("$$", pid).replace("\\$", "$");
886+
envArgs.add(arg);
887+
sb.setLength(0);
888+
}
889+
}
890+
811891
private static boolean doEcho(@SuppressWarnings("unused") Context context) {
812892
return true;
813893
}

graalpython/com.oracle.graal.python.test/src/tests/test_iterator.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
1+
# Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
22
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
33
#
44
# The Universal Permissive License (UPL), Version 1.0
@@ -44,14 +44,15 @@ def prints_like_iter(obj):
4444
assert s.startswith("<class '")
4545
assert s.endswith("iterator'>")
4646

47-
def test_iter():
47+
def test_iter_printing_bytes():
4848
bytes_iterator = type(iter(b''))
4949
prints_like_iter(bytes_iterator)
5050
# <class 'bytes_iterator'>
5151

5252
# bytearray_iterator = type(iter(bytearray()))
5353
# print(bytearray_iterator)
5454

55+
def test_iter_printing_dict():
5556
dict_iterator = type(iter({}))
5657
prints_like_iter(dict_iterator)
5758
# <class 'dict_keyiterator'>
@@ -68,13 +69,15 @@ def test_iter():
6869
prints_like_iter(dict_itemiterator)
6970
# <class 'dict_itemiterator'>
7071

72+
def test_iter_printing_list():
7173
list_iterator = type(iter([]))
7274
prints_like_iter(list_iterator)
7375
# <class 'list_iterator'>
7476

7577
# list_reverseiterator = type(iter(reversed([])))
7678
# prints_like_iter(list_reverseiterator)
7779

80+
def test_iter_printing_range():
7881
range_iterator = type(iter(range(0)))
7982
prints_like_iter(range_iterator)
8083
# <class 'range_iterator'>
@@ -83,18 +86,22 @@ def test_iter():
8386
prints_like_iter(longrange_iterator)
8487
# <class 'longrange_iterator'>
8588

89+
def test_iter_printing_set():
8690
set_iterator = type(iter(set()))
8791
prints_like_iter(set_iterator)
8892
# <class 'set_iterator'>
8993

94+
def test_iter_printing_str():
9095
str_iterator = type(iter(""))
9196
prints_like_iter(str_iterator)
9297
# <class 'str_iterator'>
9398

99+
def test_iter_printing_tuple():
94100
tuple_iterator = type(iter(()))
95101
prints_like_iter(tuple_iterator)
96102
# <class 'tuple_iterator'>
97103

104+
def test_iter_printing_zip():
98105
zip_iterator = type(iter(zip()))
99106
assert str(zip_iterator) == "<class 'zip'>"
100107
# <class 'zip'>

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/iterator/PZipBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2019, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2020, Oracle and/or its affiliates.
33
* Copyright (c) 2014, Regents of the University of California
44
*
55
* All rights reserved.
@@ -61,7 +61,7 @@ Object doEmpty(@SuppressWarnings("unused") PZip self) {
6161
throw raise(PythonErrorType.StopIteration);
6262
}
6363

64-
@Specialization
64+
@Specialization(guards = "!isEmpty(self.getIterators())")
6565
Object doNext(VirtualFrame frame, PZip self,
6666
@Cached("create()") GetNextNode next) {
6767
Object[] iterators = self.getIterators();

0 commit comments

Comments
 (0)