FileDocCategorySizeDatePackage
RealType.javaAPI DocJava SE 5 API10684Fri Aug 26 14:55:38 BST 2005com.sun.org.apache.xalan.internal.xsltc.compiler.util

RealType

public final class RealType extends NumberType
author
Jacek Ambroziak
author
Santiago Pericas-Geertsen

Fields Summary
Constructors Summary
protected RealType()

Methods Summary
public com.sun.org.apache.bcel.internal.generic.InstructionADD()

	return InstructionConstants.DADD;
    
public com.sun.org.apache.bcel.internal.generic.InstructionCMP(boolean less)

	return less ? InstructionConstants.DCMPG : InstructionConstants.DCMPL;
    
public com.sun.org.apache.bcel.internal.generic.InstructionDIV()

	return InstructionConstants.DDIV;
    
public com.sun.org.apache.bcel.internal.generic.InstructionDUP()

	return DUP2;
    
public com.sun.org.apache.bcel.internal.generic.InstructionLOAD(int slot)

	return new DLOAD(slot);
    
public com.sun.org.apache.bcel.internal.generic.InstructionMUL()

	return InstructionConstants.DMUL;
    
public com.sun.org.apache.bcel.internal.generic.InstructionNEG()

	return InstructionConstants.DNEG;
    
public com.sun.org.apache.bcel.internal.generic.InstructionPOP()

	return POP2;
    
public com.sun.org.apache.bcel.internal.generic.InstructionREM()

	return InstructionConstants.DREM;
    
public com.sun.org.apache.bcel.internal.generic.InstructionSTORE(int slot)

	return new DSTORE(slot);
    
public com.sun.org.apache.bcel.internal.generic.InstructionSUB()

	return InstructionConstants.DSUB;
    
public intdistanceTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type type)

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#distanceTo

	if (type == this) {
	    return 0;
	}
	else if (type == Type.Int) {
	    return 1;
	}
	else {
	    return Integer.MAX_VALUE;
	}
    
public booleanidenticalTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type other)

	return this == other;
    
public com.sun.org.apache.bcel.internal.generic.TypetoJCType()

	return com.sun.org.apache.bcel.internal.generic.Type.DOUBLE;
    
public java.lang.StringtoSignature()

	return "D";
    
public java.lang.StringtoString()

	return "real";
    
public voidtranslateBox(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
Translates an object of this type to its boxed representation.

	translateTo(classGen, methodGen, Type.Reference);
    
public voidtranslateFrom(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, java.lang.Class clazz)
Translates an external (primitive) Java type into a real. Expects a java object on the stack and pushes a real (i.e., a double).

	InstructionList il = methodGen.getInstructionList();

	if (clazz == Character.TYPE || clazz == Byte.TYPE ||
	    clazz == Short.TYPE || clazz == Integer.TYPE) {
	    il.append(I2D);
	}
	else if (clazz == Long.TYPE) {
	    il.append(L2D);
	}
	else if (clazz == Float.TYPE) {
	    il.append(F2D);
	}
	else if (clazz == Double.TYPE) {
	    il.append(NOP);
	}
	else {
	    ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
					toString(), clazz.getName());
	    classGen.getParser().reportError(Constants.FATAL, err);
	}
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.IntType type)
Expects a real on the stack and pushes a truncated integer value

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	final ConstantPoolGen cpg = classGen.getConstantPool();
	final InstructionList il = methodGen.getInstructionList();
	il.append(new INVOKESTATIC(cpg.addMethodref(BASIS_LIBRARY_CLASS,
						    "realToInt","(D)I")));
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.ReferenceType type)
Expects a double on the stack and pushes a boxed double. Boxed double are represented by an instance of java.lang.Double.

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	final ConstantPoolGen cpg = classGen.getConstantPool();
	final InstructionList il = methodGen.getInstructionList();
	il.append(new NEW(cpg.addClass(DOUBLE_CLASS)));
	il.append(DUP_X2);
	il.append(DUP_X2);
	il.append(POP);
	il.append(new INVOKESPECIAL(cpg.addMethodref(DOUBLE_CLASS,
						     "<init>", "(D)V")));
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, java.lang.Class clazz)
Translates a real into the Java type denoted by clazz. Expects a real on the stack and pushes a number of the appropriate type after coercion.

	final InstructionList il = methodGen.getInstructionList();
	if (clazz == Character.TYPE) {
	    il.append(D2I);
	    il.append(I2C);
	}
	else if (clazz == Byte.TYPE) {
	    il.append(D2I);
	    il.append(I2B);
	}
	else if (clazz == Short.TYPE) {
	    il.append(D2I);
	    il.append(I2S);
	}
	else if (clazz == Integer.TYPE) {
	    il.append(D2I);
	}
	else if (clazz == Long.TYPE) {
	    il.append(D2L);
	}
	else if (clazz == Float.TYPE) {
	    il.append(D2F);
	}
	else if (clazz == Double.TYPE) {
	    il.append(NOP);
	}
        // Is Double <: clazz? I.e. clazz in { Double, Number, Object }
        else if (clazz.isAssignableFrom(java.lang.Double.class)) {
            translateTo(classGen, methodGen, Type.Reference);
        }
	else {
	    ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
					toString(), clazz.getName());
	    classGen.getParser().reportError(Constants.FATAL, err);
	}
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type type)
Translates a real into an object of internal type type. The translation to int is undefined since reals are never converted to ints.

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	if (type == Type.String) {
	    translateTo(classGen, methodGen, (StringType) type);
	}
	else if (type == Type.Boolean) {
	    translateTo(classGen, methodGen, (BooleanType) type);
	}
	else if (type == Type.Reference) {
	    translateTo(classGen, methodGen, (ReferenceType) type);
	}
	else if (type == Type.Int) {
	    translateTo(classGen, methodGen, (IntType) type);
	}
	else {
	    ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
					toString(), type.toString());
	    classGen.getParser().reportError(Constants.FATAL, err);
	}
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.StringType type)
Expects a real on the stack and pushes its string value by calling Double.toString(double d).

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	final ConstantPoolGen cpg = classGen.getConstantPool();
	final InstructionList il = methodGen.getInstructionList();
	il.append(new INVOKESTATIC(cpg.addMethodref(BASIS_LIBRARY_CLASS,
						    "realToString",
						    "(D)" + STRING_SIG)));
    
public voidtranslateTo(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.BooleanType type)
Expects a real on the stack and pushes a 0 if that number is 0.0 and a 1 otherwise.

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo

	final InstructionList il = methodGen.getInstructionList();
	FlowList falsel = translateToDesynthesized(classGen, methodGen, type);
	il.append(ICONST_1);
	final BranchHandle truec = il.append(new GOTO(null));
	falsel.backPatch(il.append(ICONST_0));
	truec.setTarget(il.append(NOP));
    
public com.sun.org.apache.xalan.internal.xsltc.compiler.FlowListtranslateToDesynthesized(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.BooleanType type)
Translates a real into a non-synthesized boolean. It does not push a 0 or a 1 but instead returns branchhandle list to be appended to the false list. A NaN must be converted to "false".

see
com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateToDesynthesized

	LocalVariableGen local;
	final FlowList flowlist = new FlowList();
	final ConstantPoolGen cpg = classGen.getConstantPool();
	final InstructionList il = methodGen.getInstructionList();

	// Store real into a local variable
	il.append(DUP2);
	local = methodGen.addLocalVariable("real_to_boolean_tmp", 
					   com.sun.org.apache.bcel.internal.generic.Type.DOUBLE,
					   il.getEnd(), null);
	il.append(new DSTORE(local.getIndex()));

	// Compare it to 0.0
	il.append(DCONST_0);
	il.append(DCMPG);
	flowlist.add(il.append(new IFEQ(null)));

	//!!! call isNaN
	// Compare it to itself to see if NaN
	il.append(new DLOAD(local.getIndex()));
	il.append(new DLOAD(local.getIndex()));
	il.append(DCMPG);
	flowlist.add(il.append(new IFNE(null)));	// NaN != NaN
	return flowlist;
    
public voidtranslateUnBox(com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator classGen, com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator methodGen)
Translates an object of this type to its unboxed representation.

	final ConstantPoolGen cpg = classGen.getConstantPool();
	final InstructionList il = methodGen.getInstructionList();
	il.append(new CHECKCAST(cpg.addClass(DOUBLE_CLASS)));
	il.append(new INVOKEVIRTUAL(cpg.addMethodref(DOUBLE_CLASS,
						     DOUBLE_VALUE, 
						     DOUBLE_VALUE_SIG)));