1. /*
  2. * Copyright 2001-2004 The Apache Software Foundation.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /*
  17. * $Id: LangCall.java,v 1.5 2004/02/16 22:24:29 minchau Exp $
  18. */
  19. package com.sun.org.apache.xalan.internal.xsltc.compiler;
  20. import java.util.Vector;
  21. import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
  22. import com.sun.org.apache.bcel.internal.generic.ILOAD;
  23. import com.sun.org.apache.bcel.internal.generic.INVOKESTATIC;
  24. import com.sun.org.apache.bcel.internal.generic.InstructionList;
  25. import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator;
  26. import com.sun.org.apache.xalan.internal.xsltc.compiler.util.FilterGenerator;
  27. import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator;
  28. import com.sun.org.apache.xalan.internal.xsltc.compiler.util.StringType;
  29. import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
  30. import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
  31. /**
  32. * @author Morten Jorgensen
  33. */
  34. final class LangCall extends FunctionCall {
  35. private Expression _lang;
  36. private Type _langType;
  37. /**
  38. * Get the parameters passed to function:
  39. * lang(string)
  40. */
  41. public LangCall(QName fname, Vector arguments) {
  42. super(fname, arguments);
  43. _lang = argument(0);
  44. }
  45. /**
  46. *
  47. */
  48. public Type typeCheck(SymbolTable stable) throws TypeCheckError {
  49. _langType = _lang.typeCheck(stable);
  50. if (!(_langType instanceof StringType)) {
  51. _lang = new CastExpr(_lang, Type.String);
  52. }
  53. return Type.Boolean;
  54. }
  55. /**
  56. *
  57. */
  58. public Type getType() {
  59. return(Type.Boolean);
  60. }
  61. /**
  62. * This method is called when the constructor is compiled in
  63. * Stylesheet.compileConstructor() and not as the syntax tree is traversed.
  64. */
  65. public void translate(ClassGenerator classGen,
  66. MethodGenerator methodGen) {
  67. final ConstantPoolGen cpg = classGen.getConstantPool();
  68. final InstructionList il = methodGen.getInstructionList();
  69. final int tst = cpg.addMethodref(BASIS_LIBRARY_CLASS,
  70. "testLanguage",
  71. "("+STRING_SIG+DOM_INTF_SIG+"I)Z");
  72. _lang.translate(classGen,methodGen);
  73. il.append(methodGen.loadDOM());
  74. if (classGen instanceof FilterGenerator)
  75. il.append(new ILOAD(1));
  76. else
  77. il.append(methodGen.loadContextNode());
  78. il.append(new INVOKESTATIC(tst));
  79. }
  80. }