/* * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.apple.internal.jobjc.generator.model.coders; import com.apple.internal.jobjc.generator.model.types.JType.JStruct; import com.apple.jobjc.Coder; import com.apple.jobjc.Coder.IDCoder; import com.apple.jobjc.Coder.NSClassCoder; import com.apple.jobjc.Coder.PointerCoder; import com.apple.jobjc.Coder.PrimitivePointerCoder; import com.apple.jobjc.Coder.SELCoder; import com.apple.jobjc.Coder.UnknownCoder; import com.apple.jobjc.Coder.VoidCoder; public class CoderDescriptor { public static final CoderDescriptor VOID_DESC = new CoderDescriptor(VoidCoder.INST, null, null); final Coder coder; private final String coderInstanceName; final String pushName; final String popName; public String mismatchMessage(){ return null; } public CoderDescriptor(final Coder coder, final String pushName, final String popName) { this.coder = coder; this.coderInstanceName = coder.getClass().getCanonicalName() + ".INST"; if (coderInstanceName == null) throw new NullPointerException(); this.pushName = pushName; this.popName = popName; } public CoderDescriptor(final String pushName, final String popName) { this.coder = null; this.coderInstanceName = null; this.pushName = pushName; this.popName = popName; } public CoderDescriptor(final Coder coder) { this(coder, "push", "pop"); } public CoderDescriptor(){ this("push", "pop"); } public String getPopStatementFor(final String contextName, final String returnValueType, final String returnValueName, final String transform) { return "final " + returnValueType + " " + returnValueName + " = " + "(" + returnValueType + ") " + (transform == null ? "" : transform) + "(" + getCoderInstanceName() + "." + popName + "(" + contextName + "));"; } public final String getPushStatementFor(final String contextName, final String argumentName) { return getCoderInstanceName() + "." + pushName + "(" + contextName + ", " + argumentName + ");"; } public String getPopAddrStatementFor(final String runtime, final String addr, final String returnValueType, final String returnValueName, final String transform) { return "final " + returnValueType + " " + returnValueName + " = " + "(" + returnValueType + ") " + (transform == null ? "" : transform) + "(" + getCoderInstanceName() + "." + popName + "(" + runtime + ", " + addr + "));"; } public final String getPushAddrStatementFor(final String runtime, final String addr, final String argumentName) { return getCoderInstanceName() + "." + pushName + "(" + runtime + ", " + addr + ", " + argumentName + ");"; } public String getCoderInstanceName() { return coderInstanceName; } public Coder getCoder() { return coder; } public String getDefaultReturnValue() { return "null"; } // // Specialized // static public class UnknownCoderDescriptor extends CoderDescriptor { public static final CoderDescriptor UNKNOWN_DESC = new UnknownCoderDescriptor(); public UnknownCoderDescriptor() { super(UnknownCoder.INST); } } static public class PrimitivePointerCoderDescriptor extends CoderDescriptor { public static final PrimitivePointerCoderDescriptor POINTER_DESC = new PrimitivePointerCoderDescriptor(); public PrimitivePointerCoderDescriptor() { super(PrimitivePointerCoder.INST, "push", "popPtr"); } } static public class PointerCoderDescriptor extends CoderDescriptor { public static final PointerCoderDescriptor INST = new PointerCoderDescriptor(); public PointerCoderDescriptor() { super(PointerCoder.INST); } } static public class SELCoderDescriptor extends CoderDescriptor { public static final SELCoderDescriptor INST = new SELCoderDescriptor(); public SELCoderDescriptor() { super(SELCoder.INST); } } static public class IDCoderDescriptor extends CoderDescriptor { public static final IDCoderDescriptor INST = new IDCoderDescriptor(); public IDCoderDescriptor() { super(IDCoder.INST); } } static public class NSClassCoderDescriptor extends CoderDescriptor { public static final NSClassCoderDescriptor INST = new NSClassCoderDescriptor(); public NSClassCoderDescriptor() { super(NSClassCoder.INST); } } static public class StructCoderDescriptor extends CoderDescriptor { public final JStruct jstruct; public StructCoderDescriptor(JStruct jst) { this.jstruct = jst; } @Override public String getCoderInstanceName(){ return jstruct.getJavaTypeName() + ".getStructCoder()"; } } }