1/*
2 * reserved comment block
3 * DO NOT REMOVE OR ALTER!
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
22package com.sun.org.apache.xalan.internal.xsltc.compiler;
23
24import com.sun.org.apache.bcel.internal.generic.GOTO;
25import com.sun.org.apache.bcel.internal.generic.InstructionHandle;
26import com.sun.org.apache.bcel.internal.generic.InstructionList;
27import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator;
28import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator;
29import com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type;
30import com.sun.org.apache.xalan.internal.xsltc.compiler.util.TypeCheckError;
31
32/**
33 * @author Jacek Ambroziak
34 * @author Santiago Pericas-Geertsen
35 */
36final class AlternativePattern extends Pattern {
37    private final Pattern _left;
38    private final Pattern _right;
39
40    /**
41     * Construct an alternative pattern. The method <code>setParent</code>
42     * should not be called in this case.
43     */
44    public AlternativePattern(Pattern left, Pattern right) {
45        _left = left;
46        _right = right;
47    }
48
49    public void setParser(Parser parser) {
50        super.setParser(parser);
51        _left.setParser(parser);
52        _right.setParser(parser);
53    }
54
55    public Pattern getLeft() {
56        return _left;
57    }
58
59    public Pattern getRight() {
60        return _right;
61    }
62
63    /**
64     * The type of an '|' is not really defined, hence null is returned.
65     */
66    public Type typeCheck(SymbolTable stable) throws TypeCheckError {
67        _left.typeCheck(stable);
68        _right.typeCheck(stable);
69        return null;
70    }
71
72    public double getPriority() {
73        double left = _left.getPriority();
74        double right = _right.getPriority();
75
76        if (left < right)
77            return(left);
78        else
79            return(right);
80    }
81
82    public String toString() {
83        return "alternative(" + _left + ", " + _right + ')';
84    }
85
86    public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
87        final InstructionList il = methodGen.getInstructionList();
88
89        _left.translate(classGen, methodGen);
90        final InstructionHandle gotot = il.append(new GOTO(null));
91        il.append(methodGen.loadContextNode());
92        _right.translate(classGen, methodGen);
93
94        _left._trueList.backPatch(gotot);
95        _left._falseList.backPatch(gotot.getNext());
96
97        _trueList.append(_right._trueList.add(gotot));
98        _falseList.append(_right._falseList);
99    }
100}
101