diff options
Diffstat (limited to 'src/java/com/jogamp/gluegen/JavaConfiguration.java')
-rw-r--r-- | src/java/com/jogamp/gluegen/JavaConfiguration.java | 144 |
1 files changed, 93 insertions, 51 deletions
diff --git a/src/java/com/jogamp/gluegen/JavaConfiguration.java b/src/java/com/jogamp/gluegen/JavaConfiguration.java index 019ca2d..f392525 100644 --- a/src/java/com/jogamp/gluegen/JavaConfiguration.java +++ b/src/java/com/jogamp/gluegen/JavaConfiguration.java @@ -1,6 +1,6 @@ /* + * Copyright (c) 2010-2023 JogAmp Community. All rights reserved. * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. - * Copyright (c) 2010 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -138,8 +138,10 @@ public class JavaConfiguration { private final Map<String, MethodAccess> accessControl = new HashMap<String, MethodAccess>(); private final Map<String, TypeInfo> typeInfoMap = new HashMap<String, TypeInfo>(); private final Set<String> returnsString = new HashSet<String>(); + private final Set<String> returnsStringOnly = new HashSet<String>(); private final Map<String, JavaType> returnsOpaqueJType = new HashMap<String, JavaType>(); private final Map<String, String> returnedArrayLengths = new HashMap<String, String>(); + private final Set<String> maxOneElement = new HashSet<String>(); /** * Key is function that has some byte[] or short[] arguments that should be @@ -159,10 +161,9 @@ public class JavaConfiguration { private final Set<String> useNIOOnly = new HashSet<String>(); private boolean forceUseNIODirectOnly4All = false; private final Set<String> useNIODirectOnly = new HashSet<String>(); + private final Set<String> immutableAccessSymbols = new HashSet<String>(); private final Set<String> manuallyImplement = new HashSet<String>(); private final Map<String, String> delegatedImplementation = new HashMap<String, String>(); - private final Set<String> manualStaticInitCall = new HashSet<String>(); - private final Set<String> forceStaticInitCode = new HashSet<String>(); private final Map<String, List<String>> customJavaCode = new HashMap<String, List<String>>(); private final Map<String, List<String>> classJavadoc = new HashMap<String, List<String>>(); private final Map<String, List<String>> methodJavadoc = new HashMap<String, List<String>>(); @@ -520,10 +521,17 @@ public class JavaConfiguration { oneInSet(returnsString, symbol.getAliasedNames()); } + /** Indicates whether the given function (which returns a + <code>char*</code> in C) should be translated as returning a + <code>java.lang.String</code> only. Excluding other variants for struct field access. */ + public boolean returnsStringOnly(final String functionName) { + return returnsStringOnly.contains(functionName); + } + /** * Returns a MessageFormat string of the Java expression calculating * the number of elements in the returned array from the specified function - * name. The literal <code>1</code> indicates a single object. + * name or struct-field array-size. The literal <code>1</code> indicates a constant single object. * <p> * If symbol references a struct fields, see {@link #canonicalStructFieldSymbol(String, String)}, * it describes field's array-length or element-count referenced by a pointer. @@ -535,8 +543,17 @@ public class JavaConfiguration { * either {@link #returnValueCapacity(String)} or {@link #returnValueLength(String)}! * </p> */ - public String returnedArrayLength(final String functionName) { - return returnedArrayLengths.get(functionName); + public String returnedArrayLength(final String symbol) { + return returnedArrayLengths.get(symbol); + } + + /** + * Indicates whether the given symbol covers no or one single object. + * This is useful for struct-field pointer, indicating a null value + * holding no object or at most referincing memory for one single object. + */ + public boolean maxOneElement(final String symbol) { + return maxOneElement.contains(symbol); } /** Returns a list of <code>Integer</code>s which are the indices of <code>const char*</code> @@ -571,32 +588,6 @@ public class JavaConfiguration { return forceUseNIODirectOnly4All || useNIODirectOnly.contains(functionName); } - /** - * Returns true if the static initialization java code calling <code>initializeImpl()</code> - * for the given class will be manually implemented by the end user - * as requested via configuration directive <code>ManualStaticInitCall 'class-name'</code>. - */ - public boolean manualStaticInitCall(final String clazzName) { - return manualStaticInitCall.contains(clazzName); - } - - /** - * Returns true if the static initialization java code implementing <code>initializeImpl()</code> - * and the native code implementing: - * <pre> - * static jobject JVMUtil_NewDirectByteBufferCopy(JNIEnv *env, void * source_address, jlong capacity); - * </pre> - * for the given class will be included in the generated code, always, - * as requested via configuration directive <code>ForceStaticInitCode 'class-name'</code>. - * <p> - * If case above code has been generated, static class initialization is generated - * to call <code>initializeImpl()</code>, see {@link #manualStaticInitCall(String)}. - * </p> - */ - public boolean forceStaticInitCode(final String clazzName) { - return forceStaticInitCode.contains(clazzName); - } - /** Returns a list of Strings containing user-implemented code for the given Java type name (not fully-qualified, only the class name); returns either null or an empty list if there is no @@ -835,6 +826,43 @@ public class JavaConfiguration { } /** + * Returns true if the glue code for the given aliased symbol + * shall produce code for immutable access only. + * <p> + * This is implemented for whole struct-type symbols or struct-field names, + * where no setter methods will be produced if marked immutable. + * </p> + */ + public final boolean immutableAccess(final AliasedSymbol symbol) { + final String name = symbol.getName(); + final Set<String> aliases = symbol.getAliasedNames(); + + if ( immutableAccessSymbols.contains( name ) || + oneInSet(immutableAccessSymbols, aliases) + ) + { + LOG.log(INFO, getASTLocusTag(symbol), "Immutable access: {0}", symbol); + return true; + } + return false; + } + /** + * Returns true if the glue code for the given symbol + * shall produce code for immutable access only. + * <p> + * This is implemented for whole struct-type symbols or struct-field names, + * where no setter methods will be produced if marked immutable. + * </p> + */ + public final boolean immutableAccess(final String symbol) { + if ( immutableAccessSymbols.contains( symbol ) ) { + LOG.log(INFO, "Immutable access: {0}", symbol); + return true; + } + return false; + } + + /** * Variant of {@link #manuallyImplement(AliasedSymbol)}, * where this method only considers the {@link AliasedSymbol#getName() current-name} * of the given symbol, not the {@link #getJavaSymbolRename(String) renamed-symbol}. @@ -1257,12 +1285,16 @@ public class JavaConfiguration { readOpaque(tok, filename, lineNo); } else if (cmd.equalsIgnoreCase("ReturnsString")) { readReturnsString(tok, filename, lineNo); + } else if (cmd.equalsIgnoreCase("ReturnsStringOnly")) { + readReturnsStringOnly(tok, filename, lineNo); } else if (cmd.equalsIgnoreCase("ReturnsOpaque")) { readReturnsOpaque(tok, filename, lineNo); } else if (cmd.equalsIgnoreCase("ReturnedArrayLength")) { readReturnedArrayLength(tok, filename, lineNo); // Warning: make sure delimiters are reset at the top of this loop // because ReturnedArrayLength changes them. + } else if (cmd.equalsIgnoreCase("MaxOneElement")) { + readMaxOneElement(tok, filename, lineNo); } else if (cmd.equalsIgnoreCase("ArgumentIsString")) { readArgumentIsString(tok, filename, lineNo); } else if (cmd.equalsIgnoreCase("ExtendedInterfaceSymbolsIgnore")) { @@ -1287,12 +1319,10 @@ public class JavaConfiguration { readUnimplemented(tok, filename, lineNo); } else if (cmd.equalsIgnoreCase("IgnoreField")) { readIgnoreField(tok, filename, lineNo); + } else if (cmd.equalsIgnoreCase("ImmutableAccess")) { + readImmutableAccess(tok, filename, lineNo); } else if (cmd.equalsIgnoreCase("ManuallyImplement")) { readManuallyImplement(tok, filename, lineNo); - } else if (cmd.equalsIgnoreCase("ManualStaticInitCall")) { - readManualStaticInitCall(tok, filename, lineNo); - } else if (cmd.equalsIgnoreCase("ForceStaticInitCode")) { - readForceStaticInitCode(tok, filename, lineNo); } else if (cmd.equalsIgnoreCase("CustomJavaCode")) { readCustomJavaCode(tok, filename, lineNo); // Warning: make sure delimiters are reset at the top of this loop @@ -1476,6 +1506,16 @@ public class JavaConfiguration { } } + protected void readReturnsStringOnly(final StringTokenizer tok, final String filename, final int lineNo) { + try { + final String name = tok.nextToken(); + returnsStringOnly.add(name); + } catch (final NoSuchElementException e) { + throw new RuntimeException("Error parsing \"ReturnsStringOnly\" command at line " + lineNo + + " in file \"" + filename + "\"", e); + } + } + protected void readReturnedArrayLength(final StringTokenizer tok, final String filename, final int lineNo) { try { final String functionName = tok.nextToken(); @@ -1488,6 +1528,16 @@ public class JavaConfiguration { } } + protected void readMaxOneElement(final StringTokenizer tok, final String filename, final int lineNo) { + try { + final String name = tok.nextToken(); + maxOneElement.add(name); + } catch (final NoSuchElementException e) { + throw new RuntimeException("Error parsing \"MaxOneElement\" command at line " + lineNo + + " in file \"" + filename + "\"", e); + } + } + protected void readExtendedIntfImplSymbols(final StringTokenizer tok, final String filename, final int lineNo, final boolean forInterface, final boolean forImplementation, final boolean onlyList) { File javaFile; BufferedReader javaReader; @@ -1598,30 +1648,22 @@ public class JavaConfiguration { } } - protected void readManuallyImplement(final StringTokenizer tok, final String filename, final int lineNo) { + protected void readImmutableAccess(final StringTokenizer tok, final String filename, final int lineNo) { try { final String name = tok.nextToken(); - manuallyImplement.add(name); + immutableAccessSymbols.add(name); } catch (final NoSuchElementException e) { - throw new RuntimeException("Error parsing \"ManuallyImplement\" command at line " + lineNo + + throw new RuntimeException("Error parsing \"ImmutableAccess\" command at line " + lineNo + " in file \"" + filename + "\"", e); } } - protected void readManualStaticInitCall(final StringTokenizer tok, final String filename, final int lineNo) { - try { - final String name = tok.nextToken(); - manualStaticInitCall.add(name); - } catch (final NoSuchElementException e) { - throw new RuntimeException("Error parsing \"ManualStaticInitCall\" command at line " + lineNo + - " in file \"" + filename + "\"", e); - } - } - protected void readForceStaticInitCode(final StringTokenizer tok, final String filename, final int lineNo) { + + protected void readManuallyImplement(final StringTokenizer tok, final String filename, final int lineNo) { try { final String name = tok.nextToken(); - forceStaticInitCode.add(name); + manuallyImplement.add(name); } catch (final NoSuchElementException e) { - throw new RuntimeException("Error parsing \"ForceStaticInitCode\" command at line " + lineNo + + throw new RuntimeException("Error parsing \"ManuallyImplement\" command at line " + lineNo + " in file \"" + filename + "\"", e); } } |