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 33 package sun.rmi.rmic.iiop; 34 35 import sun.tools.java.ClassNotFound; 36 import sun.tools.java.CompilerError; 37 import sun.tools.java.Identifier; 38 import sun.tools.java.ClassDefinition; 39 40 /** 41 * SpecialClassType represents any one of the following types: 42 * <pre> 43 * java.lang.Object 44 * java.lang.String 45 * </pre> 46 * all of which are treated as special cases. 47 * <p> 48 * The static forSpecial(...) method must be used to obtain an instance, and 49 * will return null if the type is non-conforming. 50 * 51 * @author Bryan Atsatt 52 */ 53 public class SpecialClassType extends ClassType { 54 55 //_____________________________________________________________________ 56 // Public Interfaces 57 //_____________________________________________________________________ 58 59 /** 60 * Create a SpecialClassType object for the given class. 61 * 62 * If the class is not a properly formed or if some other error occurs, the 63 * return value will be null, and errors will have been reported to the 64 * supplied BatchEnvironment. 65 */ 66 public static SpecialClassType forSpecial (ClassDefinition theClass, 67 ContextStack stack) { 68 if (stack.anyErrors()) return null; 69 70 sun.tools.java.Type type = theClass.getType(); 71 72 // Do we already have it? 73 74 String typeKey = type.toString() + stack.getContextCodeString(); 75 76 Type existing = getType(typeKey,stack); 77 78 if (existing != null) { 79 80 if (!(existing instanceof SpecialClassType)) return null; // False hit. 81 82 // Yep, so return it... 83 84 return (SpecialClassType) existing; 85 } 86 87 // Is it a special type? 88 89 int typeCode = getTypeCode(type,theClass,stack); 90 91 if (typeCode != TYPE_NONE) { 92 93 // Yes... 94 95 SpecialClassType result = new SpecialClassType(stack,typeCode,theClass); 96 putType(typeKey,result,stack); 97 stack.push(result); 98 stack.pop(true); 99 return result; 100 101 } else { 102 103 return null; 104 } 105 } 106 107 /** 108 * Return a string describing this type. 109 */ 110 public String getTypeDescription () { 111 return "Special class"; 112 } 113 114 //_____________________________________________________________________ 115 // Subclass/Internal Interfaces 116 //_____________________________________________________________________ 117 118 /** 119 * Create an SpecialClassType instance for the given class. 120 */ 121 private SpecialClassType(ContextStack stack, int typeCode, 122 ClassDefinition theClass) { 123 super(stack,typeCode | TM_SPECIAL_CLASS | TM_CLASS | TM_COMPOUND, theClass); 124 Identifier id = theClass.getName(); 125 String idlName = null; 126 String[] idlModuleName = null; 127 boolean constant = stack.size() > 0 && stack.getContext().isConstant(); 128 129 // Set names... 130 131 switch (typeCode) { 132 case TYPE_STRING: { 133 idlName = IDLNames.getTypeName(typeCode,constant); 134 if (!constant) { 135 idlModuleName = IDL_CORBA_MODULE; 136 } 137 break; 138 } 139 140 case TYPE_ANY: { 141 idlName = IDL_JAVA_LANG_OBJECT; 142 idlModuleName = IDL_JAVA_LANG_MODULE; 143 break; 144 } 145 } 146 147 setNames(id,idlModuleName,idlName); 148 149 // Init parents... 150 151 if (!initParents(stack)) { 152 153 // Should not be possible! 154 155 throw new CompilerError("SpecialClassType found invalid parent."); 156 } 157 158 // Initialize CompoundType... 159 160 initialize(null,null,null,stack,false); 161 } 162 163 private static int getTypeCode(sun.tools.java.Type type, ClassDefinition theClass, ContextStack stack) { 164 if (type.isType(TC_CLASS)) { 165 Identifier id = type.getClassName(); 166 if (id == idJavaLangString) return TYPE_STRING; 167 if (id == idJavaLangObject) return TYPE_ANY; 168 } 169 return TYPE_NONE; 170 } 171 }