⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xdatatype.java

📁 A framework written in Java for implementing high-level and dynamic languages, compiling them into J
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
// Copyright (c) 2006  Per M.A. Bothner.// This is free software;  for specifics see ../../../COPYING.package gnu.kawa.xml;import gnu.bytecode.*;import gnu.mapping.Procedure;import gnu.mapping.Values;import gnu.expr.*;import gnu.text.Printable;import gnu.math.*;import java.math.BigDecimal;import gnu.lists.SeqPosition;import gnu.lists.Consumer;import gnu.xml.TextUtils;import gnu.text.URIPath;/** An atomic type as used in XML Schema and related languages. * For example the {code xs:decimal} type is {@code XDataType.decimalType}. */public class XDataType extends Type implements TypeValue{  Type implementationType;  Object name;  /** The "parent" type. */  XDataType baseType;  /** One of the {@code XXXX_TYPE_CODE} constants. */  int typeCode;  public static final int ANY_ATOMIC_TYPE_CODE = 1;  public static final int DECIMAL_TYPE_CODE = 2;  public static final int INTEGER_TYPE_CODE = 3;  public static final int NON_POSITIVE_INTEGER_TYPE_CODE = 4;  public static final int NEGATIVE_INTEGER_TYPE_CODE = 5;  public static final int LONG_TYPE_CODE = 6;  public static final int INT_TYPE_CODE = 7;  public static final int SHORT_TYPE_CODE = 8;  public static final int BYTE_TYPE_CODE = 9;  public static final int NONNEGATIVE_INTEGER_TYPE_CODE = 10;  public static final int UNSIGNED_LONG_TYPE_CODE = 11;  public static final int UNSIGNED_INT_TYPE_CODE = 12;  public static final int UNSIGNED_SHORT_TYPE_CODE = 13;  public static final int UNSIGNED_BYTE_TYPE_CODE = 14;  public static final int POSITIVE_INTEGER_TYPE_CODE = 15;  public static final int FLOAT_TYPE_CODE = 16;  public static final int DOUBLE_TYPE_CODE = 17;  public static final int DATE_TIME_TYPE_CODE = 18;  public static final int DATE_TYPE_CODE = 19;  public static final int TIME_TYPE_CODE = 20;  public static final int G_YEAR_MONTH_TYPE_CODE = 21;  public static final int G_YEAR_TYPE_CODE = 22;  public static final int G_MONTH_DAY_TYPE_CODE = 23;  public static final int G_DAY_TYPE_CODE = 24;  public static final int G_MONTH_TYPE_CODE = 25;  public static final int DURATION_TYPE_CODE = 26;  public static final int YEAR_MONTH_DURATION_TYPE_CODE = 27;  public static final int DAY_TIME_DURATION_TYPE_CODE = 28;  public static final int BOOLEAN_TYPE_CODE = 29;  public static final int QNAME_TYPE_CODE = 30;  public static final int ANY_URI_TYPE_CODE = 31;  public static final int BASE64_BINARY_TYPE_CODE = 32;  public static final int HEX_BINARY_TYPE_CODE = 33;  public static final int NOTATION_TYPE_CODE = 34;  public static final int UNTYPED_ATOMIC_TYPE_CODE = 35;  public static final int STRING_TYPE_CODE = 36;  public static final int NORMALIZED_STRING_TYPE_CODE = 37;  public static final int TOKEN_TYPE_CODE = 38;  public static final int LANGUAGE_TYPE_CODE = 39;  public static final int NMTOKEN_TYPE_CODE = 40;  public static final int NAME_TYPE_CODE = 41;  public static final int NCNAME_TYPE_CODE = 42;  public static final int ID_TYPE_CODE = 43;  public static final int IDREF_TYPE_CODE = 44;  public static final int ENTITY_TYPE_CODE = 45;  public XDataType (Object name, Type implementationType, int typeCode)  {    super(implementationType);    this.name = name;    if (name != null)      setName(name.toString());    this.implementationType = implementationType;    this.typeCode = typeCode;  }  public static final XDataType anyAtomicType =    new XDataType("anyAtomicType",                  Type.pointer_type,                  ANY_ATOMIC_TYPE_CODE);  public static final XDataType stringType =    new XDataType("string",                  /* #ifdef use:java.lang.CharSequence */                  ClassType.make("java.lang.CharSequence"),                  /* #else */                  // ClassType.make("java.lang.String"),                  /* #endif */                  STRING_TYPE_CODE);  /** A value implemented as java.lang.String.   * Can be cast from CharSequence.   */  public static final XDataType stringStringType =    new XDataType("String",                  ClassType.make("java.lang.String"),                  STRING_TYPE_CODE);  public static final XDataType untypedAtomicType =    new XDataType("string", ClassType.make("gnu.kawa.xml.UntypedAtomic"),                  UNTYPED_ATOMIC_TYPE_CODE);  public static final XDataType base64BinaryType =    new XDataType("base64Binary", ClassType.make("gnu.kawa.xml.Base64Binary"),                  BASE64_BINARY_TYPE_CODE);  public static final XDataType hexBinaryType =    new XDataType("hexBinary", ClassType.make("gnu.kawa.xml.HexBinary"),                  HEX_BINARY_TYPE_CODE);  public static final XDataType booleanType =    new XDataType("boolean", Type.boolean_type,                  BOOLEAN_TYPE_CODE);  public static final XDataType anyURIType =    new XDataType("anyURI", ClassType.make("gnu.text.Path"), ANY_URI_TYPE_CODE);  public static final XDataType NotationType =    new XDataType("NOTATION",                  ClassType.make("gnu.kawa.xml.Notation"),                  NOTATION_TYPE_CODE);  public static final XDataType decimalType =    // A decimal value is implemented using java.math.BigDecimal.    // However, the integer sub-type is implemented using gnu.math.IntNum.    // So we use their common supertype as the implementationType.    new XDataType("decimal", ClassType.make("java.lang.Number"),                  DECIMAL_TYPE_CODE);  public static final XDataType floatType =    new XDataType("float", ClassType.make("java.lang.Float"), FLOAT_TYPE_CODE);  public static final XDataType doubleType =    new XDataType("double", ClassType.make("java.lang.Double"), DOUBLE_TYPE_CODE);  public static final XDataType durationType =    new XDataType("duration", ClassType.make("gnu.math.Duration"),                  DURATION_TYPE_CODE);  public static final XDataType yearMonthDurationType =    new XDataType("yearMonthDuration", ClassType.make("gnu.math.Duration"),                  YEAR_MONTH_DURATION_TYPE_CODE);  public static final XDataType dayTimeDurationType =    new XDataType("dayTimeDuration", ClassType.make("gnu.math.Duration"),                  DAY_TIME_DURATION_TYPE_CODE);  public java.lang.Class getReflectClass()  {    return implementationType.getReflectClass();  }  public Type getImplementationType()  {    return implementationType;  }  public void emitCoerceFromObject (CodeAttr code)  {    Compilation comp = Compilation.getCurrent();    comp.compileConstant(this, Target.pushObject);    Method meth = ClassType.make("gnu.kawa.xml.XDataType")      .getDeclaredMethod("coerceFromObject", 1);    code.emitSwap();    code.emitInvokeVirtual(meth);    // Needed to avoid VerifyErrors.    implementationType.emitCoerceFromObject(code);  }  public void emitCoerceToObject (CodeAttr code)  {    if (typeCode == BOOLEAN_TYPE_CODE)      implementationType.emitCoerceToObject(code);    else      super.emitCoerceToObject(code);  } public void emitTestIf(Variable incoming, Declaration decl, Compilation comp)  {    CodeAttr code = comp.getCode();    if (typeCode == BOOLEAN_TYPE_CODE)      {        if (incoming != null)          code.emitLoad(incoming);        Type.boolean_ctype.emitIsInstance(code);        code.emitIfIntNotZero();        if (decl != null)          {            // Error if incoming is null.            code.emitLoad(incoming);            Type.boolean_type.emitCoerceFromObject(code);            decl.compileStore(comp);          }        return;      }    comp.compileConstant(this, Target.pushObject);    if (incoming == null)      code.emitSwap();    else      code.emitLoad(incoming);    if (decl != null)      {        code.emitDup();        decl.compileStore(comp);      }    code.emitInvokeVirtual(Compilation.typeType                           .getDeclaredMethod("isInstance", 1));    code.emitIfIntNotZero();  }  public boolean isInstance (Object obj)  {    switch (typeCode)      {      case ANY_ATOMIC_TYPE_CODE:        return ! (obj instanceof Values || obj instanceof SeqPosition);      case STRING_TYPE_CODE:        /* #ifdef use:java.lang.CharSequence */        return obj instanceof java.lang.CharSequence;        /* #else */        // return obj instanceof java.lang.String;        /* #endif */      case UNTYPED_ATOMIC_TYPE_CODE:        return obj instanceof gnu.kawa.xml.UntypedAtomic;      case ANY_URI_TYPE_CODE:        return obj instanceof gnu.text.Path;      case BOOLEAN_TYPE_CODE:        return obj instanceof java.lang.Boolean;      case FLOAT_TYPE_CODE:        return obj instanceof java.lang.Float;      case DOUBLE_TYPE_CODE:        return obj instanceof java.lang.Double;      case DECIMAL_TYPE_CODE:        return obj instanceof java.math.BigDecimal          || obj instanceof gnu.math.IntNum;      case DURATION_TYPE_CODE:        return obj instanceof Duration;      case YEAR_MONTH_DURATION_TYPE_CODE:        return obj instanceof Duration          && ((Duration) obj).unit() == Unit.month;      case DAY_TIME_DURATION_TYPE_CODE:        return obj instanceof Duration          && ((Duration) obj).unit() == Unit.second;      default:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -