1 /* 2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. 3 */ 4 /* 5 * Licensed to the Apache Software Foundation (ASF) under one or more 6 * contributor license agreements. See the NOTICE file distributed with 7 * this work for additional information regarding copyright ownership. 8 * The ASF licenses this file to You under the Apache License, Version 2.0 9 * (the "License"); you may not use this file except in compliance with 10 * the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 */ 20 21 package com.sun.org.apache.xalan.internal.xsltc.compiler; 22 23 import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen; 24 import com.sun.org.apache.bcel.internal.generic.ILOAD; 25 import com.sun.org.apache.bcel.internal.generic.INVOKESTATIC; 26 import com.sun.org.apache.bcel.internal.generic.InstructionList; 27 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator; 28 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.FilterGenerator; 29 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator; 30 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.StringType; 31 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type; 32 import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError; 33 import java.util.List; 34 35 /** 36 * @author Morten Jorgensen 37 * @LastModified: Oct 2017 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 }