PrimitiveType.java revision 608:7e06bf1dcb09
1/*
2 * Copyright (c) 1998, 2007, 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/*
27 * Licensed Materials - Property of IBM
28 * RMI-IIOP v1.0
29 * Copyright IBM Corp. 1998 1999  All Rights Reserved
30 *
31 */
32
33package sun.rmi.rmic.iiop;
34
35import sun.tools.java.CompilerError;
36import sun.tools.java.Identifier;
37import sun.tools.java.ClassDefinition;
38
39/**
40 * PrimitiveType wraps primitive types and void.
41 * <p>
42 * The static forPrimitive(...) method must be used to obtain an instance, and
43 * will return null if the type is non-conforming.
44 *
45 * @author      Bryan Atsatt
46 */
47public class PrimitiveType extends Type {
48
49    //_____________________________________________________________________
50    // Public Interfaces
51    //_____________________________________________________________________
52
53    /**
54     * Create a PrimitiveType object for the given type.
55     *
56     * If the type is not a properly formed or if some other error occurs, the
57     * return value will be null, and errors will have been reported to the
58     * supplied BatchEnvironment.
59     */
60    public static PrimitiveType forPrimitive(sun.tools.java.Type type,
61                                             ContextStack stack) {
62
63        if (stack.anyErrors()) return null;
64
65        // Do we already have it?
66
67        Type existing = getType(type,stack);
68
69        if (existing != null) {
70
71            if (!(existing instanceof PrimitiveType)) return null; // False hit.
72
73            // Yep, so return it...
74
75            return (PrimitiveType) existing;
76        }
77
78        int typeCode;
79
80        switch (type.getTypeCode()) {
81        case TC_VOID:           typeCode = TYPE_VOID; break;
82        case TC_BOOLEAN:        typeCode = TYPE_BOOLEAN; break;
83        case TC_BYTE:           typeCode = TYPE_BYTE; break;
84        case TC_CHAR:           typeCode = TYPE_CHAR; break;
85        case TC_SHORT:          typeCode = TYPE_SHORT; break;
86        case TC_INT:            typeCode = TYPE_INT; break;
87        case TC_LONG:           typeCode = TYPE_LONG; break;
88        case TC_FLOAT:          typeCode = TYPE_FLOAT; break;
89        case TC_DOUBLE:         typeCode = TYPE_DOUBLE; break;
90        default: return null;
91        }
92
93        PrimitiveType it = new PrimitiveType(stack,typeCode);
94
95        // Add it...
96
97        putType(type,it,stack);
98
99        // Do the stack thing in case tracing on...
100
101        stack.push(it);
102        stack.pop(true);
103
104        return it;
105    }
106
107    /**
108     * Return signature for this type  (e.g. com.acme.Dynamite
109     * would return "com.acme.Dynamite", byte = "B")
110     */
111    public String getSignature() {
112        switch (getTypeCode()) {
113        case TYPE_VOID:         return SIG_VOID;
114        case TYPE_BOOLEAN:      return SIG_BOOLEAN;
115        case TYPE_BYTE:         return SIG_BYTE;
116        case TYPE_CHAR:         return SIG_CHAR;
117        case TYPE_SHORT:    return SIG_SHORT;
118        case TYPE_INT:          return SIG_INT;
119        case TYPE_LONG:         return SIG_LONG;
120        case TYPE_FLOAT:        return SIG_FLOAT;
121        case TYPE_DOUBLE:       return SIG_DOUBLE;
122        default:            return null;
123        }
124    }
125
126    /**
127     * Return a string describing this type.
128     */
129    public String getTypeDescription () {
130        return "Primitive";
131    }
132
133    /**
134     * IDL_Naming
135     * Return the fully qualified IDL name for this type (e.g. com.acme.Dynamite would
136     * return "com::acme::Dynamite").
137     * @param global If true, prepends "::".
138     */
139    public String getQualifiedIDLName(boolean global) {
140        return super.getQualifiedIDLName(false);
141    }
142
143    //_____________________________________________________________________
144    // Subclass/Internal Interfaces
145    //_____________________________________________________________________
146
147    /*
148     * Load a Class instance. Return null if fail.
149     */
150    protected Class loadClass() {
151        switch (getTypeCode()) {
152        case TYPE_VOID:         return Null.class;
153        case TYPE_BOOLEAN:      return boolean.class;
154        case TYPE_BYTE:         return byte.class;
155        case TYPE_CHAR:         return char.class;
156        case TYPE_SHORT:        return short.class;
157        case TYPE_INT:          return int.class;
158        case TYPE_LONG:         return long.class;
159        case TYPE_FLOAT:        return float.class;
160        case TYPE_DOUBLE:       return double.class;
161        default:            throw new CompilerError("Not a primitive type");
162        }
163    }
164
165    /**
166     * IDL_Naming
167     * Create an PrimitiveType instance for the given class.
168     */
169    private PrimitiveType(ContextStack stack, int typeCode) {
170        super(stack,typeCode | TM_PRIMITIVE);
171
172        // Validate type and set names...
173
174        String idlName = IDLNames.getTypeName(typeCode,false);
175        Identifier id = null;
176
177        switch (typeCode) {
178        case TYPE_VOID:         id = idVoid; break;
179        case TYPE_BOOLEAN:      id = idBoolean; break;
180        case TYPE_BYTE:         id = idByte; break;
181        case TYPE_CHAR:         id = idChar; break;
182        case TYPE_SHORT:        id = idShort; break;
183        case TYPE_INT:          id = idInt; break;
184        case TYPE_LONG:         id = idLong; break;
185        case TYPE_FLOAT:        id = idFloat; break;
186        case TYPE_DOUBLE:       id = idDouble; break;
187        default:            throw new CompilerError("Not a primitive type");
188        }
189
190        setNames(id,null,idlName);
191        setRepositoryID();
192    }
193}
194
195class Null {}
196