1bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root/* 2bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Copyright (C) 2006 The Android Open Source Project 3bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * 4bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 5bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * you may not use this file except in compliance with the License. 6bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * You may obtain a copy of the License at 7bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * 8bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * http://www.apache.org/licenses/LICENSE-2.0 9bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * 10bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Unless required by applicable law or agreed to in writing, software 11bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * distributed under the License is distributed on an "AS IS" BASIS, 12bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * See the License for the specific language governing permissions and 14bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * limitations under the License. 15bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root */ 16bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.io.PrintStream; 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.ArrayList; 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.HashSet; 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.Iterator; 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.List; 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 23ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevichpublic class JniCodeEmitter { 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich static final boolean mUseCPlusPlus = true; 26ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich protected boolean mUseContextPointer = true; 27427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich protected boolean mUseStaticMethods = false; 2866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer protected boolean mUseSimpleMethodNames = false; 2966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer protected boolean mUseHideCommentForAPI = false; 30ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich protected String mClassPathName; 31ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich protected ParameterChecker mChecker; 32ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich protected List<String> nativeRegistrations = new ArrayList<String>(); 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean needsExit; 34ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich protected static String indent = " "; 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project HashSet<String> mFunctionsEmitted = new HashSet<String>(); 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 37ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich public static String getJniName(JType jType) { 38ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich String jniName = ""; 3966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (jType.isEGLHandle()) { 4066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return (jType.isArray() ? "[" : "" ) + "Landroid/opengl/" + jType.getBaseType() + ";"; 4166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (jType.isClass()) { 42ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich return "L" + jType.getBaseType() + ";"; 43ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } else if (jType.isArray()) { 44ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich jniName = "["; 45ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 47ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich String baseType = jType.getBaseType(); 48ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich if (baseType.equals("int")) { 49ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich jniName += "I"; 50ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } else if (baseType.equals("float")) { 51ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich jniName += "F"; 52ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } else if (baseType.equals("boolean")) { 53ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich jniName += "Z"; 54ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } else if (baseType.equals("short")) { 55ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich jniName += "S"; 56ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } else if (baseType.equals("long")) { 57ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich jniName += "L"; 58ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } else if (baseType.equals("byte")) { 59ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich jniName += "B"; 6050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } else if (baseType.equals("String")) { 6150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich jniName += "Ljava/lang/String;"; 6250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } else if (baseType.equals("void")) { 6350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich // nothing. 6450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } else { 659875750593aae7c2a62f33c620809d49162393ebElliott Hughes throw new RuntimeException("Unknown primitive basetype " + baseType); 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 67ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich return jniName; 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 70ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich public void emitCode(CFunc cfunc, String original, 71ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich PrintStream javaInterfaceStream, 72ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich PrintStream javaImplStream, 73ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich PrintStream cStream) { 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project JFunc jfunc; 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String signature; 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean duplicate; 776cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (cfunc.hasTypedPointerArg()) { 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc = JFunc.convert(cfunc, true); 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Don't emit duplicate functions 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // These may appear because they are defined in multiple 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Java interfaces (e.g., GL11/GL11ExtensionPack) 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project signature = jfunc.toString(); 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project duplicate = false; 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mFunctionsEmitted.contains(signature)) { 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project duplicate = true; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFunctionsEmitted.add(signature); 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!duplicate) { 93ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich emitNativeDeclaration(jfunc, javaImplStream); 94ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich emitJavaCode(jfunc, javaImplStream); 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 96427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich if (javaInterfaceStream != null) { 97427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich emitJavaInterfaceCode(jfunc, javaInterfaceStream); 98427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich } 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!duplicate) { 100ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich emitJniCode(jfunc, cStream); 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 10266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Don't create IOBuffer versions of the EGL functions 10366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (cfunc.hasEGLHandleArg()) { 10466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return; 10566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc = JFunc.convert(cfunc, false); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project signature = jfunc.toString(); 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project duplicate = false; 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mFunctionsEmitted.contains(signature)) { 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project duplicate = true; 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mFunctionsEmitted.add(signature); 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!duplicate) { 119ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich emitNativeDeclaration(jfunc, javaImplStream); 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 121427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich if (javaInterfaceStream != null) { 122427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich emitJavaInterfaceCode(jfunc, javaInterfaceStream); 123427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich } 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!duplicate) { 125ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich emitJavaCode(jfunc, javaImplStream); 126ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich emitJniCode(jfunc, cStream); 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project public void emitNativeDeclaration(JFunc jfunc, PrintStream out) { 13166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (mUseHideCommentForAPI) { 13266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(" /* @hide C function " + jfunc.getCFunc().getOriginal() + " */"); 13366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(); 13466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 13566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(" // C function " + jfunc.getCFunc().getOriginal()); 13666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(); 13766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project emitFunction(jfunc, out, true, false); 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project public void emitJavaInterfaceCode(JFunc jfunc, PrintStream out) { 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project emitFunction(jfunc, out, false, true); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project public void emitJavaCode(JFunc jfunc, PrintStream out) { 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project emitFunction(jfunc, out, false, false); 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1496cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 15066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich boolean isPointerFunc(JFunc jfunc) { 15166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich String name = jfunc.getName(); 15266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich return (name.endsWith("Pointer") || name.endsWith("PointerOES")) 15366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich && jfunc.getCFunc().hasPointerArg(); 15466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich } 15566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich 156ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich void emitFunctionCall(JFunc jfunc, PrintStream out, String iii, boolean grabArray) { 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isVoid = jfunc.getType().isVoid(); 15866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich boolean isPointerFunc = isPointerFunc(jfunc); 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isVoid) { 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getType() + " _returnValue;"); 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (isVoid ? "" : "_returnValue = ") + 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getName() + 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (isPointerFunc ? "Bounds" : "" ) + 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "("); 1696cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numArgs = jfunc.getNumArgs(); 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < numArgs; i++) { 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String argName = jfunc.getArgName(i); 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project JType argType = jfunc.getArgType(i); 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (grabArray && argType.isTypedBuffer()) { 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String typeName = argType.getBaseType(); 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project typeName = typeName.substring(9, typeName.length() - 6); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + indent + "get" + typeName + "Array(" + argName + "),"); 1796cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich out.print(iii + indent + "getOffset(" + argName + ")"); 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(iii + indent + argName); 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (i == numArgs - 1) { 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(","); 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + indent + argName + ".remaining()"); 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(","); 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1946cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + ");"); 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 198ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich void printIfcheckPostamble(PrintStream out, boolean isBuffer, boolean emitExceptionCheck, 199ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich String iii) { 200ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich printIfcheckPostamble(out, isBuffer, emitExceptionCheck, 201ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich "offset", "_remaining", iii); 202ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich void printIfcheckPostamble(PrintStream out, boolean isBuffer, boolean emitExceptionCheck, 205ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich String offset, String remaining, String iii) { 206ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich out.println(iii + " default:"); 207ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich out.println(iii + " _needed = 0;"); 208ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich out.println(iii + " break;"); 209ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich out.println(iii + "}"); 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 211ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich out.println(iii + "if (" + remaining + " < _needed) {"); 21266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "_exception = 1;"); 21366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + 21466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionType = \"java/lang/IllegalArgumentException\";"); 21566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + 21666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionMessage = \"" + 21766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (isBuffer ? "remaining()" : "length - " + offset) + 21866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer " < needed\";"); 219ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich out.println(iii + indent + "goto exit;"); 220ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich out.println(iii + "}"); 22166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 22266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer needsExit = true; 223ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isNullAllowed(CFunc cfunc) { 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String[] checks = mChecker.getChecks(cfunc.getName()); 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = 1; 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (checks != null) { 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (index < checks.length) { 23066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].equals("nullAllowed")) { 23166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return true; 23266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 23366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 23466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 23566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 23666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 23766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return false; 23866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 23966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 24066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer boolean hasCheckTest(CFunc cfunc) { 24166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String[] checks = mChecker.getChecks(cfunc.getName()); 24266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int index = 1; 24366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks != null) { 24466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while (index < checks.length) { 24566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].startsWith("check")) { 24666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return true; 24766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 24866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 24966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 25066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 25166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 25266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return false; 25366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 25466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 25566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer boolean hasIfTest(CFunc cfunc) { 25666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String[] checks = mChecker.getChecks(cfunc.getName()); 25766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int index = 1; 25866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks != null) { 25966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while (index < checks.length) { 26066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].startsWith("ifcheck")) { 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 26366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int skipOneCheck(String[] checks, int index) { 27166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].equals("return")) { 27266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 2; 27366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].startsWith("check")) { 27466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 3; 27566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].startsWith("sentinel")) { 27666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 3; 27766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].equals("ifcheck")) { 27866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 5; 27966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].equals("unsupported")) { 28066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 1; 28166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].equals("requires")) { 28266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 2; 28366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].equals("nullAllowed")) { 28466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 1; 28566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 28666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer System.out.println("Error: unknown keyword \"" + 28766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer checks[index] + "\""); 28866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer System.exit(0); 28966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 29066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 29166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return index; 29266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 29366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String getErrorReturnValue(CFunc cfunc) { 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CType returnType = cfunc.getType(); 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isVoid = returnType.isVoid(); 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isVoid) { 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return null; 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (returnType.getBaseType().startsWith("EGL")) { 30266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return "(" + returnType.getDeclaration() + ") 0"; 30366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 30466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String[] checks = mChecker.getChecks(cfunc.getName()); 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = 1; 308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (checks != null) { 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (index < checks.length) { 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (checks[index].equals("return")) { 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return checks[index + 1]; 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 31366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return null; 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isUnsupportedFunc(CFunc cfunc) { 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String[] checks = mChecker.getChecks(cfunc.getName()); 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = 1; 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (checks != null) { 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (index < checks.length) { 326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (checks[index].equals("unsupported")) { 327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 32966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 3359875750593aae7c2a62f33c620809d49162393ebElliott Hughes 336e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich String isRequiresFunc(CFunc cfunc) { 337e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich String[] checks = mChecker.getChecks(cfunc.getName()); 338e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich int index = 1; 339e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich if (checks != null) { 340e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich while (index < checks.length) { 34166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].equals("requires")) { 342e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich return checks[index+1]; 343e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } else { 34466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 345e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 346e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 347e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 348e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich return null; 349e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 3509875750593aae7c2a62f33c620809d49162393ebElliott Hughes 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void emitNativeBoundsChecks(CFunc cfunc, String cname, PrintStream out, 352ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich boolean isBuffer, boolean emitExceptionCheck, String offset, String remaining, String iii) { 353ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 3549875750593aae7c2a62f33c620809d49162393ebElliott Hughes String[] checks = mChecker.getChecks(cfunc.getName()); 3559875750593aae7c2a62f33c620809d49162393ebElliott Hughes 3569875750593aae7c2a62f33c620809d49162393ebElliott Hughes boolean lastWasIfcheck = false; 3579875750593aae7c2a62f33c620809d49162393ebElliott Hughes 3589875750593aae7c2a62f33c620809d49162393ebElliott Hughes int index = 1; 3599875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (checks != null) { 3609875750593aae7c2a62f33c620809d49162393ebElliott Hughes while (index < checks.length) { 3619875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (checks[index].startsWith("check")) { 3629875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (lastWasIfcheck) { 3639875750593aae7c2a62f33c620809d49162393ebElliott Hughes printIfcheckPostamble(out, isBuffer, emitExceptionCheck, 3649875750593aae7c2a62f33c620809d49162393ebElliott Hughes offset, remaining, iii); 3659875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 3669875750593aae7c2a62f33c620809d49162393ebElliott Hughes lastWasIfcheck = false; 3679875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (cname != null && !cname.equals(checks[index + 1])) { 3689875750593aae7c2a62f33c620809d49162393ebElliott Hughes index += 3; 3699875750593aae7c2a62f33c620809d49162393ebElliott Hughes continue; 3709875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 3719875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + "if (" + remaining + " < " + checks[index + 2] + ") {"); 37266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "_exception = 1;"); 3739875750593aae7c2a62f33c620809d49162393ebElliott Hughes String exceptionClassName = "java/lang/IllegalArgumentException"; 374ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich // If the "check" keyword was of the form 375ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich // "check_<class name>", use the class name in the 376ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich // exception to be thrown 377ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich int underscore = checks[index].indexOf('_'); 378ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich if (underscore >= 0) { 3799875750593aae7c2a62f33c620809d49162393ebElliott Hughes String abbr = checks[index].substring(underscore + 1); 3809875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (abbr.equals("AIOOBE")) { 3819875750593aae7c2a62f33c620809d49162393ebElliott Hughes exceptionClassName = "java/lang/ArrayIndexOutOfBoundsException"; 382ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } else { 3839875750593aae7c2a62f33c620809d49162393ebElliott Hughes throw new RuntimeException("unknown exception abbreviation: " + abbr); 384ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 38666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + 38766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionType = \""+exceptionClassName+"\";"); 38866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + 38966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionMessage = \"" + 39066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (isBuffer ? "remaining()" : "length - " + 39166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer offset) + " < " + checks[index + 2] + 39266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer " < needed\";"); 3939875750593aae7c2a62f33c620809d49162393ebElliott Hughes 3949875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + indent + "goto exit;"); 3959875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + "}"); 3969875750593aae7c2a62f33c620809d49162393ebElliott Hughes 39766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer needsExit = true; 39866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 3999875750593aae7c2a62f33c620809d49162393ebElliott Hughes index += 3; 4009875750593aae7c2a62f33c620809d49162393ebElliott Hughes } else if (checks[index].equals("ifcheck")) { 4019875750593aae7c2a62f33c620809d49162393ebElliott Hughes String[] matches = checks[index + 4].split(","); 4026cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 4039875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (!lastWasIfcheck) { 4049875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + "int _needed;"); 4059875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + "switch (" + checks[index + 3] + ") {"); 4069875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 4079875750593aae7c2a62f33c620809d49162393ebElliott Hughes 4089875750593aae7c2a62f33c620809d49162393ebElliott Hughes for (int i = 0; i < matches.length; i++) { 4099875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println("#if defined(" + matches[i] + ")"); 4109875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + " case " + matches[i] + ":"); 4119875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println("#endif // defined(" + matches[i] + ")"); 4129875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 4139875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + " _needed = " + checks[index + 2] + ";"); 4149875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + " break;"); 4159875750593aae7c2a62f33c620809d49162393ebElliott Hughes 4169875750593aae7c2a62f33c620809d49162393ebElliott Hughes lastWasIfcheck = true; 4179875750593aae7c2a62f33c620809d49162393ebElliott Hughes index += 5; 4189875750593aae7c2a62f33c620809d49162393ebElliott Hughes } else { 41966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 4229875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 4239875750593aae7c2a62f33c620809d49162393ebElliott Hughes 4249875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (lastWasIfcheck) { 4259875750593aae7c2a62f33c620809d49162393ebElliott Hughes printIfcheckPostamble(out, isBuffer, emitExceptionCheck, iii); 4269875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 4279875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer void emitSentinelCheck(CFunc cfunc, String cname, PrintStream out, 43066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer boolean isBuffer, boolean emitExceptionCheck, String offset, String remaining, String iii) { 43166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 43266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String[] checks = mChecker.getChecks(cfunc.getName()); 43366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 43466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int index = 1; 43566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks != null) { 43666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while (index < checks.length) { 43766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].startsWith("sentinel")) { 43866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (cname != null && !cname.equals(checks[index + 1])) { 43966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 3; 44066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer continue; 44166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 44266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 44366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + cname + "_sentinel = false;"); 44466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + "for (int i = " + remaining + 44566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer " - 1; i >= 0; i--) {"); 44666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "if (" + cname + 44766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "[i] == " + checks[index + 2] + "){"); 44866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + indent + 44966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cname + "_sentinel = true;"); 45066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + indent + "break;"); 45166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "}"); 45266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + "}"); 45366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + 45466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "if (" + cname + "_sentinel == false) {"); 45566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "_exception = 1;"); 45666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + 45766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionType = \"java/lang/IllegalArgumentException\";"); 45866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "_exceptionMessage = \"" + cname + 45966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer " must contain " + checks[index + 2] + "!\";"); 46066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "goto exit;"); 46166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + "}"); 46266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 46366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer needsExit = true; 46466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 3; 46566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 46666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 46766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 46866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 46966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 47066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 47166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 47266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer void emitLocalVariablesForSentinel(CFunc cfunc, PrintStream out) { 47366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 47466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String[] checks = mChecker.getChecks(cfunc.getName()); 47566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 47666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int index = 1; 47766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks != null) { 47866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while (index < checks.length) { 47966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].startsWith("sentinel")) { 48066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String cname = checks[index + 1]; 48166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "bool " + cname + "_sentinel = false;"); 48266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 48366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 3; 48466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 48566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 48666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 48766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 48866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 48966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 49066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 49166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 492ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich boolean hasNonConstArg(JFunc jfunc, CFunc cfunc, List<Integer> nonPrimitiveArgs) { 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nonPrimitiveArgs.size() > 0) { 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) { 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int idx = nonPrimitiveArgs.get(i).intValue(); 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cIndex = jfunc.getArgCIndex(idx); 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (jfunc.getArgType(idx).isArray()) { 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!cfunc.getArgType(cIndex).isConst()) { 499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (jfunc.getArgType(idx).isBuffer()) { 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!cfunc.getArgType(cIndex).isConst()) { 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 5116cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Emit a function in several variants: 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * if nativeDecl: public native <returntype> func(args); 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * if !nativeDecl: 518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * if interfaceDecl: public <returntype> func(args); 519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * if !interfaceDecl: public <returntype> func(args) { body } 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 521ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich void emitFunction(JFunc jfunc, PrintStream out, boolean nativeDecl, boolean interfaceDecl) { 52266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich boolean isPointerFunc = isPointerFunc(jfunc); 523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!nativeDecl && !interfaceDecl && !isPointerFunc) { 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If it's not a pointer function, we've already emitted it 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // with nativeDecl == true 527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 530427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich String maybeStatic = mUseStaticMethods ? "static " : ""; 531427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich 532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 534427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich (nativeDecl ? "private " + maybeStatic +"native " : 535427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich (interfaceDecl ? "" : "public ") + maybeStatic) + 536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getType() + " " + 537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getName() + 538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (nativeDecl ? "Bounds" : "") + 539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "("); 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 542427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich (nativeDecl ? "public " + maybeStatic +"native " : 543427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich (interfaceDecl ? "" : "public ") + maybeStatic) + 544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getType() + " " + 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getName() + 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "("); 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 5486cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numArgs = jfunc.getNumArgs(); 550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < numArgs; i++) { 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String argName = jfunc.getArgName(i); 552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project JType argType = jfunc.getArgType(i); 5536cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(indent + indent + argType + " " + argName); 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (i == numArgs - 1) { 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc && nativeDecl) { 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(","); 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + indent + "int remaining"); 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(","); 564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nativeDecl || interfaceDecl) { 568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + ");"); 569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + ") {"); 571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String iii = indent + indent; 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 57446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // emitBoundsChecks(jfunc, out, iii); 57546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich emitFunctionCall(jfunc, out, iii, false); 57646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich 57746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // Set the pointer after we call the native code, so that if 57846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // the native code throws an exception we don't modify the 57946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // pointer. We assume that the native code is written so that 58046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // if an exception is thrown, then the underlying glXXXPointer 58146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // function will not have been called. 58246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String fname = jfunc.getName(); 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO - deal with VBO variants 586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (fname.equals("glColorPointer")) { 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "if ((size == 4) &&"); 588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " ((type == GL_FLOAT) ||"); 589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_UNSIGNED_BYTE) ||"); 590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_FIXED)) &&"); 591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (stride >= 0)) {"); 592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + indent + "_colorPointer = pointer;"); 593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "}"); 594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (fname.equals("glNormalPointer")) { 595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "if (((type == GL_FLOAT) ||"); 596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_BYTE) ||"); 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_SHORT) ||"); 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_FIXED)) &&"); 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (stride >= 0)) {"); 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + indent + "_normalPointer = pointer;"); 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "}"); 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (fname.equals("glTexCoordPointer")) { 603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "if (((size == 2) ||"); 604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (size == 3) ||"); 605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (size == 4)) &&"); 606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " ((type == GL_FLOAT) ||"); 607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_BYTE) ||"); 608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_SHORT) ||"); 609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_FIXED)) &&"); 610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (stride >= 0)) {"); 611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + indent + "_texCoordPointer = pointer;"); 612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "}"); 613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (fname.equals("glVertexPointer")) { 614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "if (((size == 2) ||"); 615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (size == 3) ||"); 616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (size == 4)) &&"); 617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " ((type == GL_FLOAT) ||"); 618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_BYTE) ||"); 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_SHORT) ||"); 620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_FIXED)) &&"); 621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (stride >= 0)) {"); 622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + indent + "_vertexPointer = pointer;"); 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "}"); 62466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich } else if (fname.equals("glPointSizePointerOES")) { 62566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "if (((type == GL_FLOAT) ||"); 62666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_FIXED)) &&"); 62766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (stride >= 0)) {"); 62866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + indent + "_pointSizePointerOES = pointer;"); 62966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "}"); 63066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich } else if (fname.equals("glMatrixIndexPointerOES")) { 63166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "if (((size == 2) ||"); 63266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (size == 3) ||"); 63366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (size == 4)) &&"); 63466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " ((type == GL_FLOAT) ||"); 63566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_BYTE) ||"); 63666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_SHORT) ||"); 63766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_FIXED)) &&"); 63866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (stride >= 0)) {"); 63966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + indent + "_matrixIndexPointerOES = pointer;"); 64066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "}"); 64166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich } else if (fname.equals("glWeightPointer")) { 64266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "if (((size == 2) ||"); 64366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (size == 3) ||"); 64466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (size == 4)) &&"); 64566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " ((type == GL_FLOAT) ||"); 64666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_BYTE) ||"); 64766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_SHORT) ||"); 64866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_FIXED)) &&"); 64966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (stride >= 0)) {"); 65066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + indent + "_weightPointerOES = pointer;"); 65166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "}"); 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isVoid = jfunc.getType().isVoid(); 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isVoid) { 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + indent + "return _returnValue;"); 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "}"); 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 665ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich public void addNativeRegistration(String s) { 666ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich nativeRegistrations.add(s); 667ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } 6686cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 669427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich public void emitNativeRegistration(String registrationFunctionName, 670427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich PrintStream cStream) { 671ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println("static const char *classPathName = \"" + 672ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich mClassPathName + 673ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich "\";"); 674ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(); 675ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 676ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println("static JNINativeMethod methods[] = {"); 677ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 678ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println("{\"_nativeClassInit\", \"()V\", (void*)nativeClassInit },"); 679ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 680ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich Iterator<String> i = nativeRegistrations.iterator(); 681ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich while (i.hasNext()) { 682ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(i.next()); 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 684ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 685ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println("};"); 686ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(); 687ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 688ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 689427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich cStream.println("int " + registrationFunctionName + "(JNIEnv *_env)"); 690ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println("{"); 691ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(indent + 692ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich "int err;"); 693ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 694ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(indent + 695ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich "err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));"); 696ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 697ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(indent + "return err;"); 698ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println("}"); 699ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } 700ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 701ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich public JniCodeEmitter() { 702ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich super(); 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String getJniType(JType jType) { 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (jType.isVoid()) { 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return "void"; 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String baseType = jType.getBaseType(); 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (jType.isPrimitive()) { 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (baseType.equals("String")) { 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return "jstring"; 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return "j" + baseType; 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (jType.isArray()) { 71866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return jType.isClass() ? "jobjectArray" : "j" + baseType + "Array"; 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return "jobject"; 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 7236cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String getJniMangledName(String name) { 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name = name.replaceAll("_", "_1"); 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name = name.replaceAll(";", "_2"); 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name = name.replaceAll("\\[", "_3"); 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return name; 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project public void emitJniCode(JFunc jfunc, PrintStream out) { 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CFunc cfunc = jfunc.getCFunc(); 7336cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit comment identifying original C function 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Example: 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // /* void glClipPlanef ( GLenum plane, const GLfloat *equation ) */ 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("/* " + cfunc.getOriginal() + " */"); 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit JNI signature (name) 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Example: 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // void 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // android_glClipPlanef__I_3FI 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String outName = "android_" + jfunc.getName(); 75166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich boolean isPointerFunc = isPointerFunc(jfunc); 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isVBOPointerFunc = (outName.endsWith("Pointer") || 75366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich outName.endsWith("PointerOES") || 754b3ffef9dfe43a0b33aef57b279ab0e8b98df6e8cJack Palevich outName.endsWith("DrawElements") || outName.endsWith("VertexAttribPointer")) && 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project !jfunc.getCFunc().hasPointerArg(); 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project outName += "Bounds"; 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print("static "); 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(getJniType(jfunc.getType())); 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(outName); 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String rsignature = getJniName(jfunc.getType()); 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String signature = ""; 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numArgs = jfunc.getNumArgs(); 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < numArgs; i++) { 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project JType argType = jfunc.getArgType(i); 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project signature += getJniName(argType); 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project signature += "I"; 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Append signature to function name 77750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich String sig = getJniMangledName(signature).replace('.', '_').replace('/', '_'); 77866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (!mUseSimpleMethodNames) { 77966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.print("__" + sig); 78066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer outName += "__" + sig; 78166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 7826cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project signature = signature.replace('.', '/'); 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rsignature = rsignature.replace('.', '/'); 7856cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (rsignature.length() == 0) { 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rsignature = "V"; 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String s = "{\"" + 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getName() + 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (isPointerFunc ? "Bounds" : "") + 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "\", \"(" + signature +")" + 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rsignature + 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "\", (void *) " + 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project outName + 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project " },"; 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nativeRegistrations.add(s); 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project List<Integer> nonPrimitiveArgs = new ArrayList<Integer>(); 80250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich List<Integer> stringArgs = new ArrayList<Integer>(); 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numBufferArgs = 0; 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project List<String> bufferArgNames = new ArrayList<String>(); 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit JNI signature (arguments) 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Example: 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (JNIEnv *_env, jobject this, jint plane, jfloatArray equation_ref, jint offset) { 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(" (JNIEnv *_env, jobject _this"); 813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < numArgs; i++) { 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(", "); 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project JType argType = jfunc.getArgType(i); 81666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String suffix = ""; 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!argType.isPrimitive()) { 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (argType.isArray()) { 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project suffix = "_ref"; 82066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (argType.isBuffer()) { 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project suffix = "_buf"; 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nonPrimitiveArgs.add(new Integer(i)); 824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (jfunc.getArgType(i).isBuffer()) { 825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cIndex = jfunc.getArgCIndex(i); 826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String cname = cfunc.getArgName(cIndex); 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bufferArgNames.add(cname); 828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numBufferArgs++; 829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 83166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 83250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (argType.isString()) { 83350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich stringArgs.add(new Integer(i)); 83450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(getJniType(argType) + " " + jfunc.getArgName(i) + suffix); 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(", jint remaining"); 840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(") {"); 8426cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numArrays = 0; 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numBuffers = 0; 84550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int numStrings = 0; 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < nonPrimitiveArgs.size(); i++) { 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int idx = nonPrimitiveArgs.get(i).intValue(); 84850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich JType argType = jfunc.getArgType(idx); 84950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (argType.isArray()) { 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ++numArrays; 851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 85250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (argType.isBuffer()) { 853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ++numBuffers; 854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 85550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (argType.isString()) { 85650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich ++numStrings; 85750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit method body 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit local variable declarations for _exception and _returnValue 863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Example: 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // android::gl::ogles_context_t *ctx; 8676cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich // 868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // jint _exception; 869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // GLenum _returnValue; 870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CType returnType = cfunc.getType(); 872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isVoid = returnType.isVoid(); 873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isUnsupported = isUnsupportedFunc(cfunc); 875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isUnsupported) { 876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 8779875750593aae7c2a62f33c620809d49162393ebElliott Hughes "jniThrowException(_env, \"java/lang/UnsupportedOperationException\","); 878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project " \"" + cfunc.getName() + "\");"); 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isVoid) { 881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String retval = getErrorReturnValue(cfunc); 88266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (cfunc.getType().isEGLHandle()) { 88366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String baseType = cfunc.getType().getBaseType().toLowerCase(); 88466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + 88566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "return toEGLHandle(_env, " + baseType + "Class, " + 88666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer baseType + "Constructor, " + retval + ");"); 88766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 88866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "return " + retval + ";"); 88966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("}"); 892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 8959875750593aae7c2a62f33c620809d49162393ebElliott Hughes 896e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich String requiresExtension = isRequiresFunc(cfunc); 897e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich if (requiresExtension != null) { 898e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich out.println(indent + 899e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich "if (! supportsExtension(_env, _this, have_" + requiresExtension + "ID)) {"); 900e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich out.println(indent + indent + 9019875750593aae7c2a62f33c620809d49162393ebElliott Hughes "jniThrowException(_env, \"java/lang/UnsupportedOperationException\","); 902e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich out.println(indent + indent + 903e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich " \"" + cfunc.getName() + "\");"); 904e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich if (isVoid) { 905e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich out.println(indent + indent + " return;"); 906e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } else { 907e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich String retval = getErrorReturnValue(cfunc); 90866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (cfunc.getType().isEGLHandle()) { 90966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String baseType = cfunc.getType().getBaseType().toLowerCase(); 91066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + 91166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "return toEGLHandle(_env, " + baseType + "Class, " + 91266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer baseType + "Constructor, " + retval + ");"); 91366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 91466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "return " + retval + ";"); 91566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 916e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 917e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich out.println(indent + "}"); 918e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mUseContextPointer) { 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "android::gl::ogles_context_t *ctx = getContext(_env, _this);"); 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 92450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich boolean initializeReturnValue = stringArgs.size() > 0; 92566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer boolean emitExceptionCheck = ((numArrays > 0 || numStrings > 0) 92666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer && (hasNonConstArg(jfunc, cfunc, nonPrimitiveArgs) 92766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || (cfunc.hasPointerArg() && numArrays > 0)) 92866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || hasCheckTest(cfunc) 92966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || hasIfTest(cfunc)) 93066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || (stringArgs.size() > 0); 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mChecker.getChecks(cfunc.getName()) != null 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit an _exeption variable if there will be error checks 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (emitExceptionCheck) { 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "jint _exception = 0;"); 93566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "const char * _exceptionType;"); 93666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "const char * _exceptionMessage;"); 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit a single _array or multiple _XXXArray variables 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (numBufferArgs == 1) { 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "jarray _array = (jarray) 0;"); 942e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer out.println(indent + "jint _bufferOffset = (jint) 0;"); 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < numBufferArgs; i++) { 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "jarray _" + bufferArgNames.get(i) + 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "Array = (jarray) 0;"); 947e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer out.println(indent + "jint _" + bufferArgNames.get(i) + 948e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "BufferOffset = (jint) 0;"); 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isVoid) { 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String retval = getErrorReturnValue(cfunc); 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (retval != null) { 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + returnType.getDeclaration() + 955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project " _returnValue = " + retval + ";"); 95650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } else if (initializeReturnValue) { 95750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + returnType.getDeclaration() + 95866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer " _returnValue = 0;"); 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + returnType.getDeclaration() + 961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project " _returnValue;"); 962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 96566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Emit local variable declarations for EGL Handles 96666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 96766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Example: 96866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 96966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // EGLSurface surface_native = (EGLHandle)fromEGLHandle(_env, surfaceClass, surfaceConstructor, surface); 97066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 97166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (nonPrimitiveArgs.size() > 0) { 97266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer for (int i = 0; i < nonPrimitiveArgs.size(); i++) { 97366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int idx = nonPrimitiveArgs.get(i).intValue(); 97466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int cIndex = jfunc.getArgCIndex(idx); 97566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String cname = cfunc.getArgName(cIndex); 97666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 97766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (jfunc.getArgType(idx).isBuffer() 97866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || jfunc.getArgType(idx).isArray() 97966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || !jfunc.getArgType(idx).isEGLHandle()) 98066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer continue; 98166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 98266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer CType type = cfunc.getArgType(jfunc.getArgCIndex(idx)); 98366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String decl = type.getDeclaration(); 98466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + 98566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer decl + " " + cname + "_native = (" + 98666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer decl + ") fromEGLHandle(_env, " + 98766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer type.getBaseType().toLowerCase() + 98866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "GetHandleID, " + jfunc.getArgName(idx) + 98966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer ");"); 99066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 99166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 99266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 99366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Emit local variable declarations for element/sentinel checks 99466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 99566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Example: 99666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 99766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // bool attrib_list_sentinel_found = false; 99866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 99966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emitLocalVariablesForSentinel(cfunc, out); 100066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit local variable declarations for pointer arguments 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Example: 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // GLfixed *eqn_base; 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // GLfixed *eqn; 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String offset = "offset"; 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String remaining = "_remaining"; 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nonPrimitiveArgs.size() > 0) { 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < nonPrimitiveArgs.size(); i++) { 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int idx = nonPrimitiveArgs.get(i).intValue(); 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cIndex = jfunc.getArgCIndex(idx); 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String cname = cfunc.getArgName(cIndex); 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 101666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (!jfunc.getArgType(idx).isBuffer() && !jfunc.getArgType(idx).isArray()) 101766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer continue; 101866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CType type = cfunc.getArgType(jfunc.getArgCIndex(idx)); 1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String decl = type.getDeclaration(); 102166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) { 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project decl + 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (decl.endsWith("*") ? "" : " ") + 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getArgName(idx) + 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_base = (" + decl + ") 0;"); 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 102850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" : 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_" + cname + "Remaining"; 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "jint " + remaining + ";"); 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 103366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer decl + 103466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (decl.endsWith("*") ? "" : " ") + 103566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer jfunc.getArgName(idx) + 103666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer " = (" + decl + ") 0;"); 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 104250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich // Emit local variable declaration for strings 104350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (stringArgs.size() > 0) { 104450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich for (int i = 0; i < stringArgs.size(); i++) { 104550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int idx = stringArgs.get(i).intValue(); 104650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int cIndex = jfunc.getArgCIndex(idx); 104750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich String cname = cfunc.getArgName(cIndex); 104850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 104950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + "const char* _native" + cname + " = 0;"); 105050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 105150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 105250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(); 105350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 105450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 105550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich // Null pointer checks and GetStringUTFChars 105650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (stringArgs.size() > 0) { 105750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich for (int i = 0; i < stringArgs.size(); i++) { 105850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int idx = stringArgs.get(i).intValue(); 105950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int cIndex = jfunc.getArgCIndex(idx); 106050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich String cname = cfunc.getArgName(cIndex); 106150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 106250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich CType type = cfunc.getArgType(jfunc.getArgCIndex(idx)); 106350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich String decl = type.getDeclaration(); 106450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich needsExit = true; 106566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "if (!" + cname + ") {"); 106666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 106766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionType = \"java/lang/IllegalArgumentException\";"); 106866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 106966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionMessage = \"" + cname + " == null\";"); 107066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "goto exit;"); 107150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + "}"); 107250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 107350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + "_native" + cname + " = _env->GetStringUTFChars(" + cname + ", 0);"); 107450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 107550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 107650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(); 107750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 107850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 107966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Emit 'GetPrimitiveArrayCritical' for non-object arrays 1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit 'GetPointer' calls for Buffer pointers 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nonPrimitiveArgs.size() > 0) { 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < nonPrimitiveArgs.size(); i++) { 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int idx = nonPrimitiveArgs.get(i).intValue(); 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cIndex = jfunc.getArgCIndex(idx); 10856cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String cname = cfunc.getArgName(cIndex); 1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project offset = numArrays <= 1 ? "offset" : 1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cname + "Offset"; 108950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" : 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_" + cname + "Remaining"; 1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (jfunc.getArgType(idx).isArray() 109366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer && !jfunc.getArgType(idx).isEGLHandle()) { 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project needsExit = true; 109566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "if (!" + cname + "_ref) {"); 109666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "_exception = 1;"); 109766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 109866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionType = \"java/lang/IllegalArgumentException\";"); 109966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 110066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionMessage = \"" + cname +" == null\";"); 110166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "goto exit;"); 1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "}"); 1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "if (" + offset + " < 0) {"); 110466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "_exception = 1;"); 110566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 110666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionType = \"java/lang/IllegalArgumentException\";"); 110766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 110866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionMessage = \"" + offset +" < 0\";"); 110966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "goto exit;"); 1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "}"); 1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + remaining + " = " + 11136cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich (mUseCPlusPlus ? "_env" : "(*_env)") + 1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "->GetArrayLength(" + 1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (mUseCPlusPlus ? "" : "_env, ") + 1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cname + "_ref) - " + offset + ";"); 1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project emitNativeBoundsChecks(cfunc, cname, out, false, 1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project emitExceptionCheck, 1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project offset, remaining, " "); 1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cname + 1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_base = (" + 1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cfunc.getArgType(cIndex).getDeclaration() + 1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ")"); 1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + " " + 1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (mUseCPlusPlus ? "_env" : "(*_env)") + 1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "->GetPrimitiveArrayCritical(" + 11306cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich (mUseCPlusPlus ? "" : "_env, ") + 1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getArgName(idx) + 1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_ref, (jboolean *)0);"); 1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 113466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cname + " = " + cname + "_base + " + offset + ";"); 113566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 113666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emitSentinelCheck(cfunc, cname, out, false, 113766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emitExceptionCheck, offset, 113866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer remaining, indent); 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 114066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (jfunc.getArgType(idx).isArray() 114166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer && jfunc.getArgType(idx).isEGLHandle()) { 114266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer needsExit = true; 114366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "if (!" + cname + "_ref) {"); 114466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "_exception = 1;"); 114566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 114666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionType = \"java/lang/IllegalArgumentException\";"); 114766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "_exceptionMessage = \"" + cname +" == null\";"); 114866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "goto exit;"); 114966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "}"); 115066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "if (" + offset + " < 0) {"); 115166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "_exception = 1;"); 115266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 115366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionType = \"java/lang/IllegalArgumentException\";"); 115466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "_exceptionMessage = \"" + offset +" < 0\";"); 115566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "goto exit;"); 115666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "}"); 115766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 115866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + remaining + " = " + 115966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (mUseCPlusPlus ? "_env" : "(*_env)") + 116066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "->GetArrayLength(" + 116166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (mUseCPlusPlus ? "" : "_env, ") + 116266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cname + "_ref) - " + offset + ";"); 116366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emitNativeBoundsChecks(cfunc, cname, out, false, 116466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emitExceptionCheck, 116566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer offset, remaining, " "); 116666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + 116766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer jfunc.getArgName(idx) + " = new " + 116866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cfunc.getArgType(cIndex).getBaseType() + 116966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "["+ remaining + "];"); 117066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(); 117166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (jfunc.getArgType(idx).isBuffer()) { 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String array = numBufferArgs <= 1 ? "_array" : 1173e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "_" + cfunc.getArgName(cIndex) + "Array"; 1174e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" : 1175e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "_" + cfunc.getArgName(cIndex) + "BufferOffset"; 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 117746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich boolean nullAllowed = isNullAllowed(cfunc) || isPointerFunc; 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nullAllowed) { 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "if (" + cname + "_buf) {"); 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(indent); 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 11826cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 118346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich if (isPointerFunc) { 118446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich out.println(indent + 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cname + 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project " = (" + 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cfunc.getArgType(cIndex).getDeclaration() + 11886eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich ") getDirectBufferPointer(_env, " + 118946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich cname + "_buf);"); 119046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich String iii = " "; 11915afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich out.println(iii + indent + "if ( ! " + cname + " ) {"); 119266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + indent + "return;"); 119346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich out.println(iii + indent + "}"); 119446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich } else { 119546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich out.println(indent + 119646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich cname + 119746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich " = (" + 119846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich cfunc.getArgType(cIndex).getDeclaration() + 119946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich ")getPointer(_env, " + 120046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich cname + 1201e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "_buf, &" + array + ", &" + remaining + ", &" + bufferOffset + 120246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich ");"); 120346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich } 1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12055afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich emitNativeBoundsChecks(cfunc, cname, out, true, 12065afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich emitExceptionCheck, 12075afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich offset, remaining, nullAllowed ? " " : " "); 12085afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nullAllowed) { 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "}"); 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1216e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer // Emit 'GetPrimitiveArrayCritical' for pointers if needed 1217e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer if (nonPrimitiveArgs.size() > 0) { 1218e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer for (int i = 0; i < nonPrimitiveArgs.size(); i++) { 1219e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer int idx = nonPrimitiveArgs.get(i).intValue(); 1220e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer int cIndex = jfunc.getArgCIndex(idx); 1221e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 1222e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer if(!jfunc.getArgType(idx).isBuffer() || isPointerFunc) continue; 1223e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 1224e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer String cname = cfunc.getArgName(cIndex); 1225e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" : 1226e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "_" + cname + "BufferOffset"; 1227e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer String array = numBufferArgs <= 1 ? "_array" : 1228e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "_" + cfunc.getArgName(cIndex) + "Array"; 1229e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 123036b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer boolean nullAllowed = isNullAllowed(cfunc) || isPointerFunc; 123136b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer if (nullAllowed) { 123236b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer out.println(indent + "if (" + cname + "_buf && " + cname +" == NULL) {"); 123336b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer } else { 123436b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer out.println(indent + "if (" + cname +" == NULL) {"); 123536b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer } 1236e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer out.println(indent + indent + "char * _" + cname + "Base = (char *)_env->GetPrimitiveArrayCritical(" + array + ", (jboolean *) 0);"); 1237e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer out.println(indent + indent + cname + " = (" +cfunc.getArgType(cIndex).getDeclaration() +") (_" + cname + "Base + " + bufferOffset + ");"); 1238e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer out.println(indent + "}"); 1239e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer } 1240e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer } 1241e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 1242e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isVoid) { 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(indent + "_returnValue = "); 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(indent); 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String name = cfunc.getName(); 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mUseContextPointer) { 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name = name.substring(2, name.length()); // Strip off 'gl' prefix 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name = name.substring(0, 1).toLowerCase() + 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name.substring(1, name.length()); 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print("ctx->procs."); 1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 12566cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(name + (isPointerFunc ? "Bounds" : "") + "("); 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 12596cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich numArgs = cfunc.getNumArgs(); 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (numArgs == 0) { 1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mUseContextPointer) { 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("ctx);"); 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(");"); 1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mUseContextPointer) { 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("ctx,"); 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < numArgs; i++) { 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String typecast; 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (i == numArgs - 1 && isVBOPointerFunc) { 127566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer typecast = "(const GLvoid *)"; 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 127766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer typecast = "(" + cfunc.getArgType(i).getDeclaration() + ")"; 1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(indent + indent + 128066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer typecast); 128166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 128250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (cfunc.getArgType(i).isConstCharPointer()) { 128350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.print("_native"); 128450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 128566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 1286e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer if (cfunc.getArgType(i).isEGLHandle() && 128766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer !cfunc.getArgType(i).isPointer()){ 128866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.print(cfunc.getArgName(i)+"_native"); 128966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 129066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.print(cfunc.getArgName(i)); 129166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (i == numArgs - 1) { 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(","); 1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + indent + "(GLsizei)remaining"); 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(","); 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + ");"); 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (needsExit) { 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("exit:"); 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project needsExit = false; 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1313e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nonPrimitiveArgs.size() > 0) { 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) { 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int idx = nonPrimitiveArgs.get(i).intValue(); 1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cIndex = jfunc.getArgCIndex(idx); 131966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) { 13206cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If the argument is 'const', GL will not write to it. 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // In this case, we can use the 'JNI_ABORT' flag to avoid 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // the need to write back to the Java array 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "if (" + jfunc.getArgName(idx) + "_base) {"); 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + indent + 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (mUseCPlusPlus ? "_env" : "(*_env)") + 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "->ReleasePrimitiveArrayCritical(" + 13296cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich (mUseCPlusPlus ? "" : "_env, ") + 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getArgName(idx) + "_ref, " + 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cfunc.getArgName(cIndex) + 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_base,"); 1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + indent + indent + 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (cfunc.getArgType(cIndex).isConst() ? 133566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "JNI_ABORT" : "_exception ? JNI_ABORT: 0" ) + 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ");"); 1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "}"); 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (jfunc.getArgType(idx).isBuffer()) { 133946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich if (! isPointerFunc) { 134046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich String array = numBufferArgs <= 1 ? "_array" : 1341e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "_" + cfunc.getArgName(cIndex) + "Array"; 134246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich out.println(indent + "if (" + array + ") {"); 134346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich out.println(indent + indent + 134446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich "releasePointer(_env, " + array + ", " + 134546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich cfunc.getArgName(cIndex) + 134646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich ", " + 134746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich (cfunc.getArgType(cIndex).isConst() ? 134866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "JNI_FALSE" : (emitExceptionCheck ? 134966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exception ? JNI_FALSE : JNI_TRUE" : "JNI_TRUE")) + 135046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich ");"); 135146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich out.println(indent + "}"); 135246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich } 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 135750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich // Emit local variable declaration for strings 135850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (stringArgs.size() > 0) { 135950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich for (int i = 0; i < stringArgs.size(); i++) { 136050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int idx = stringArgs.get(i).intValue(); 136150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int cIndex = jfunc.getArgCIndex(idx); 136250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich String cname = cfunc.getArgName(cIndex); 136350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 136450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + "if (_native" + cname + ") {"); 136550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + " _env->ReleaseStringUTFChars(" + cname + ", _native" + cname + ");"); 136650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + "}"); 136750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 136850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 136950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(); 137050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 137150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 137266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Copy results back to java arrays 137366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (nonPrimitiveArgs.size() > 0) { 137466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) { 137566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int idx = nonPrimitiveArgs.get(i).intValue(); 137666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int cIndex = jfunc.getArgCIndex(idx); 137766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String baseType = cfunc.getArgType(cIndex).getBaseType().toLowerCase(); 137866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (jfunc.getArgType(idx).isArray() && jfunc.getArgType(idx).isClass()) { 137966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" : 138066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_" + cfunc.getArgName(cIndex) + "Remaining"; 138166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer offset = numArrays <= 1 ? "offset" : cfunc.getArgName(cIndex) + "Offset"; 138266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + 138366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "if (" + jfunc.getArgName(idx) + ") {"); 138466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 138566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "for (int i = 0; i < " + remaining + "; i++) {"); 138666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + indent + 138766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "jobject " + cfunc.getArgName(cIndex) + 138866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_new = toEGLHandle(_env, " + baseType + 138966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "Class, " + baseType + "Constructor, " + 139066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cfunc.getArgName(cIndex) + "[i]);"); 139166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + indent + 139266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (mUseCPlusPlus ? "_env" : "(*_env)") + 139366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "->SetObjectArrayElement(" + 139466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (mUseCPlusPlus ? "" : "_env, ") + 139566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cfunc.getArgName(cIndex) + 139666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_ref, i + " + offset + ", " + 139766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cfunc.getArgName(cIndex) + "_new);"); 139866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "}"); 139966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 140066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "delete[] " + jfunc.getArgName(idx) + ";"); 140166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "}"); 140266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 140366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 140466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 140566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 140666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 140766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Throw exception if there is one 140866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (emitExceptionCheck) { 140966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "if (_exception) {"); 141066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 141166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "jniThrowException(_env, _exceptionType, _exceptionMessage);"); 141266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "}"); 141366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 141466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 141566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 141650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isVoid) { 141866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (cfunc.getType().isEGLHandle()) { 141966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String baseType = cfunc.getType().getBaseType().toLowerCase(); 142066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + 142166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "return toEGLHandle(_env, " + baseType + "Class, " + 142266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer baseType + "Constructor, _returnValue);"); 142366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 142466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "return _returnValue;"); 142566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("}"); 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1433