Skip to content

Commit 89d811f

Browse files
committed
[GR-12307] Support the "input" builtin
PullRequest: graalpython/258
2 parents e9ab5c4 + 1de07a4 commit 89d811f

File tree

5 files changed

+55
-6
lines changed

5 files changed

+55
-6
lines changed

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@ public abstract class ConsoleHandler {
6363
/**
6464
* Read a line of input, newline is <b>NOT</b> included in result.
6565
*/
66-
public abstract String readLine();
66+
public final String readLine() {
67+
return readLine(true);
68+
}
69+
70+
public abstract String readLine(boolean prompt);
6771

6872
public abstract void setPrompt(String prompt);
6973

@@ -90,7 +94,7 @@ public InputStream createInputStream() {
9094
public int read() throws IOException {
9195
if (buffer == null) {
9296
pos = 0;
93-
String line = readLine();
97+
String line = readLine(false);
9498
if (line == null) {
9599
return -1;
96100
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ public DefaultConsoleHandler(InputStream in, OutputStream out) {
5959
}
6060

6161
@Override
62-
public String readLine() {
62+
public String readLine(boolean showPrompt) {
6363
try {
64-
if (prompt != null) {
64+
if (prompt != null && showPrompt) {
6565
out.print(prompt);
6666
}
6767
return in.readLine();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,10 @@ public void setContext(Context context) {
237237
}
238238

239239
@Override
240-
public String readLine() {
240+
public String readLine(boolean showPrompt) {
241241
try {
242242
console.getTerminal().init();
243-
return console.readLine();
243+
return console.readLine(showPrompt ? console.getPrompt() : "");
244244
} catch (UserInterruptException e) {
245245
throw e;
246246
} catch (Exception ex) {

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,18 @@
6868
import static com.oracle.graal.python.runtime.exception.PythonErrorType.ValueError;
6969

7070
import java.io.IOException;
71+
import java.io.InputStream;
72+
import java.io.PrintStream;
7173
import java.io.PrintWriter;
7274
import java.math.BigInteger;
75+
import java.nio.CharBuffer;
7376
import java.util.List;
7477
import java.util.function.Supplier;
7578

7679
import com.oracle.graal.python.PythonLanguage;
7780
import com.oracle.graal.python.builtins.Builtin;
7881
import com.oracle.graal.python.builtins.CoreFunctions;
82+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
7983
import com.oracle.graal.python.builtins.PythonBuiltins;
8084
import com.oracle.graal.python.builtins.modules.BuiltinFunctionsFactory.GetAttrNodeFactory;
8185
import com.oracle.graal.python.builtins.modules.BuiltinFunctionsFactory.NextNodeFactory;
@@ -1535,4 +1539,44 @@ public Object doit(Object object) {
15351539
return "truffle ast dump not supported for " + object.toString();
15361540
}
15371541
}
1542+
1543+
@Builtin(name = "input", keywordArguments = {"prompt"})
1544+
@GenerateNodeFactory
1545+
abstract static class InputNode extends PythonUnaryBuiltinNode {
1546+
@Specialization
1547+
@TruffleBoundary
1548+
String input(@SuppressWarnings("unused") PNone prompt) {
1549+
CharBuffer buf = CharBuffer.allocate(1000);
1550+
try {
1551+
InputStream stdin = getContext().getStandardIn();
1552+
int read = stdin.read();
1553+
while (read != -1 && read != '\n') {
1554+
if (buf.remaining() == 0) {
1555+
CharBuffer newBuf = CharBuffer.allocate(buf.capacity() * 2);
1556+
newBuf.put(buf);
1557+
buf = newBuf;
1558+
}
1559+
buf.put((char) read);
1560+
read = stdin.read();
1561+
}
1562+
buf.limit(buf.position());
1563+
buf.rewind();
1564+
return buf.toString();
1565+
} catch (IOException e) {
1566+
throw raise(PythonBuiltinClassType.EOFError, e.getMessage());
1567+
}
1568+
}
1569+
1570+
@Specialization
1571+
String inputPrompt(PString prompt) {
1572+
return inputPrompt(prompt.getValue());
1573+
}
1574+
1575+
@Specialization
1576+
@TruffleBoundary
1577+
String inputPrompt(String prompt) {
1578+
new PrintStream(getContext().getStandardOut()).println(prompt);
1579+
return input(null);
1580+
}
1581+
}
15381582
}

mx.graalpython/mx_graalpython.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ def graalpython_gate_runner(args, tasks):
432432
version="1fc0e86a54cbe090d36f262c062d8f4eee8f2e6d",
433433
urlinfos=[mx.SuiteImportURLInfo(mx_urlrewrites.rewriteurl(apprepo), "git", mx.vc_system("git"))]
434434
)
435+
mx.log(" ".join(["Running", "mx"] + ["-p", _apptest_suite.dir, "graalpython-apptests"]))
435436
mx.run_mx(["-p", _apptest_suite.dir, "graalpython-apptests"])
436437

437438
with Task('GraalPython license header update', tasks, tags=[GraalPythonTags.license]) as task:

0 commit comments

Comments
 (0)