blob: b7a734fa975462501b105385166e9b125dac122c [file] [log] [blame]
/*
* 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()"; }
}
}