Mercurial > hg > graal-jvmci-8
annotate graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/expression/demo/SLAddWithoutSpecializationNode.java @ 14628:a08b8694f556
Truffle: Node API changes
deprecate adoptChild, no longer needed in constructor
add Node#insert for inserting new nodes into the tree (previously adoptChild)
add Node#adoptChildren() helper method that adopts all (direct and indirect) children of a node, automatically called in TruffleRuntime#createCallTarget
author | Andreas Woess <andreas.woess@jku.at> |
---|---|
date | Wed, 19 Mar 2014 23:11:46 +0100 |
parents | f3e4f746e9c6 |
children | abe7128ca473 |
rev | line source |
---|---|
13887
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
1 /* |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
2 * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved. |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
4 * |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
7 * published by the Free Software Foundation. |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
8 * |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
13 * accompanied this code). |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
14 * |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
18 * |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
21 * questions. |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
22 */ |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
23 package com.oracle.truffle.sl.nodes.expression.demo; |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
24 |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
25 import java.math.*; |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
26 |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
27 import com.oracle.truffle.api.*; |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
28 import com.oracle.truffle.api.dsl.*; |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
29 import com.oracle.truffle.api.frame.*; |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
30 import com.oracle.truffle.api.nodes.*; |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
31 import com.oracle.truffle.sl.nodes.*; |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
32 import com.oracle.truffle.sl.nodes.expression.*; |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
33 |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
34 /** |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
35 * This is an example how the add operation would be implemented without specializations and without |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
36 * the Truffle DSL. Do not write such code in your language! See {@link SLAddNode} how the add |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
37 * operation is implemented correctly. |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
38 */ |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
39 public class SLAddWithoutSpecializationNode extends SLExpressionNode { |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
40 |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
41 @Child private SLExpressionNode leftNode; |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
42 @Child private SLExpressionNode rightNode; |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
43 |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
44 public SLAddWithoutSpecializationNode(SLExpressionNode leftNode, SLExpressionNode rightNode) { |
14628
a08b8694f556
Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents:
13887
diff
changeset
|
45 this.leftNode = leftNode; |
a08b8694f556
Truffle: Node API changes
Andreas Woess <andreas.woess@jku.at>
parents:
13887
diff
changeset
|
46 this.rightNode = rightNode; |
13887
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
47 } |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
48 |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
49 @Override |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
50 public Object executeGeneric(VirtualFrame frame) { |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
51 /* Evaluate the child nodes. */ |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
52 Object left = leftNode.executeGeneric(frame); |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
53 Object right = rightNode.executeGeneric(frame); |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
54 |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
55 if (left instanceof Long && right instanceof Long) { |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
56 /* Fast path of the arbitrary-precision arithmetic. We need to check for overflows */ |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
57 try { |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
58 return ExactMath.addExact((Long) left, (Long) right); |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
59 } catch (ArithmeticException ex) { |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
60 /* Fall through to BigInteger case. */ |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
61 } |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
62 } |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
63 |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
64 /* Implicit type conversions. */ |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
65 if (left instanceof Long) { |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
66 left = BigInteger.valueOf((Long) left); |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
67 } |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
68 if (right instanceof Long) { |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
69 right = BigInteger.valueOf((Long) right); |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
70 } |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
71 if (left instanceof BigInteger && right instanceof BigInteger) { |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
72 /* Slow path of the arbitrary-precision arithmetic. */ |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
73 return ((BigInteger) left).add((BigInteger) right); |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
74 } |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
75 |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
76 /* String concatenation if either the left or the right operand is a String. */ |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
77 if (left instanceof String || right instanceof String) { |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
78 return left.toString() + right.toString(); |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
79 } |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
80 |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
81 /* Type error. */ |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
82 throw new UnsupportedSpecializationException(this, new Node[]{leftNode, rightNode}, new Object[]{left, right}); |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
83 } |
f3e4f746e9c6
Fix gate errors
Christian Wimmer <christian.wimmer@oracle.com>
parents:
13883
diff
changeset
|
84 } |