Skip to content

Commit 41a821e

Browse files
committed
[GR-13793] [GH-52] Various fixes for textfsm package
PullRequest: graalpython/399
2 parents d81fbc3 + da5dddb commit 41a821e

File tree

8 files changed

+163
-11
lines changed

8 files changed

+163
-11
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ protected List<String> preprocessArguments(List<String> givenArgs, Map<String, S
158158
case "-LLI":
159159
runLLI = true;
160160
break;
161+
case "-debug-java":
162+
if (!isAOT()) {
163+
subprocessArgs.add("Xrunjdwp:transport=dt_socket,server=y,address=8000,suspend=y");
164+
inputArgs.remove("-debug-java");
165+
}
166+
break;
161167
case "-debug-perf":
162168
subprocessArgs.add("Dgraal.TraceTruffleCompilation=true");
163169
subprocessArgs.add("Dgraal.TraceTrufflePerformanceWarnings=true");
@@ -739,7 +745,7 @@ static List<String> getCmdline(List<String> args, List<String> subProcessDefs) {
739745
cmd.add("-cp");
740746
cmd.add(ManagementFactory.getRuntimeMXBean().getClassPath());
741747
for (String subProcArg : subProcessDefs) {
742-
assert subProcArg.startsWith("D");
748+
assert subProcArg.startsWith("D") || subProcArg.startsWith("X");
743749
cmd.add("-" + subProcArg);
744750
}
745751
cmd.add(GraalPythonMain.class.getName());

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import com.oracle.graal.python.builtins.modules.CtypesModuleBuiltins;
5858
import com.oracle.graal.python.builtins.modules.ErrnoModuleBuiltins;
5959
import com.oracle.graal.python.builtins.modules.FaulthandlerModuleBuiltins;
60+
import com.oracle.graal.python.builtins.modules.FcntlModuleBuiltins;
6061
import com.oracle.graal.python.builtins.modules.FunctoolsModuleBuiltins;
6162
import com.oracle.graal.python.builtins.modules.GcModuleBuiltins;
6263
import com.oracle.graal.python.builtins.modules.IOModuleBuiltins;
@@ -329,7 +330,8 @@ private static final PythonBuiltins[] initializeBuiltins(Env env) {
329330
new ZipImporterBuiltins(),
330331
new ZipImportModuleBuiltins(),
331332
new ZLibModuleBuiltins(),
332-
new MMapModuleBuiltins()));
333+
new MMapModuleBuiltins(),
334+
new FcntlModuleBuiltins()));
333335
if (!TruffleOptions.AOT) {
334336
ServiceLoader<PythonBuiltins> providers = ServiceLoader.load(PythonBuiltins.class);
335337
for (PythonBuiltins builtin : providers) {

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

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import static com.oracle.graal.python.builtins.objects.PNotImplemented.NOT_IMPLEMENTED;
3030
import static com.oracle.graal.python.nodes.BuiltinNames.ABS;
3131
import static com.oracle.graal.python.nodes.BuiltinNames.BIN;
32+
import static com.oracle.graal.python.nodes.BuiltinNames.BREAKPOINT;
33+
import static com.oracle.graal.python.nodes.BuiltinNames.BREAKPOINTHOOK;
3234
import static com.oracle.graal.python.nodes.BuiltinNames.CALLABLE;
3335
import static com.oracle.graal.python.nodes.BuiltinNames.CHR;
3436
import static com.oracle.graal.python.nodes.BuiltinNames.COMPILE;
@@ -39,6 +41,7 @@
3941
import static com.oracle.graal.python.nodes.BuiltinNames.EXEC;
4042
import static com.oracle.graal.python.nodes.BuiltinNames.GETATTR;
4143
import static com.oracle.graal.python.nodes.BuiltinNames.HASH;
44+
import static com.oracle.graal.python.nodes.BuiltinNames.HEX;
4245
import static com.oracle.graal.python.nodes.BuiltinNames.ID;
4346
import static com.oracle.graal.python.nodes.BuiltinNames.ISINSTANCE;
4447
import static com.oracle.graal.python.nodes.BuiltinNames.ISSUBCLASS;
@@ -55,8 +58,6 @@
5558
import static com.oracle.graal.python.nodes.BuiltinNames.ROUND;
5659
import static com.oracle.graal.python.nodes.BuiltinNames.SETATTR;
5760
import static com.oracle.graal.python.nodes.BuiltinNames.SUM;
58-
import static com.oracle.graal.python.nodes.BuiltinNames.BREAKPOINT;
59-
import static com.oracle.graal.python.nodes.BuiltinNames.BREAKPOINTHOOK;
6061
import static com.oracle.graal.python.nodes.BuiltinNames.__BUILTIN__;
6162
import static com.oracle.graal.python.nodes.BuiltinNames.__DEBUG__;
6263
import static com.oracle.graal.python.nodes.BuiltinNames.__DUMP_TRUFFLE_AST__;
@@ -170,8 +171,8 @@
170171
import com.oracle.truffle.api.CompilerDirectives;
171172
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
172173
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
173-
import com.oracle.truffle.api.debug.Debugger;
174174
import com.oracle.truffle.api.Truffle;
175+
import com.oracle.truffle.api.debug.Debugger;
175176
import com.oracle.truffle.api.dsl.Cached;
176177
import com.oracle.truffle.api.dsl.Fallback;
177178
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
@@ -351,6 +352,60 @@ protected static OctNode create() {
351352
}
352353
}
353354

355+
// hex(object)
356+
@Builtin(name = HEX, fixedNumOfPositionalArgs = 1)
357+
@TypeSystemReference(PythonArithmeticTypes.class)
358+
@GenerateNodeFactory
359+
public abstract static class HexNode extends PythonUnaryBuiltinNode {
360+
361+
public abstract String executeObject(Object x);
362+
363+
@TruffleBoundary
364+
private static String buildString(boolean isNegative, String number) {
365+
StringBuilder sb = new StringBuilder();
366+
if (isNegative) {
367+
sb.append('-');
368+
}
369+
sb.append("0x");
370+
sb.append(number);
371+
return sb.toString();
372+
}
373+
374+
@Specialization
375+
public String doL(long x) {
376+
return buildString(x < 0, longToHexString(x));
377+
}
378+
379+
@TruffleBoundary
380+
private static String longToHexString(long x) {
381+
return Long.toHexString(Math.abs(x));
382+
}
383+
384+
@Specialization
385+
public String doD(double x) {
386+
throw raise(TypeError, "'%p' object cannot be interpreted as an integer", x);
387+
}
388+
389+
@Specialization
390+
@TruffleBoundary
391+
public String doPI(PInt x) {
392+
BigInteger value = x.getValue();
393+
return buildString(value.compareTo(BigInteger.ZERO) == -1, value.abs().toString(8));
394+
}
395+
396+
@Specialization
397+
public String doO(Object x,
398+
@Cached("create()") CastToIntegerFromIndexNode toIntNode,
399+
@Cached("create()") HexNode recursiveNode) {
400+
Object value = toIntNode.execute(x);
401+
return recursiveNode.executeObject(value);
402+
}
403+
404+
protected static HexNode create() {
405+
return BuiltinFunctionsFactory.HexNodeFactory.create();
406+
}
407+
}
408+
354409
// callable(object)
355410
@Builtin(name = CALLABLE, fixedNumOfPositionalArgs = 1)
356411
@GenerateNodeFactory
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* The Universal Permissive License (UPL), Version 1.0
6+
*
7+
* Subject to the condition set forth below, permission is hereby granted to any
8+
* person obtaining a copy of this software, associated documentation and/or
9+
* data (collectively the "Software"), free of charge and under any and all
10+
* copyright rights in the Software, and any and all patent rights owned or
11+
* freely licensable by each licensor hereunder covering either (i) the
12+
* unmodified Software as contributed to or provided by such licensor, or (ii)
13+
* the Larger Works (as defined below), to deal in both
14+
*
15+
* (a) the Software, and
16+
*
17+
* (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
18+
* one is included with the Software each a "Larger Work" to which the Software
19+
* is contributed by such licensors),
20+
*
21+
* without restriction, including without limitation the rights to copy, create
22+
* derivative works of, display, perform, and distribute the Software and make,
23+
* use, sell, offer for sale, import, export, have made, and have sold the
24+
* Software and the Larger Work(s), and to sublicense the foregoing rights on
25+
* either these or other terms.
26+
*
27+
* This license is subject to the following condition:
28+
*
29+
* The above copyright notice and either this complete permission notice or at a
30+
* minimum a reference to the UPL must be included in all copies or substantial
31+
* portions of the Software.
32+
*
33+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
34+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
35+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
36+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
37+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
38+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
39+
* SOFTWARE.
40+
*/
41+
package com.oracle.graal.python.builtins.modules;
42+
43+
import java.util.ArrayList;
44+
import java.util.List;
45+
46+
import com.oracle.graal.python.builtins.CoreFunctions;
47+
import com.oracle.graal.python.builtins.PythonBuiltins;
48+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
49+
import com.oracle.truffle.api.dsl.NodeFactory;
50+
51+
@CoreFunctions(defineModule = "fcntl")
52+
public class FcntlModuleBuiltins extends PythonBuiltins {
53+
@Override
54+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
55+
return new ArrayList<>();
56+
}
57+
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1863,4 +1863,13 @@ String getStrError(int errno) {
18631863
return result;
18641864
}
18651865
}
1866+
1867+
@Builtin(name = "ctermid", fixedNumOfPositionalArgs = 0)
1868+
@GenerateNodeFactory
1869+
abstract static class CtermId extends PythonBuiltinNode {
1870+
@Specialization
1871+
String ctermid() {
1872+
return "/dev/tty";
1873+
}
1874+
}
18661875
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,10 +1291,10 @@ private PList rsplitfields(String s, int maxsplit) {
12911291
}
12921292

12931293
// str.splitlines([keepends])
1294-
@Builtin(name = "splitlines", minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2)
1294+
@Builtin(name = "splitlines", fixedNumOfPositionalArgs = 1, keywordArguments = {"keepends"})
12951295
@GenerateNodeFactory
12961296
@TypeSystemReference(PythonArithmeticTypes.class)
1297-
public abstract static class SplitLinesNode extends PythonBuiltinNode {
1297+
public abstract static class SplitLinesNode extends PythonBinaryBuiltinNode {
12981298
@Child private ListAppendNode appendNode = ListAppendNode.create();
12991299
@Child private CastToBooleanNode keepEndsNode = CastToBooleanNode.createIfTrueNode();
13001300

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeBuiltins.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,14 @@ protected Object doItUnboxed(VirtualFrame frame, @SuppressWarnings("unused") PNo
219219
@Specialization(replaces = "doItUnboxed")
220220
protected Object doItUnboxedIndirect(VirtualFrame frame, @SuppressWarnings("unused") PNone noSelf, Object[] arguments, PKeyword[] keywords) {
221221
Object self = arguments[0];
222-
return op(frame, (PythonAbstractClass) self, arguments, keywords, false);
222+
if (PGuards.isClass(self)) {
223+
return op(frame, (PythonAbstractClass) self, arguments, keywords, false);
224+
} else if (self instanceof PythonBuiltinClassType) {
225+
PythonBuiltinClass actual = getBuiltinPythonClass((PythonBuiltinClassType) self);
226+
return op(frame, actual, arguments, keywords, false);
227+
} else {
228+
throw raise(TypeError, "descriptor '__call__' requires a 'type' object but received a '%p'", self);
229+
}
223230
}
224231

225232
@Specialization(limit = "getCallSiteInlineCacheMaxDepth()", guards = {"self == cachedSelf"})
@@ -869,4 +876,15 @@ Object setNative(@SuppressWarnings("unused") PythonAbstractNativeObject cls, @Su
869876
throw raise(PythonErrorType.RuntimeError, "can't set attributes of native type");
870877
}
871878
}
879+
880+
@Builtin(name = "__flags__", fixedNumOfPositionalArgs = 1, isGetter = true)
881+
@GenerateNodeFactory
882+
static abstract class FlagsNode extends PythonUnaryBuiltinNode {
883+
@Child TypeNodes.GetTypeFlagsNode getFlagsNode = TypeNodes.GetTypeFlagsNode.create();
884+
885+
@Specialization
886+
Object flags(PythonAbstractClass self) {
887+
return getFlagsNode.execute(self);
888+
}
889+
}
872890
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeNodes.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
public abstract class TypeNodes {
103103

104104
public abstract static class GetTypeFlagsNode extends PNodeWithContext {
105+
private static final int HEAPTYPE = 1 << 9;
105106

106107
public abstract long execute(PythonAbstractClass clazz);
107108

@@ -113,7 +114,7 @@ long doInitialized(PythonManagedClass clazz) {
113114
@Specialization
114115
long doGeneric(PythonManagedClass clazz) {
115116
if (!isInitialized(clazz)) {
116-
return getValue(clazz.getFlagsContainer());
117+
return getValue(clazz, clazz.getFlagsContainer());
117118
}
118119
return clazz.getFlagsContainer().flags;
119120
}
@@ -125,12 +126,16 @@ long doNative(PythonNativeClass clazz,
125126
}
126127

127128
@TruffleBoundary
128-
private static long getValue(FlagsContainer fc) {
129+
private static long getValue(PythonManagedClass clazz, FlagsContainer fc) {
129130
// This method is only called from C code, i.e., the flags of the initial super class
130131
// must be available.
131132
if (fc.initialDominantBase != null) {
132133
fc.flags = doSlowPath(fc.initialDominantBase);
133134
fc.initialDominantBase = null;
135+
if (clazz instanceof PythonClass) {
136+
// user classes are heap types
137+
fc.flags |= HEAPTYPE;
138+
}
134139
}
135140
return fc.flags;
136141
}
@@ -142,7 +147,7 @@ public static long doSlowPath(PythonAbstractClass clazz) {
142147
if (isInitialized(mclazz)) {
143148
return mclazz.getFlagsContainer().flags;
144149
} else {
145-
return getValue(mclazz.getFlagsContainer());
150+
return getValue(mclazz, mclazz.getFlagsContainer());
146151
}
147152
} else if (PGuards.isNativeClass(clazz)) {
148153
return doNativeGeneric((PythonNativeClass) clazz, createReadNode());

0 commit comments

Comments
 (0)