1 16 19 20 package org.apache.xalan.xsltc.compiler.util; 21 22 import org.apache.bcel.generic.ALOAD; 23 import org.apache.bcel.generic.ASTORE; 24 import org.apache.bcel.generic.BranchHandle; 25 import org.apache.bcel.generic.ConstantPoolGen; 26 import org.apache.bcel.generic.GOTO; 27 import org.apache.bcel.generic.IFEQ; 28 import org.apache.bcel.generic.IFNONNULL; 29 import org.apache.bcel.generic.INVOKESTATIC; 30 import org.apache.bcel.generic.INVOKEVIRTUAL; 31 import org.apache.bcel.generic.Instruction; 32 import org.apache.bcel.generic.InstructionList; 33 import org.apache.bcel.generic.PUSH; 34 import org.apache.xalan.xsltc.compiler.Constants; 35 import org.apache.xalan.xsltc.compiler.FlowList; 36 37 41 public class StringType extends Type { 42 protected StringType() {} 43 44 public String toString() { 45 return "string"; 46 } 47 48 public boolean identicalTo(Type other) { 49 return this == other; 50 } 51 52 public String toSignature() { 53 return "Ljava/lang/String;"; 54 } 55 56 public boolean isSimple() { 57 return true; 58 } 59 60 public org.apache.bcel.generic.Type toJCType() { 61 return org.apache.bcel.generic.Type.STRING; 62 } 63 64 71 public void translateTo(ClassGenerator classGen, MethodGenerator methodGen, 72 Type type) { 73 if (type == Type.Boolean) { 74 translateTo(classGen, methodGen, (BooleanType) type); 75 } 76 else if (type == Type.Real) { 77 translateTo(classGen, methodGen, (RealType) type); 78 } 79 else if (type == Type.Reference) { 80 translateTo(classGen, methodGen, (ReferenceType) type); 81 } 82 else if (type == Type.ObjectString) { 83 } 85 else { 86 ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR, 87 toString(), type.toString()); 88 classGen.getParser().reportError(Constants.FATAL, err); 89 } 90 } 91 92 97 public void translateTo(ClassGenerator classGen, MethodGenerator methodGen, 98 BooleanType type) { 99 final InstructionList il = methodGen.getInstructionList(); 100 FlowList falsel = translateToDesynthesized(classGen, methodGen, type); 101 il.append(ICONST_1); 102 final BranchHandle truec = il.append(new GOTO(null)); 103 falsel.backPatch(il.append(ICONST_0)); 104 truec.setTarget(il.append(NOP)); 105 } 106 107 113 public void translateTo(ClassGenerator classGen, MethodGenerator methodGen, 114 RealType type) { 115 final ConstantPoolGen cpg = classGen.getConstantPool(); 116 final InstructionList il = methodGen.getInstructionList(); 117 il.append(new INVOKESTATIC(cpg.addMethodref(BASIS_LIBRARY_CLASS, 118 STRING_TO_REAL, 119 STRING_TO_REAL_SIG))); 120 } 121 122 129 public FlowList translateToDesynthesized(ClassGenerator classGen, 130 MethodGenerator methodGen, 131 BooleanType type) { 132 final ConstantPoolGen cpg = classGen.getConstantPool(); 133 final InstructionList il = methodGen.getInstructionList(); 134 135 il.append(new INVOKEVIRTUAL(cpg.addMethodref(STRING_CLASS, 136 "length", "()I"))); 137 return new FlowList(il.append(new IFEQ(null))); 138 } 139 140 146 public void translateTo(ClassGenerator classGen, MethodGenerator methodGen, 147 ReferenceType type) { 148 methodGen.getInstructionList().append(NOP); 149 } 150 151 156 public void translateTo(ClassGenerator classGen, MethodGenerator methodGen, 157 Class clazz) 158 { 159 if (clazz.isAssignableFrom(java.lang.String .class)) { 161 methodGen.getInstructionList().append(NOP); 162 } 163 else { 164 ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR, 165 toString(), clazz.getName()); 166 classGen.getParser().reportError(Constants.FATAL, err); 167 } 168 } 169 170 175 public void translateFrom(ClassGenerator classGen, 176 MethodGenerator methodGen, Class clazz) 177 { 178 final ConstantPoolGen cpg = classGen.getConstantPool(); 179 final InstructionList il = methodGen.getInstructionList(); 180 181 if (clazz.getName().equals("java.lang.String")) { 182 il.append(DUP); 184 final BranchHandle ifNonNull = il.append(new IFNONNULL(null)); 185 il.append(POP); 186 il.append(new PUSH(cpg, "")); 187 ifNonNull.setTarget(il.append(NOP)); 188 } 189 else { 190 ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR, 191 toString(), clazz.getName()); 192 classGen.getParser().reportError(Constants.FATAL, err); 193 } 194 } 195 196 199 public void translateBox(ClassGenerator classGen, 200 MethodGenerator methodGen) { 201 translateTo(classGen, methodGen, Type.Reference); 202 } 203 204 207 public void translateUnBox(ClassGenerator classGen, 208 MethodGenerator methodGen) { 209 methodGen.getInstructionList().append(NOP); 210 } 211 212 215 public String getClassName() { 216 return(STRING_CLASS); 217 } 218 219 220 public Instruction LOAD(int slot) { 221 return new ALOAD(slot); 222 } 223 224 public Instruction STORE(int slot) { 225 return new ASTORE(slot); 226 } 227 } 228 | Popular Tags |