annotate truffle/com.oracle.truffle.sl/src/com/oracle/truffle/sl/builtins/SLStackTraceBuiltin.java @ 21997:c07e64ecb528

Update SL copyright headers to use UPL
author Gilles Duboscq <gilles.m.duboscq@oracle.com>
date Thu, 16 Jul 2015 15:50:46 +0200
parents b2d1c8ff592a
children 503529c65456
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15064
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
1 /*
21997
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
15064
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
4 *
21997
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
5 * The Universal Permissive License (UPL), Version 1.0
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
6 *
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
7 * Subject to the condition set forth below, permission is hereby granted to any
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
8 * person obtaining a copy of this software, associated documentation and/or
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
9 * data (collectively the "Software"), free of charge and under any and all
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
10 * copyright rights in the Software, and any and all patent rights owned or
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
11 * freely licensable by each licensor hereunder covering either (i) the
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
12 * unmodified Software as contributed to or provided by such licensor, or (ii)
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
13 * the Larger Works (as defined below), to deal in both
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
14 *
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
15 * (a) the Software, and
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
16 *
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
17 * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
18 * one is included with the Software each a "Larger Work" to which the Software
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
19 * is contributed by such licensors),
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
20 *
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
21 * without restriction, including without limitation the rights to copy, create
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
22 * derivative works of, display, perform, and distribute the Software and make,
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
23 * use, sell, offer for sale, import, export, have made, and have sold the
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
24 * Software and the Larger Work(s), and to sublicense the foregoing rights on
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
25 * either these or other terms.
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
26 *
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
27 * This license is subject to the following condition:
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
28 *
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
29 * The above copyright notice and either this complete permission notice or at a
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
30 * minimum a reference to the UPL must be included in all copies or substantial
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
31 * portions of the Software.
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
32 *
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
33 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
34 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
35 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
36 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
37 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
38 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
c07e64ecb528 Update SL copyright headers to use UPL
Gilles Duboscq <gilles.m.duboscq@oracle.com>
parents: 21987
diff changeset
39 * SOFTWARE.
15064
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
40 */
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
41 package com.oracle.truffle.sl.builtins;
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
42
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
43 import com.oracle.truffle.api.*;
18130
b4e38f4ca414 Truffle: rename @SlowPath to @TruffleBoundary.
Christian Humer <christian.humer@gmail.com>
parents: 17349
diff changeset
44 import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
15064
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
45 import com.oracle.truffle.api.dsl.*;
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
46 import com.oracle.truffle.api.frame.*;
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
47 import com.oracle.truffle.api.frame.FrameInstance.FrameAccess;
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
48 import com.oracle.truffle.api.nodes.*;
16512
abe7128ca473 SL: upgrade source attribution
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 15564
diff changeset
49 import com.oracle.truffle.api.source.*;
15064
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
50
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
51 /**
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
52 * Returns a string representation of the current stack. This includes the {@link CallTarget}s and
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
53 * the contents of the {@link Frame}. Note that this is implemented as a slow path by passing
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
54 * {@code true} to {@link FrameInstance#getFrame(FrameAccess, boolean)}.
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
55 */
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
56 @NodeInfo(shortName = "stacktrace")
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
57 public abstract class SLStackTraceBuiltin extends SLBuiltinNode {
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
58
16512
abe7128ca473 SL: upgrade source attribution
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 15564
diff changeset
59 public SLStackTraceBuiltin() {
21987
b2d1c8ff592a Less classes in the source API package. Merging interfaces and their only implementation into final classes. Hiding NullSourceSection behind factory method. Using JDK's standard CharsetDecoder instead of proprietary BytesDecoder.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21951
diff changeset
60 super(SourceSection.createUnavailable("SL builtin", "stacktrace"));
16512
abe7128ca473 SL: upgrade source attribution
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 15564
diff changeset
61 }
abe7128ca473 SL: upgrade source attribution
Michael Van De Vanter <michael.van.de.vanter@oracle.com>
parents: 15564
diff changeset
62
15064
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
63 @Specialization
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
64 public String trace() {
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
65 return createStackTrace();
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
66 }
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
67
18130
b4e38f4ca414 Truffle: rename @SlowPath to @TruffleBoundary.
Christian Humer <christian.humer@gmail.com>
parents: 17349
diff changeset
68 @TruffleBoundary
15064
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
69 private static String createStackTrace() {
21941
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
70 final StringBuilder str = new StringBuilder();
15097
a1b0d7a1ef40 SL: Make SLStackTraceBuilting comfortable with non-graal runtimes.
Christian Humer <christian.humer@gmail.com>
parents: 15088
diff changeset
71
21941
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
72 Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<Integer>() {
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
73 @Override
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
74 public Integer visitFrame(FrameInstance frameInstance) {
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
75 CallTarget callTarget = frameInstance.getCallTarget();
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
76 Frame frame = frameInstance.getFrame(FrameAccess.READ_ONLY, true);
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
77 RootNode rn = ((RootCallTarget) callTarget).getRootNode();
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
78 if (rn.getClass().getName().contains("SLFunctionForeignAccess")) {
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
79 return 1;
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
80 }
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
81 if (str.length() > 0) {
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
82 str.append(System.getProperty("line.separator"));
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
83 }
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
84 str.append("Frame: ").append(rn.toString());
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
85 FrameDescriptor frameDescriptor = frame.getFrameDescriptor();
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
86 for (FrameSlot s : frameDescriptor.getSlots()) {
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
87 str.append(", ").append(s.getIdentifier()).append("=").append(frame.getValue(s));
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
88 }
0a00a5bd7c70 Need to expose also TRUFFLE-SL as Graal tests against that language
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 21490
diff changeset
89 return null;
21490
3286fb5fea4a Introducing standard I/O and error into Env and using TruffleVM to execute SL test cases. Adding SLTckTest to verify SL language interop.
Jaroslav Tulach <jaroslav.tulach@oracle.com>
parents: 18130
diff changeset
90 }
16529
f6ac86d3334e Change API for stack walking to a visitor: TruffleRuntime#iterateFrames replaces TruffleRuntime#getStackTrace
Christian Wimmer <christian.wimmer@oracle.com>
parents: 15564
diff changeset
91 });
15064
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
92 return str.toString();
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
93 }
f675818d9ad0 new getStackTrace and getCurrentFrame functionality in TruffleRuntime
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
94 }