Skip to content

Commit 7e383a0

Browse files
committed
[GR-12767] enhancements / helpers to get spark to work with PFunction
PullRequest: graalpython/331
2 parents a59656e + dd41cf8 commit 7e383a0

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/FunctionBuiltins.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__DEFAULTS__;
3030
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__KWDEFAULTS__;
3131
import static com.oracle.graal.python.nodes.SpecialAttributeNames.__NAME__;
32+
import static com.oracle.graal.python.nodes.SpecialMethodNames.TRUFFLE_SOURCE;
3233
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REDUCE__;
3334
import static com.oracle.graal.python.nodes.SpecialMethodNames.__REPR__;
3435
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
@@ -43,6 +44,7 @@
4344
import com.oracle.graal.python.builtins.objects.PNone;
4445
import com.oracle.graal.python.builtins.objects.function.FunctionBuiltinsFactory.GetFunctionDefaultsNodeFactory;
4546
import com.oracle.graal.python.builtins.objects.function.FunctionBuiltinsFactory.GetFunctionKeywordDefaultsNodeFactory;
47+
import com.oracle.graal.python.builtins.objects.method.PMethod;
4648
import com.oracle.graal.python.builtins.objects.str.PString;
4749
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
4850
import com.oracle.graal.python.nodes.argument.ReadKeywordNode;
@@ -234,4 +236,34 @@ Object doGeneric(@SuppressWarnings("unused") Object obj) {
234236
}
235237
}
236238

239+
@Builtin(name = TRUFFLE_SOURCE, fixedNumOfPositionalArgs = 1, isGetter = true)
240+
@GenerateNodeFactory
241+
public abstract static class GetFunctionSourceNode extends PythonUnaryBuiltinNode {
242+
@Specialization
243+
Object doFunction(PFunction function) {
244+
String sourceCode = function.getSourceCode();
245+
if (sourceCode != null) {
246+
return sourceCode;
247+
}
248+
return PNone.NONE;
249+
}
250+
251+
@Specialization
252+
Object doMethod(PMethod method) {
253+
Object function = method.getFunction();
254+
if (function instanceof PFunction) {
255+
String sourceCode = ((PFunction) function).getSourceCode();
256+
if (sourceCode != null) {
257+
return sourceCode;
258+
}
259+
}
260+
return PNone.NONE;
261+
}
262+
263+
@Fallback
264+
Object doGeneric(Object object) {
265+
throw raise(TypeError, "getting the source is not supported for '%p'", object);
266+
}
267+
}
268+
237269
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/function/PFunction.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.oracle.truffle.api.RootCallTarget;
3939
import com.oracle.truffle.api.nodes.RootNode;
4040
import com.oracle.truffle.api.object.DynamicObject;
41+
import com.oracle.truffle.api.source.SourceSection;
4142

4243
public class PFunction extends PythonObject {
4344

@@ -140,4 +141,13 @@ public Object[] getDefaults() {
140141
public void setDefaults(Object[] defaults) {
141142
this.defaults = defaults;
142143
}
144+
145+
@TruffleBoundary
146+
public String getSourceCode() {
147+
SourceSection sourceSection = callTarget.getRootNode().getSourceSection();
148+
if (sourceSection != null) {
149+
return sourceSection.getCharacters().toString();
150+
}
151+
return null;
152+
}
143153
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,5 @@ public abstract class SpecialMethodNames {
161161
public static final String DECODE = "decode";
162162

163163
public static final String RICHCMP = "__truffle_richcompare__";
164+
public static final String TRUFFLE_SOURCE = "__truffle_source__";
164165
}

0 commit comments

Comments
 (0)