1 /*
   2  * Copyright (c) 2015, 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.util;
  22 
  23 import com.sun.org.apache.bcel.internal.generic.Instruction;
  24 import com.sun.org.apache.bcel.internal.generic.InstructionList;
  25 import com.sun.org.apache.bcel.internal.generic.PUSH;
  26 import com.sun.org.apache.xalan.internal.xsltc.compiler.Constants;
  27 
  28 /**
  29  * @author Jacek Ambroziak
  30  * @author Santiago Pericas-Geertsen
  31  * @LastModified: Oct 2017
  32  */
  33 public final class VoidType extends Type {
  34     protected VoidType() {}
  35 
  36     public String toString() {
  37         return "void";
  38     }
  39 
  40     public boolean identicalTo(Type other) {
  41         return this == other;
  42     }
  43 
  44     public String toSignature() {
  45         return "V";
  46     }
  47 
  48     public com.sun.org.apache.bcel.internal.generic.Type toJCType() {
  49         return null;    // should never be called
  50     }
  51 
  52     public Instruction POP() {
  53         return NOP;
  54     }
  55 
  56     /**
  57      * Translates a void into an object of internal type <code>type</code>.
  58      * This translation is needed when calling external functions
  59      * that return void.
  60      *
  61      * @see     com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo
  62      */
  63     public void translateTo(ClassGenerator classGen, MethodGenerator methodGen,
  64                             Type type) {
  65         if (type == Type.String) {
  66             translateTo(classGen, methodGen, (StringType) type);
  67         }
  68         else {
  69             ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
  70                                         toString(), type.toString());
  71             classGen.getParser().reportError(Constants.FATAL, err);
  72         }
  73     }
  74 
  75     /**
  76      * Translates a void into a string by pushing the empty string ''.
  77      *
  78      * @see     com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type#translateTo
  79      */
  80     public void translateTo(ClassGenerator classGen, MethodGenerator methodGen,
  81                             StringType type) {
  82         final InstructionList il = methodGen.getInstructionList();
  83         il.append(new PUSH(classGen.getConstantPool(), ""));
  84     }
  85 
  86     /**
  87      * Translates an external (primitive) Java type into a void.
  88      * Only an external "void" can be converted to this class.
  89      */
  90     public void translateFrom(ClassGenerator classGen, MethodGenerator methodGen,
  91                               Class<?> clazz) {
  92         if (!clazz.getName().equals("void")) {
  93             ErrorMsg err = new ErrorMsg(ErrorMsg.DATA_CONVERSION_ERR,
  94                                         toString(), clazz.getName());
  95             classGen.getParser().reportError(Constants.FATAL, err);
  96         }
  97     }
  98 }