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