History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/sun/tools/tree/CastExpression.java (1 of 18352 files). Show all

Unified · Split

java/pkg/sun/tools/tree/CastExpression.java+135−0
@@ -0,0 +1,135 @@
1+/*
2+ * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved.
3+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+ *
5+ * This code is free software; you can redistribute it and/or modify it
6+ * under the terms of the GNU General Public License version 2 only, as
7+ * published by the Free Software Foundation. Oracle designates this
8+ * particular file as subject to the "Classpath" exception as provided
9+ * by Oracle in the LICENSE file that accompanied this code.
10+ *
11+ * This code is distributed in the hope that it will be useful, but WITHOUT
12+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+ * version 2 for more details (a copy is included in the LICENSE file that
15+ * accompanied this code).
16+ *
17+ * You should have received a copy of the GNU General Public License version
18+ * 2 along with this work; if not, write to the Free Software Foundation,
19+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+ *
21+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+ * or visit www.oracle.com if you need additional information or have any
23+ * questions.
24+ */
25+
26+package sun.tools.tree;
27+
28+import sun.tools.java.*;
29+import sun.tools.asm.Assembler;
30+import sun.tools.asm.Label;
31+import java.io.PrintStream;
32+import java.util.Hashtable;
33+
34+/**
35+ * WARNING: The contents of this source file are not part of any
36+ * supported API. Code that depends on them does so at its own risk:
37+ * they are subject to change or removal without notice.
38+ */
39+public
40+class CastExpression extends BinaryExpression {
41+ /**
42+ * constructor
43+ */
44+ public CastExpression(long where, Expression left, Expression right) {
45+ super(CAST, where, left.type, left, right);
46+ }
47+
48+ /**
49+ * Check the expression
50+ */
51+ public Vset checkValue(Environment env, Context ctx, Vset vset, Hashtable exp) {
52+ type = left.toType(env, ctx);
53+ vset = right.checkValue(env, ctx, vset, exp);
54+
55+ if (type.isType(TC_ERROR) || right.type.isType(TC_ERROR)) {
56+ // An error was already reported
57+ return vset;
58+ }
59+
60+ if (type.equals(right.type)) {
61+ // The types are already the same
62+ return vset;
63+ }
64+
65+ try {
66+ if (env.explicitCast(right.type, type)) {
67+ right = new ConvertExpression(where, type, right);
68+ return vset;
69+ }
70+ } catch (ClassNotFound e) {
71+ env.error(where, "class.not.found", e.name, opNames[op]);
72+ }
73+
74+ // The cast is not allowed
75+ env.error(where, "invalid.cast", right.type, type);
76+ return vset;
77+ }
78+
79+ /**
80+ * Check if constant
81+ */
82+ public boolean isConstant() {
83+ if (type.inMask(TM_REFERENCE) && !type.equals(Type.tString)) {
84+ // must be a primitive type, or String
85+ return false;
86+ }
87+ return right.isConstant();
88+ }
89+
90+ /**
91+ * Inline
92+ */
93+ public Expression inline(Environment env, Context ctx) {
94+ return right.inline(env, ctx);
95+ }
96+ public Expression inlineValue(Environment env, Context ctx) {
97+ return right.inlineValue(env, ctx);
98+ }
99+
100+
101+ public int costInline(int thresh, Environment env, Context ctx) {
102+ if (ctx == null) {
103+ return 1 + right.costInline(thresh, env, ctx);
104+ }
105+ // sourceClass is the current class trying to inline this method
106+ ClassDefinition sourceClass = ctx.field.getClassDefinition();
107+ try {
108+ // We only allow the inlining if the current class can access
109+ // the casting class
110+ if (left.type.isType(TC_ARRAY) ||
111+ sourceClass.permitInlinedAccess(env,
112+ env.getClassDeclaration(left.type)))
113+ return 1 + right.costInline(thresh, env, ctx);
114+ } catch (ClassNotFound e) {
115+ }
116+ return thresh;
117+ }
118+
119+
120+
121+ /**
122+ * Print
123+ */
124+ public void print(PrintStream out) {
125+ out.print("(" + opNames[op] + " ");
126+ if (type.isType(TC_ERROR)) {
127+ left.print(out);
128+ } else {
129+ out.print(type);
130+ }
131+ out.print(" ");
132+ right.print(out);
133+ out.print(")");
134+ }
135+}