diff options
Diffstat (limited to 'src/java/com/sun/gluegen/nativesig')
-rwxr-xr-x | src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java | 246 | ||||
-rwxr-xr-x | src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java | 8 |
2 files changed, 125 insertions, 129 deletions
diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java index 314a9bb..f20495b 100755 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java @@ -36,7 +36,6 @@ * Sun gratefully acknowledges that this software was originally authored * and developed by Kenneth Bradley Russell and Christopher John Kline. */ - package com.sun.gluegen.nativesig; import java.io.*; @@ -47,142 +46,141 @@ import com.sun.gluegen.cgram.types.*; import com.sun.gluegen.opengl.*; import com.sun.gluegen.procaddress.*; -/** Emitter producing NativeSignature attributes. */ - +/** + * Emitter producing NativeSignature attributes. + */ public class NativeSignatureEmitter extends GLEmitter { - protected List generateMethodBindingEmitters(HashSet/*<MethodBinding>*/ methodBindingSet, FunctionSymbol sym) throws Exception { - // Allow superclass to do most of the work for us - List res = super.generateMethodBindingEmitters(methodBindingSet, sym); - - // Filter out all non-JavaMethodBindingEmitters - for (Iterator iter = res.iterator(); iter.hasNext(); ) { - FunctionEmitter emitter = (FunctionEmitter) iter.next(); - if (!(emitter instanceof JavaMethodBindingEmitter)) { - iter.remove(); - } - } - if (res.isEmpty()) { - return res; - } + @Override + protected List<? extends FunctionEmitter> generateMethodBindingEmitters(Set<MethodBinding> methodBindingSet, FunctionSymbol sym) throws Exception { - PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + // Allow superclass to do most of the work for us + List<? extends FunctionEmitter> res = super.generateMethodBindingEmitters(methodBindingSet, sym); - List processed = new ArrayList(); + // Filter out all non-JavaMethodBindingEmitters + for (Iterator<? extends FunctionEmitter> iter = res.iterator(); iter.hasNext();) { + FunctionEmitter emitter = iter.next(); + if (!(emitter instanceof JavaMethodBindingEmitter)) { + iter.remove(); + } + } - // First, filter out all emitters going to the "other" (public) writer - for (Iterator iter = res.iterator(); iter.hasNext(); ) { - FunctionEmitter emitter = (FunctionEmitter) iter.next(); - if (emitter.getDefaultOutput() != writer) { - processed.add(emitter); - iter.remove(); - } - } + if (res.isEmpty()) { + return res; + } + + PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + + List<FunctionEmitter> processed = new ArrayList<FunctionEmitter>(); - // Now process all of the remaining emitters sorted by MethodBinding - while (!res.isEmpty()) { - List emittersForBinding = new ArrayList(); - JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) res.remove(0); - emittersForBinding.add(emitter); - MethodBinding binding = emitter.getBinding(); - for (Iterator iter = res.iterator(); iter.hasNext(); ) { - JavaMethodBindingEmitter emitter2 = (JavaMethodBindingEmitter) iter.next(); - if (emitter2.getBinding() == binding) { - emittersForBinding.add(emitter2); - iter.remove(); + // First, filter out all emitters going to the "other" (public) writer + for (Iterator<? extends FunctionEmitter> iter = res.iterator(); iter.hasNext();) { + FunctionEmitter emitter = iter.next(); + if (emitter.getDefaultOutput() != writer) { + processed.add(emitter); + iter.remove(); + } } - } - generateNativeSignatureEmitters(binding, emittersForBinding); - processed.addAll(emittersForBinding); - } - return processed; - } + // Now process all of the remaining emitters sorted by MethodBinding + while (!res.isEmpty()) { + List<JavaMethodBindingEmitter> emittersForBinding = new ArrayList<JavaMethodBindingEmitter>(); + JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) res.remove(0); + emittersForBinding.add(emitter); + MethodBinding binding = emitter.getBinding(); + for (Iterator<? extends FunctionEmitter> iter = res.iterator(); iter.hasNext();) { + JavaMethodBindingEmitter emitter2 = (JavaMethodBindingEmitter) iter.next(); + if (emitter2.getBinding() == binding) { + emittersForBinding.add(emitter2); + iter.remove(); + } + } + generateNativeSignatureEmitters(binding, emittersForBinding); + processed.addAll(emittersForBinding); + } - protected void generateNativeSignatureEmitters(MethodBinding binding, - List allEmitters) { - if (allEmitters.isEmpty()) { - return; + return processed; } - PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); - - // Give ourselves the chance to interpose on the generation of all code to keep things simple - List newEmitters = new ArrayList(); - for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { - JavaMethodBindingEmitter javaEmitter = (JavaMethodBindingEmitter) iter.next(); - NativeSignatureJavaMethodBindingEmitter newEmitter = null; - if (javaEmitter instanceof GLJavaMethodBindingEmitter) { - newEmitter = new NativeSignatureJavaMethodBindingEmitter((GLJavaMethodBindingEmitter) javaEmitter); - } else if (javaEmitter instanceof ProcAddressJavaMethodBindingEmitter) { - newEmitter = new NativeSignatureJavaMethodBindingEmitter((ProcAddressJavaMethodBindingEmitter) javaEmitter); - } else { - newEmitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter, this); - } - newEmitters.add(newEmitter); - } - allEmitters.clear(); - allEmitters.addAll(newEmitters); - - // Detect whether we need to produce more or modify some of these emitters. - // Note that at this point we are assuming that generatePublicEmitters has - // been called with signatureOnly both true and false. - if (signatureContainsStrings(binding) && - !haveEmitterWithBody(allEmitters)) { - // This basically handles glGetString but also any similar methods - NativeSignatureJavaMethodBindingEmitter javaEmitter = findEmitterWithWriter(allEmitters, writer); - - // First, we need to clone this emitter to produce the native - // entry point - NativeSignatureJavaMethodBindingEmitter emitter = - new NativeSignatureJavaMethodBindingEmitter(javaEmitter); - emitter.removeModifier(JavaMethodBindingEmitter.PUBLIC); - emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); - emitter.setForImplementingMethodCall(true); - // Note: this is chosen so we don't have to change the logic in - // emitReturnVariableSetupAndCall which decides which variant - // (direct / indirect) to call - emitter.setForDirectBufferImplementation(true); - allEmitters.add(emitter); - - // Now make the original emitter non-native and cause it to emit a body - javaEmitter.removeModifier(JavaMethodBindingEmitter.NATIVE); - javaEmitter.setEmitBody(true); - } - } - - protected boolean signatureContainsStrings(MethodBinding binding) { - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isString() || type.isStringArray()) { - return true; - } + protected void generateNativeSignatureEmitters(MethodBinding binding, List<JavaMethodBindingEmitter> allEmitters) { + + if (allEmitters.isEmpty()) { + return; + } + + PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + + // Give ourselves the chance to interpose on the generation of all code to keep things simple + List<JavaMethodBindingEmitter> newEmitters = new ArrayList<JavaMethodBindingEmitter>(); + for (JavaMethodBindingEmitter javaEmitter : allEmitters) { + NativeSignatureJavaMethodBindingEmitter newEmitter = null; + if (javaEmitter instanceof GLJavaMethodBindingEmitter) { + newEmitter = new NativeSignatureJavaMethodBindingEmitter((GLJavaMethodBindingEmitter) javaEmitter); + } else if (javaEmitter instanceof ProcAddressJavaMethodBindingEmitter) { + newEmitter = new NativeSignatureJavaMethodBindingEmitter((ProcAddressJavaMethodBindingEmitter) javaEmitter); + } else { + newEmitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter, this); + } + newEmitters.add(newEmitter); + } + allEmitters.clear(); + allEmitters.addAll(newEmitters); + + // Detect whether we need to produce more or modify some of these emitters. + // Note that at this point we are assuming that generatePublicEmitters has + // been called with signatureOnly both true and false. + if (signatureContainsStrings(binding) && !haveEmitterWithBody(allEmitters)) { + // This basically handles glGetString but also any similar methods + NativeSignatureJavaMethodBindingEmitter javaEmitter = findEmitterWithWriter(allEmitters, writer); + + // First, we need to clone this emitter to produce the native + // entry point + NativeSignatureJavaMethodBindingEmitter emitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter); + emitter.removeModifier(JavaMethodBindingEmitter.PUBLIC); + emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); + emitter.setForImplementingMethodCall(true); + // Note: this is chosen so we don't have to change the logic in + // emitReturnVariableSetupAndCall which decides which variant + // (direct / indirect) to call + emitter.setForDirectBufferImplementation(true); + allEmitters.add(emitter); + + // Now make the original emitter non-native and cause it to emit a body + javaEmitter.removeModifier(JavaMethodBindingEmitter.NATIVE); + javaEmitter.setEmitBody(true); + } } - JavaType retType = binding.getJavaReturnType(); - if (retType.isString() || retType.isStringArray()) { - return true; + + protected boolean signatureContainsStrings(MethodBinding binding) { + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isString() || type.isStringArray()) { + return true; + } + } + JavaType retType = binding.getJavaReturnType(); + if (retType.isString() || retType.isStringArray()) { + return true; + } + return false; } - return false; - } - - protected boolean haveEmitterWithBody(List allEmitters) { - for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { - JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) iter.next(); - if (!emitter.signatureOnly()) { - return true; - } + + protected boolean haveEmitterWithBody(List<JavaMethodBindingEmitter> allEmitters) { + for (JavaMethodBindingEmitter emitter : allEmitters) { + if (!emitter.signatureOnly()) { + return true; + } + } + return false; } - return false; - } - - protected NativeSignatureJavaMethodBindingEmitter findEmitterWithWriter(List allEmitters, PrintWriter writer) { - for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { - NativeSignatureJavaMethodBindingEmitter emitter = - (NativeSignatureJavaMethodBindingEmitter) iter.next(); - if (emitter.getDefaultOutput() == writer) { - return emitter; - } + + protected NativeSignatureJavaMethodBindingEmitter findEmitterWithWriter(List<JavaMethodBindingEmitter> allEmitters, PrintWriter writer) { + for (JavaMethodBindingEmitter jemitter : allEmitters) { + NativeSignatureJavaMethodBindingEmitter emitter = (NativeSignatureJavaMethodBindingEmitter)jemitter; + if (emitter.getDefaultOutput() == writer) { + return emitter; + } + } + throw new RuntimeException("Unexpectedly failed to find an emitter with the given writer"); } - throw new RuntimeException("Unexpectedly failed to find an emitter with the given writer"); - } } diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java index b4dc130..379eccf 100755 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java @@ -40,16 +40,14 @@ package com.sun.gluegen.nativesig; import java.io.*; -import java.util.*; -import java.text.MessageFormat; import com.sun.gluegen.*; import com.sun.gluegen.cgram.types.*; -import com.sun.gluegen.cgram.*; import com.sun.gluegen.opengl.*; import com.sun.gluegen.procaddress.*; public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBindingEmitter { + public NativeSignatureJavaMethodBindingEmitter(GLJavaMethodBindingEmitter methodToWrap) { super(methodToWrap); } @@ -58,11 +56,11 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding super(methodToWrap, false); } - public NativeSignatureJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap, - NativeSignatureEmitter emitter) { + public NativeSignatureJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap, NativeSignatureEmitter emitter) { super(methodToWrap, false, null, false, false, emitter); } + @Override protected void emitSignature(PrintWriter writer) { writer.print(getBaseIndentString()); emitNativeSignatureAnnotation(writer); |