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")) { 577284145d564fa8a422a8e564a38c730fb4a2962bAndy McFadden jniName += "J"; 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) { 200bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian printIfcheckPostamble(out, isBuffer, emitExceptionCheck, 201bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian "offset", "_remaining", iii); 202bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian } 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich void printIfcheckPostamble(PrintStream out, boolean isBuffer, boolean emitExceptionCheck, 205ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich String offset, String remaining, String iii) { 206bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(iii + " default:"); 207bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(iii + " _needed = 1;"); 208bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(iii + " break;"); 209bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(iii + "}"); 210bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian 211bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(iii + "if (" + remaining + " < _needed) {"); 212bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(iii + indent + "_exception = 1;"); 213bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(iii + indent + 214bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian "_exceptionType = \"java/lang/IllegalArgumentException\";"); 215bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(iii + indent + 216bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian "_exceptionMessage = \"" + 217bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian (isBuffer ? "remaining()" : "length - " + offset) + 218bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian " < needed\";"); 219bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(iii + indent + "goto exit;"); 220bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(iii + "}"); 221bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian 222bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian needsExit = true; 223bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian } 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 225b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos boolean isNullAllowed(CFunc cfunc, String cname) { 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) { 230b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (checks[index].equals("nullAllowed") && 231b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos checks[index + 1].equals(cname)) { 23266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return true; 23366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 23466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 23566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 23666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 23766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 23866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return false; 23966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 24066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 24166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer boolean hasCheckTest(CFunc cfunc) { 24266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String[] checks = mChecker.getChecks(cfunc.getName()); 24366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int index = 1; 24466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks != null) { 24566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while (index < checks.length) { 24666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].startsWith("check")) { 24766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return true; 24866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 24966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 25066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 25166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 25266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 25366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return false; 25466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 25566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 256b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos boolean hasCheckTest(CFunc cfunc, String cname) { 257b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos String[] checks = mChecker.getChecks(cfunc.getName()); 258b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos int index = 1; 259b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (checks != null) { 260b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos while (index < checks.length) { 261b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (checks[index].startsWith("check") && 262b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos cname != null && cname.equals(checks[index + 1])) { 263b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos return true; 264b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } else { 265b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos index = skipOneCheck(checks, index); 266b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 267b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 268b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 269b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos return false; 270b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 271b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 27266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer boolean hasIfTest(CFunc cfunc) { 27366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String[] checks = mChecker.getChecks(cfunc.getName()); 27466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int index = 1; 27566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks != null) { 27666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while (index < checks.length) { 27766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].startsWith("ifcheck")) { 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 28066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 28766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int skipOneCheck(String[] checks, int index) { 28866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].equals("return")) { 28966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 2; 29066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].startsWith("check")) { 29166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 3; 29266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].startsWith("sentinel")) { 29366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 3; 29466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].equals("ifcheck")) { 29566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 5; 29666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].equals("unsupported")) { 29766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 1; 29866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].equals("requires")) { 29966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 2; 30066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (checks[index].equals("nullAllowed")) { 301b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos index += 2; 30266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 30366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer System.out.println("Error: unknown keyword \"" + 30466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer checks[index] + "\""); 30566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer System.exit(0); 30666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 30766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 30866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return index; 30966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 31066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String getErrorReturnValue(CFunc cfunc) { 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CType returnType = cfunc.getType(); 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isVoid = returnType.isVoid(); 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isVoid) { 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return null; 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (returnType.getBaseType().startsWith("EGL")) { 31966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return "(" + returnType.getDeclaration() + ") 0"; 32066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 32166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String[] checks = mChecker.getChecks(cfunc.getName()); 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = 1; 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (checks != null) { 326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (index < checks.length) { 327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (checks[index].equals("return")) { 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return checks[index + 1]; 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 33066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return null; 336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isUnsupportedFunc(CFunc cfunc) { 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String[] checks = mChecker.getChecks(cfunc.getName()); 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int index = 1; 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (checks != null) { 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (index < checks.length) { 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (checks[index].equals("unsupported")) { 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 34666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 3529875750593aae7c2a62f33c620809d49162393ebElliott Hughes 353e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich String isRequiresFunc(CFunc cfunc) { 354e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich String[] checks = mChecker.getChecks(cfunc.getName()); 355e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich int index = 1; 356e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich if (checks != null) { 357e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich while (index < checks.length) { 35866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].equals("requires")) { 359e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich return checks[index+1]; 360e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } else { 36166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 362e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 363e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 364e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 365e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich return null; 366e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 3679875750593aae7c2a62f33c620809d49162393ebElliott Hughes 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project void emitNativeBoundsChecks(CFunc cfunc, String cname, PrintStream out, 369ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich boolean isBuffer, boolean emitExceptionCheck, String offset, String remaining, String iii) { 370ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 3719875750593aae7c2a62f33c620809d49162393ebElliott Hughes String[] checks = mChecker.getChecks(cfunc.getName()); 3729875750593aae7c2a62f33c620809d49162393ebElliott Hughes 3739875750593aae7c2a62f33c620809d49162393ebElliott Hughes boolean lastWasIfcheck = false; 3749875750593aae7c2a62f33c620809d49162393ebElliott Hughes 3759875750593aae7c2a62f33c620809d49162393ebElliott Hughes int index = 1; 3769875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (checks != null) { 3779875750593aae7c2a62f33c620809d49162393ebElliott Hughes while (index < checks.length) { 3789875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (checks[index].startsWith("check")) { 3799875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (lastWasIfcheck) { 3809875750593aae7c2a62f33c620809d49162393ebElliott Hughes printIfcheckPostamble(out, isBuffer, emitExceptionCheck, 3819875750593aae7c2a62f33c620809d49162393ebElliott Hughes offset, remaining, iii); 3829875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 3839875750593aae7c2a62f33c620809d49162393ebElliott Hughes lastWasIfcheck = false; 3849875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (cname != null && !cname.equals(checks[index + 1])) { 3859875750593aae7c2a62f33c620809d49162393ebElliott Hughes index += 3; 3869875750593aae7c2a62f33c620809d49162393ebElliott Hughes continue; 3879875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 3889875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + "if (" + remaining + " < " + checks[index + 2] + ") {"); 38966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "_exception = 1;"); 3909875750593aae7c2a62f33c620809d49162393ebElliott Hughes String exceptionClassName = "java/lang/IllegalArgumentException"; 391ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich // If the "check" keyword was of the form 392ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich // "check_<class name>", use the class name in the 393ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich // exception to be thrown 394ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich int underscore = checks[index].indexOf('_'); 395ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich if (underscore >= 0) { 3969875750593aae7c2a62f33c620809d49162393ebElliott Hughes String abbr = checks[index].substring(underscore + 1); 3979875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (abbr.equals("AIOOBE")) { 3989875750593aae7c2a62f33c620809d49162393ebElliott Hughes exceptionClassName = "java/lang/ArrayIndexOutOfBoundsException"; 399ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } else { 4009875750593aae7c2a62f33c620809d49162393ebElliott Hughes throw new RuntimeException("unknown exception abbreviation: " + abbr); 401ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 40366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + 40466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionType = \""+exceptionClassName+"\";"); 40566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + 40666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionMessage = \"" + 40766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (isBuffer ? "remaining()" : "length - " + 40866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer offset) + " < " + checks[index + 2] + 40966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer " < needed\";"); 4109875750593aae7c2a62f33c620809d49162393ebElliott Hughes 4119875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + indent + "goto exit;"); 4129875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + "}"); 4139875750593aae7c2a62f33c620809d49162393ebElliott Hughes 41466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer needsExit = true; 41566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 4169875750593aae7c2a62f33c620809d49162393ebElliott Hughes index += 3; 4179875750593aae7c2a62f33c620809d49162393ebElliott Hughes } else if (checks[index].equals("ifcheck")) { 4189875750593aae7c2a62f33c620809d49162393ebElliott Hughes String[] matches = checks[index + 4].split(","); 4196cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 4209875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (!lastWasIfcheck) { 4219875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + "int _needed;"); 4229875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + "switch (" + checks[index + 3] + ") {"); 4239875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 4249875750593aae7c2a62f33c620809d49162393ebElliott Hughes 4259875750593aae7c2a62f33c620809d49162393ebElliott Hughes for (int i = 0; i < matches.length; i++) { 4269875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println("#if defined(" + matches[i] + ")"); 4279875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + " case " + matches[i] + ":"); 4289875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println("#endif // defined(" + matches[i] + ")"); 4299875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 4309875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + " _needed = " + checks[index + 2] + ";"); 4319875750593aae7c2a62f33c620809d49162393ebElliott Hughes out.println(iii + " break;"); 4329875750593aae7c2a62f33c620809d49162393ebElliott Hughes 4339875750593aae7c2a62f33c620809d49162393ebElliott Hughes lastWasIfcheck = true; 4349875750593aae7c2a62f33c620809d49162393ebElliott Hughes index += 5; 4359875750593aae7c2a62f33c620809d49162393ebElliott Hughes } else { 43666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 4399875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 4409875750593aae7c2a62f33c620809d49162393ebElliott Hughes 4419875750593aae7c2a62f33c620809d49162393ebElliott Hughes if (lastWasIfcheck) { 4429875750593aae7c2a62f33c620809d49162393ebElliott Hughes printIfcheckPostamble(out, isBuffer, emitExceptionCheck, iii); 4439875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 4449875750593aae7c2a62f33c620809d49162393ebElliott Hughes } 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer void emitSentinelCheck(CFunc cfunc, String cname, PrintStream out, 44766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer boolean isBuffer, boolean emitExceptionCheck, String offset, String remaining, String iii) { 44866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 44966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String[] checks = mChecker.getChecks(cfunc.getName()); 45066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 45166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int index = 1; 45266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks != null) { 45366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while (index < checks.length) { 45466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].startsWith("sentinel")) { 45566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (cname != null && !cname.equals(checks[index + 1])) { 45666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 3; 45766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer continue; 45866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 45966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 46066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + cname + "_sentinel = false;"); 46166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + "for (int i = " + remaining + 46266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer " - 1; i >= 0; i--) {"); 46366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "if (" + cname + 46466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "[i] == " + checks[index + 2] + "){"); 46566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + indent + 46666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cname + "_sentinel = true;"); 46766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + indent + "break;"); 46866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "}"); 46966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + "}"); 47066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + 47166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "if (" + cname + "_sentinel == false) {"); 47266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "_exception = 1;"); 47366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + 47466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionType = \"java/lang/IllegalArgumentException\";"); 47566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "_exceptionMessage = \"" + cname + 47666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer " must contain " + checks[index + 2] + "!\";"); 47766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + "goto exit;"); 47866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + "}"); 47966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 48066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer needsExit = true; 48166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 3; 48266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 48366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 48466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 48566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 48666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 48766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 48866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 489b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos void emitStringCheck(CFunc cfunc, String cname, PrintStream out, String iii) { 490b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 491b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos String[] checks = mChecker.getChecks(cfunc.getName()); 492b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 493b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos int index = 1; 494b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (checks != null) { 495b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos while (index < checks.length) { 496b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (checks[index].startsWith("check")) { 497b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (cname != null && !cname.equals(checks[index + 1])) { 498b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos index += 3; 499b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos continue; 500b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 501b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(iii + "_stringlen = _env->GetStringUTFLength(" + cname + ");"); 502b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(iii + "if (" + checks[index + 2] + " > _stringlen) {"); 503b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(iii + indent + "_exception = 1;"); 504b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(iii + indent + 505b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "_exceptionType = \"java/lang/ArrayIndexOutOfBoundsException\";"); 506b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(iii + indent + 507b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "_exceptionMessage = \"length of " + cname + " is shorter than " + 508b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos checks[index + 2] + " argument\";"); 509b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(iii + indent + "goto exit;"); 510b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(iii + "}"); 511b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos index += 3; 512b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos needsExit = true; 513b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } else { 514b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos index = skipOneCheck(checks, index); 515b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 516b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 517b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 518b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 519b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 52066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer void emitLocalVariablesForSentinel(CFunc cfunc, PrintStream out) { 52166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 52266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String[] checks = mChecker.getChecks(cfunc.getName()); 52366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 52466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int index = 1; 52566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks != null) { 52666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer while (index < checks.length) { 52766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (checks[index].startsWith("sentinel")) { 52866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String cname = checks[index + 1]; 52966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "bool " + cname + "_sentinel = false;"); 53066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 53166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index += 3; 53266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 53366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 53466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer index = skipOneCheck(checks, index); 53566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 53666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 53766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 53866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 53966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 540ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich boolean hasNonConstArg(JFunc jfunc, CFunc cfunc, List<Integer> nonPrimitiveArgs) { 541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nonPrimitiveArgs.size() > 0) { 542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) { 543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int idx = nonPrimitiveArgs.get(i).intValue(); 544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cIndex = jfunc.getArgCIndex(idx); 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (jfunc.getArgType(idx).isArray()) { 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!cfunc.getArgType(cIndex).isConst()) { 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (jfunc.getArgType(idx).isBuffer()) { 550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!cfunc.getArgType(cIndex).isConst()) { 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return true; 552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 5596cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /** 561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Emit a function in several variants: 562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * if nativeDecl: public native <returntype> func(args); 564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * if !nativeDecl: 566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * if interfaceDecl: public <returntype> func(args); 567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * if !interfaceDecl: public <returntype> func(args) { body } 568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 569ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich void emitFunction(JFunc jfunc, PrintStream out, boolean nativeDecl, boolean interfaceDecl) { 57066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich boolean isPointerFunc = isPointerFunc(jfunc); 571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!nativeDecl && !interfaceDecl && !isPointerFunc) { 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If it's not a pointer function, we've already emitted it 574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // with nativeDecl == true 575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 578427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich String maybeStatic = mUseStaticMethods ? "static " : ""; 579427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich 580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 582427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich (nativeDecl ? "private " + maybeStatic +"native " : 583427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich (interfaceDecl ? "" : "public ") + maybeStatic) + 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getType() + " " + 585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getName() + 586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (nativeDecl ? "Bounds" : "") + 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "("); 588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 590427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich (nativeDecl ? "public " + maybeStatic +"native " : 591427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich (interfaceDecl ? "" : "public ") + maybeStatic) + 592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getType() + " " + 593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getName() + 594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "("); 595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 5966cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numArgs = jfunc.getNumArgs(); 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < numArgs; i++) { 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String argName = jfunc.getArgName(i); 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project JType argType = jfunc.getArgType(i); 6016cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(indent + indent + argType + " " + argName); 603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (i == numArgs - 1) { 604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc && nativeDecl) { 605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(","); 606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + indent + "int remaining"); 607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(","); 612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nativeDecl || interfaceDecl) { 616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + ");"); 617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + ") {"); 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String iii = indent + indent; 621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // emitBoundsChecks(jfunc, out, iii); 62346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich emitFunctionCall(jfunc, out, iii, false); 62446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich 62546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // Set the pointer after we call the native code, so that if 62646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // the native code throws an exception we don't modify the 62746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // pointer. We assume that the native code is written so that 62846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // if an exception is thrown, then the underlying glXXXPointer 62946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich // function will not have been called. 63046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich 631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String fname = jfunc.getName(); 632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // TODO - deal with VBO variants 634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (fname.equals("glColorPointer")) { 635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "if ((size == 4) &&"); 636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " ((type == GL_FLOAT) ||"); 637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_UNSIGNED_BYTE) ||"); 638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_FIXED)) &&"); 639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (stride >= 0)) {"); 640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + indent + "_colorPointer = pointer;"); 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "}"); 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (fname.equals("glNormalPointer")) { 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "if (((type == GL_FLOAT) ||"); 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_BYTE) ||"); 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_SHORT) ||"); 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_FIXED)) &&"); 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (stride >= 0)) {"); 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + indent + "_normalPointer = pointer;"); 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "}"); 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (fname.equals("glTexCoordPointer")) { 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "if (((size == 2) ||"); 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (size == 3) ||"); 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (size == 4)) &&"); 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " ((type == GL_FLOAT) ||"); 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_BYTE) ||"); 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_SHORT) ||"); 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_FIXED)) &&"); 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (stride >= 0)) {"); 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + indent + "_texCoordPointer = pointer;"); 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "}"); 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (fname.equals("glVertexPointer")) { 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "if (((size == 2) ||"); 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (size == 3) ||"); 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (size == 4)) &&"); 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " ((type == GL_FLOAT) ||"); 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_BYTE) ||"); 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_SHORT) ||"); 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (type == GL_FIXED)) &&"); 669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + " (stride >= 0)) {"); 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + indent + "_vertexPointer = pointer;"); 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(iii + "}"); 67266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich } else if (fname.equals("glPointSizePointerOES")) { 67366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "if (((type == GL_FLOAT) ||"); 67466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_FIXED)) &&"); 67566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (stride >= 0)) {"); 67666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + indent + "_pointSizePointerOES = pointer;"); 67766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "}"); 67866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich } else if (fname.equals("glMatrixIndexPointerOES")) { 67966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "if (((size == 2) ||"); 68066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (size == 3) ||"); 68166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (size == 4)) &&"); 68266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " ((type == GL_FLOAT) ||"); 68366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_BYTE) ||"); 68466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_SHORT) ||"); 68566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_FIXED)) &&"); 68666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (stride >= 0)) {"); 68766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + indent + "_matrixIndexPointerOES = pointer;"); 68866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "}"); 68966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich } else if (fname.equals("glWeightPointer")) { 69066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "if (((size == 2) ||"); 69166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (size == 3) ||"); 69266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (size == 4)) &&"); 69366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " ((type == GL_FLOAT) ||"); 69466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_BYTE) ||"); 69566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_SHORT) ||"); 69666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (type == GL_FIXED)) &&"); 69766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + " (stride >= 0)) {"); 69866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + indent + "_weightPointerOES = pointer;"); 69966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich out.println(iii + "}"); 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isVoid = jfunc.getType().isVoid(); 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isVoid) { 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + indent + "return _returnValue;"); 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "}"); 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 713ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich public void addNativeRegistration(String s) { 714ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich nativeRegistrations.add(s); 715ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } 7166cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 717427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich public void emitNativeRegistration(String registrationFunctionName, 718427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich PrintStream cStream) { 719ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println("static const char *classPathName = \"" + 720ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich mClassPathName + 721ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich "\";"); 722ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(); 723ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 724c4e95a3e5ee2076d0c9bb1f18920e31c325bf391Daniel Micay cStream.println("static const JNINativeMethod methods[] = {"); 725ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 726ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println("{\"_nativeClassInit\", \"()V\", (void*)nativeClassInit },"); 727ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 728ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich Iterator<String> i = nativeRegistrations.iterator(); 729ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich while (i.hasNext()) { 730ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(i.next()); 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 732ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 733ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println("};"); 734ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(); 735ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 736ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 737427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich cStream.println("int " + registrationFunctionName + "(JNIEnv *_env)"); 738ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println("{"); 739ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(indent + 740ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich "int err;"); 741ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 742ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(indent + 743ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich "err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));"); 744ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 745ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println(indent + "return err;"); 746ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich cStream.println("}"); 747ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich } 748ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich 749ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich public JniCodeEmitter() { 750ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich super(); 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String getJniType(JType jType) { 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (jType.isVoid()) { 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return "void"; 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String baseType = jType.getBaseType(); 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (jType.isPrimitive()) { 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (baseType.equals("String")) { 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return "jstring"; 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return "j" + baseType; 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (jType.isArray()) { 76666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer return jType.isClass() ? "jobjectArray" : "j" + baseType + "Array"; 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return "jobject"; 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 7716cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String getJniMangledName(String name) { 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name = name.replaceAll("_", "_1"); 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name = name.replaceAll(";", "_2"); 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name = name.replaceAll("\\[", "_3"); 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return name; 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project public void emitJniCode(JFunc jfunc, PrintStream out) { 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CFunc cfunc = jfunc.getCFunc(); 7816cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit comment identifying original C function 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Example: 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // /* void glClipPlanef ( GLenum plane, const GLfloat *equation ) */ 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("/* " + cfunc.getOriginal() + " */"); 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit JNI signature (name) 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Example: 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // void 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // android_glClipPlanef__I_3FI 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String outName = "android_" + jfunc.getName(); 79966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich boolean isPointerFunc = isPointerFunc(jfunc); 800071fc660597efdfa5ebc58b427252393e628a497Jesse Hall boolean isPointerOffsetFunc = 801071fc660597efdfa5ebc58b427252393e628a497Jesse Hall (outName.endsWith("Pointer") || outName.endsWith("PointerOES") || 802071fc660597efdfa5ebc58b427252393e628a497Jesse Hall outName.endsWith("glDrawElements") || 803071fc660597efdfa5ebc58b427252393e628a497Jesse Hall outName.endsWith("glDrawRangeElements") || 804071fc660597efdfa5ebc58b427252393e628a497Jesse Hall outName.endsWith("glTexImage2D") || 805071fc660597efdfa5ebc58b427252393e628a497Jesse Hall outName.endsWith("glTexSubImage2D") || 806071fc660597efdfa5ebc58b427252393e628a497Jesse Hall outName.endsWith("glCompressedTexImage2D") || 807071fc660597efdfa5ebc58b427252393e628a497Jesse Hall outName.endsWith("glCompressedTexSubImage2D") || 808071fc660597efdfa5ebc58b427252393e628a497Jesse Hall outName.endsWith("glTexImage3D") || 809071fc660597efdfa5ebc58b427252393e628a497Jesse Hall outName.endsWith("glTexSubImage3D") || 810071fc660597efdfa5ebc58b427252393e628a497Jesse Hall outName.endsWith("glCompressedTexImage3D") || 811071fc660597efdfa5ebc58b427252393e628a497Jesse Hall outName.endsWith("glCompressedTexSubImage3D") || 812071fc660597efdfa5ebc58b427252393e628a497Jesse Hall outName.endsWith("glReadPixels")) 813071fc660597efdfa5ebc58b427252393e628a497Jesse Hall && !jfunc.getCFunc().hasPointerArg(); 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project outName += "Bounds"; 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print("static "); 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(getJniType(jfunc.getType())); 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(outName); 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String rsignature = getJniName(jfunc.getType()); 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String signature = ""; 825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numArgs = jfunc.getNumArgs(); 826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < numArgs; i++) { 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project JType argType = jfunc.getArgType(i); 828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project signature += getJniName(argType); 829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project signature += "I"; 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Append signature to function name 83550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich String sig = getJniMangledName(signature).replace('.', '_').replace('/', '_'); 83666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (!mUseSimpleMethodNames) { 83766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.print("__" + sig); 83866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer outName += "__" + sig; 83966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 8406cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project signature = signature.replace('.', '/'); 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rsignature = rsignature.replace('.', '/'); 8436cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (rsignature.length() == 0) { 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rsignature = "V"; 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String s = "{\"" + 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getName() + 851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (isPointerFunc ? "Bounds" : "") + 852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "\", \"(" + signature +")" + 853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rsignature + 854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "\", (void *) " + 855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project outName + 856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project " },"; 857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nativeRegistrations.add(s); 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project List<Integer> nonPrimitiveArgs = new ArrayList<Integer>(); 86050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich List<Integer> stringArgs = new ArrayList<Integer>(); 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numBufferArgs = 0; 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project List<String> bufferArgNames = new ArrayList<String>(); 863569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi List<JType> bufferArgTypes = new ArrayList<JType>(); 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit JNI signature (arguments) 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Example: 868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // (JNIEnv *_env, jobject this, jint plane, jfloatArray equation_ref, jint offset) { 870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(" (JNIEnv *_env, jobject _this"); 872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < numArgs; i++) { 873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(", "); 874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project JType argType = jfunc.getArgType(i); 87566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String suffix = ""; 876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!argType.isPrimitive()) { 877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (argType.isArray()) { 878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project suffix = "_ref"; 87966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (argType.isBuffer()) { 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project suffix = "_buf"; 881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nonPrimitiveArgs.add(new Integer(i)); 883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (jfunc.getArgType(i).isBuffer()) { 884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cIndex = jfunc.getArgCIndex(i); 885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String cname = cfunc.getArgName(cIndex); 886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bufferArgNames.add(cname); 887569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi bufferArgTypes.add(jfunc.getArgType(i)); 888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project numBufferArgs++; 889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 89166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 89250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (argType.isString()) { 89350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich stringArgs.add(new Integer(i)); 89450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(getJniType(argType) + " " + jfunc.getArgName(i) + suffix); 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(", jint remaining"); 900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(") {"); 9026cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numArrays = 0; 904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int numBuffers = 0; 90550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int numStrings = 0; 906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < nonPrimitiveArgs.size(); i++) { 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int idx = nonPrimitiveArgs.get(i).intValue(); 90850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich JType argType = jfunc.getArgType(idx); 90950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (argType.isArray()) { 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ++numArrays; 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 91250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (argType.isBuffer()) { 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ++numBuffers; 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 91550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (argType.isString()) { 91650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich ++numStrings; 91750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit method body 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit local variable declarations for _exception and _returnValue 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Example: 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // android::gl::ogles_context_t *ctx; 9276cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich // 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // jint _exception; 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // GLenum _returnValue; 930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CType returnType = cfunc.getType(); 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isVoid = returnType.isVoid(); 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project boolean isUnsupported = isUnsupportedFunc(cfunc); 935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isUnsupported) { 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 9379875750593aae7c2a62f33c620809d49162393ebElliott Hughes "jniThrowException(_env, \"java/lang/UnsupportedOperationException\","); 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project " \"" + cfunc.getName() + "\");"); 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isVoid) { 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String retval = getErrorReturnValue(cfunc); 94266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (cfunc.getType().isEGLHandle()) { 94366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String baseType = cfunc.getType().getBaseType().toLowerCase(); 94466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + 94566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "return toEGLHandle(_env, " + baseType + "Class, " + 94666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer baseType + "Constructor, " + retval + ");"); 94766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 94866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "return " + retval + ";"); 94966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("}"); 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 9559875750593aae7c2a62f33c620809d49162393ebElliott Hughes 956e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich String requiresExtension = isRequiresFunc(cfunc); 957e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich if (requiresExtension != null) { 958e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich out.println(indent + 959e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich "if (! supportsExtension(_env, _this, have_" + requiresExtension + "ID)) {"); 960e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich out.println(indent + indent + 9619875750593aae7c2a62f33c620809d49162393ebElliott Hughes "jniThrowException(_env, \"java/lang/UnsupportedOperationException\","); 962e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich out.println(indent + indent + 963e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich " \"" + cfunc.getName() + "\");"); 964e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich if (isVoid) { 965e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich out.println(indent + indent + " return;"); 966e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } else { 967e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich String retval = getErrorReturnValue(cfunc); 96866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (cfunc.getType().isEGLHandle()) { 96966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String baseType = cfunc.getType().getBaseType().toLowerCase(); 97066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + 97166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "return toEGLHandle(_env, " + baseType + "Class, " + 97266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer baseType + "Constructor, " + retval + ");"); 97366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 97466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "return " + retval + ";"); 97566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 976e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 977e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich out.println(indent + "}"); 978e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich } 979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mUseContextPointer) { 980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "android::gl::ogles_context_t *ctx = getContext(_env, _this);"); 982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 98450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich boolean initializeReturnValue = stringArgs.size() > 0; 98566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer boolean emitExceptionCheck = ((numArrays > 0 || numStrings > 0) 98666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer && (hasNonConstArg(jfunc, cfunc, nonPrimitiveArgs) 98766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || (cfunc.hasPointerArg() && numArrays > 0)) 9887969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy || (numBufferArgs > 0) 98966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || hasCheckTest(cfunc) 99066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || hasIfTest(cfunc)) 99166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || (stringArgs.size() > 0); 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // mChecker.getChecks(cfunc.getName()) != null 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit an _exeption variable if there will be error checks 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (emitExceptionCheck) { 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "jint _exception = 0;"); 996bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(indent + "const char * _exceptionType = NULL;"); 997bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian out.println(indent + "const char * _exceptionMessage = NULL;"); 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit a single _array or multiple _XXXArray variables 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (numBufferArgs == 1) { 1002569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi JType bufferType = bufferArgTypes.get(0); 1003569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi if (bufferType.isTypedBuffer()) { 1004569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi String typedArrayType = getJniType(bufferType.getArrayTypeForTypedBuffer()); 1005569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + typedArrayType + " _array = (" + typedArrayType + ") 0;"); 1006569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi } else { 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "jarray _array = (jarray) 0;"); 1008569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi } 1009569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + "jint _bufferOffset = (jint) 0;"); 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < numBufferArgs; i++) { 1012569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi JType bufferType = bufferArgTypes.get(0); 1013569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi if (bufferType.isTypedBuffer()) { 1014569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi String typedArrayType = getJniType(bufferType.getArrayTypeForTypedBuffer()); 1015569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + typedArrayType + " _" + bufferArgNames.get(i) + 1016569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "Array = (" + typedArrayType + ") 0;"); 1017569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi } else { 1018569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + "jarray _" + bufferArgNames.get(i) + 1019569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "Array = (jarray) 0;"); 1020569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi } 1021e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer out.println(indent + "jint _" + bufferArgNames.get(i) + 1022e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "BufferOffset = (jint) 0;"); 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isVoid) { 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String retval = getErrorReturnValue(cfunc); 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (retval != null) { 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + returnType.getDeclaration() + 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project " _returnValue = " + retval + ";"); 103050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } else if (initializeReturnValue) { 103150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + returnType.getDeclaration() + 103266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer " _returnValue = 0;"); 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + returnType.getDeclaration() + 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project " _returnValue;"); 1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 103966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Emit local variable declarations for EGL Handles 104066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 104166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Example: 104266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 104366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // EGLSurface surface_native = (EGLHandle)fromEGLHandle(_env, surfaceClass, surfaceConstructor, surface); 104466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 104566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (nonPrimitiveArgs.size() > 0) { 104666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer for (int i = 0; i < nonPrimitiveArgs.size(); i++) { 104766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int idx = nonPrimitiveArgs.get(i).intValue(); 104866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int cIndex = jfunc.getArgCIndex(idx); 104966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String cname = cfunc.getArgName(cIndex); 105066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 105166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (jfunc.getArgType(idx).isBuffer() 105266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || jfunc.getArgType(idx).isArray() 105366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer || !jfunc.getArgType(idx).isEGLHandle()) 105466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer continue; 105566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 105666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer CType type = cfunc.getArgType(jfunc.getArgCIndex(idx)); 105766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String decl = type.getDeclaration(); 105866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + 105966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer decl + " " + cname + "_native = (" + 106066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer decl + ") fromEGLHandle(_env, " + 106166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer type.getBaseType().toLowerCase() + 106266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "GetHandleID, " + jfunc.getArgName(idx) + 106366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer ");"); 106466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 106566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 106666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 106766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Emit local variable declarations for element/sentinel checks 106866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 106966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Example: 107066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 107166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // bool attrib_list_sentinel_found = false; 107266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // 107366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emitLocalVariablesForSentinel(cfunc, out); 107466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit local variable declarations for pointer arguments 1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Example: 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // GLfixed *eqn_base; 1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // GLfixed *eqn; 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String offset = "offset"; 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String remaining = "_remaining"; 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nonPrimitiveArgs.size() > 0) { 1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < nonPrimitiveArgs.size(); i++) { 1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int idx = nonPrimitiveArgs.get(i).intValue(); 1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cIndex = jfunc.getArgCIndex(idx); 1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String cname = cfunc.getArgName(cIndex); 1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 109066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (!jfunc.getArgType(idx).isBuffer() && !jfunc.getArgType(idx).isArray()) 109166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer continue; 109266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CType type = cfunc.getArgType(jfunc.getArgCIndex(idx)); 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String decl = type.getDeclaration(); 109566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) { 1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project decl + 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (decl.endsWith("*") ? "" : " ") + 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getArgName(idx) + 1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_base = (" + decl + ") 0;"); 1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 110250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" : 1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_" + cname + "Remaining"; 1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "jint " + remaining + ";"); 1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 110766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer decl + 110866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (decl.endsWith("*") ? "" : " ") + 110966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer jfunc.getArgName(idx) + 111066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer " = (" + decl + ") 0;"); 1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 111650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich // Emit local variable declaration for strings 111750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (stringArgs.size() > 0) { 1118b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos boolean requiresStringLengthCheck = false; 111950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich for (int i = 0; i < stringArgs.size(); i++) { 112050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int idx = stringArgs.get(i).intValue(); 112150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int cIndex = jfunc.getArgCIndex(idx); 112250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich String cname = cfunc.getArgName(cIndex); 112350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 112450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + "const char* _native" + cname + " = 0;"); 1125b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (hasCheckTest(cfunc, cname)) { 1126b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos requiresStringLengthCheck = true; 1127b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 1128b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 1129b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 1130b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (requiresStringLengthCheck) { 1131b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "jsize _stringlen = 0;"); 113250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 113350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 113450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(); 113550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 113650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 113750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich // Null pointer checks and GetStringUTFChars 113850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (stringArgs.size() > 0) { 113950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich for (int i = 0; i < stringArgs.size(); i++) { 114050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int idx = stringArgs.get(i).intValue(); 114150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int cIndex = jfunc.getArgCIndex(idx); 114250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich String cname = cfunc.getArgName(cIndex); 114350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 1144b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos boolean nullAllowed = isNullAllowed(cfunc, cname); 1145b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos String nullAllowedIndent = nullAllowed ? indent : ""; 1146b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 114750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich CType type = cfunc.getArgType(jfunc.getArgCIndex(idx)); 114850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich String decl = type.getDeclaration(); 1149b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 1150b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (nullAllowed) { 1151b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "if (" + cname + ") {"); 1152b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } else { 1153b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos needsExit = true; 1154b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "if (!" + cname + ") {"); 1155b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + "_exception = 1;"); 1156b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + 115766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionType = \"java/lang/IllegalArgumentException\";"); 1158b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + 115966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_exceptionMessage = \"" + cname + " == null\";"); 1160b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + "goto exit;"); 1161b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "}"); 1162b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 1163b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 1164b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + "_native" + cname + 1165b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos " = _env->GetStringUTFChars(" + cname + ", 0);"); 1166b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 1167b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos emitStringCheck(cfunc, cname, out, nullAllowedIndent + indent); 116850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 1169b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (nullAllowed) { 1170b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "}"); 1171b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 117250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 117350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 117450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(); 117550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 117650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 117766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Emit 'GetPrimitiveArrayCritical' for non-object arrays 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Emit 'GetPointer' calls for Buffer pointers 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nonPrimitiveArgs.size() > 0) { 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < nonPrimitiveArgs.size(); i++) { 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int idx = nonPrimitiveArgs.get(i).intValue(); 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cIndex = jfunc.getArgCIndex(idx); 11836cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String cname = cfunc.getArgName(cIndex); 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project offset = numArrays <= 1 ? "offset" : 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cname + "Offset"; 118750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" : 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_" + cname + "Remaining"; 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1190b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos boolean nullAllowed = isNullAllowed(cfunc, cname); 1191b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos String nullAllowedIndent = nullAllowed ? indent : ""; 1192b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 119366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (jfunc.getArgType(idx).isArray() 119466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer && !jfunc.getArgType(idx).isEGLHandle()) { 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project needsExit = true; 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1197b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (nullAllowed) { 1198b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "if (" + cname + "_ref) {"); 1199b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 1200b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos else 1201b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos { 1202b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "if (!" + cname + "_ref) {"); 1203b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + "_exception = 1;"); 1204b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + 1205b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "_exceptionType = " + 1206b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "\"java/lang/IllegalArgumentException\";"); 1207b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + 1208b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "_exceptionMessage = \"" + cname + 1209b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos " == null\";"); 1210b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + "goto exit;"); 1211b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "}"); 1212b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 1213b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 1214b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + "if (" + offset + 1215b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos " < 0) {"); 1216b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + indent + 1217b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "_exception = 1;"); 1218b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + indent + 1219b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "_exceptionType = " + 1220b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "\"java/lang/IllegalArgumentException\";"); 1221b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + indent + 1222b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "_exceptionMessage = \"" + offset +" < 0\";"); 1223b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + indent + 1224b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "goto exit;"); 1225b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + "}"); 1226b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 1227b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + remaining + " = " + 1228b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos (mUseCPlusPlus ? "_env" : "(*_env)") + 1229b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "->GetArrayLength(" + 1230b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos (mUseCPlusPlus ? "" : "_env, ") + 1231b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos cname + "_ref) - " + offset + ";"); 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project emitNativeBoundsChecks(cfunc, cname, out, false, 1234b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos emitExceptionCheck, offset, remaining, 1235b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos nullAllowedIndent + indent); 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1237b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cname + 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_base = (" + 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cfunc.getArgType(cIndex).getDeclaration() + 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ")"); 1242569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi String arrayGetter = jfunc.getArgType(idx).getArrayGetterForPrimitiveArray(); 1243b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + " " + 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (mUseCPlusPlus ? "_env" : "(*_env)") + 1245569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "->" + arrayGetter + "(" + 12466cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich (mUseCPlusPlus ? "" : "_env, ") + 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getArgName(idx) + 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_ref, (jboolean *)0);"); 1249b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + 125066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cname + " = " + cname + "_base + " + offset + ";"); 125166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 125266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emitSentinelCheck(cfunc, cname, out, false, 1253b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos emitExceptionCheck, offset, remaining, 1254b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos nullAllowedIndent + indent); 1255b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 1256b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (nullAllowed) { 1257b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "}"); 1258b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 1259b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 126166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (jfunc.getArgType(idx).isArray() 126266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer && jfunc.getArgType(idx).isEGLHandle()) { 126366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer needsExit = true; 126466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 1265b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (nullAllowed) { 1266b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "if (" + cname + "_ref) {"); 1267b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 1268b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos else 1269b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos { 1270b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "if (!" + cname + "_ref) {"); 1271b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + "_exception = 1;"); 1272b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + "_exceptionType = " + 1273b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "\"java/lang/IllegalArgumentException\";"); 1274b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + "_exceptionMessage = \"" + 1275b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos cname +" == null\";"); 1276b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + indent + "goto exit;"); 1277b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "}"); 1278b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 1279b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 1280b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + "if (" + offset + 1281b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos " < 0) {"); 1282b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + indent + 1283b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "_exception = 1;"); 1284b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + indent + 1285b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "_exceptionType = " + 1286b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "\"java/lang/IllegalArgumentException\";"); 1287b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + indent + 1288b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "_exceptionMessage = \"" + offset +" < 0\";"); 1289b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + indent + 1290b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos "goto exit;"); 1291b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + "}"); 1292b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 1293b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + remaining + " = " + 129466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (mUseCPlusPlus ? "_env" : "(*_env)") + 129566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "->GetArrayLength(" + 129666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (mUseCPlusPlus ? "" : "_env, ") + 129766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cname + "_ref) - " + offset + ";"); 129866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer emitNativeBoundsChecks(cfunc, cname, out, false, 1299b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos emitExceptionCheck, offset, remaining, 1300b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos nullAllowedIndent + indent); 1301b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(nullAllowedIndent + indent + 130266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer jfunc.getArgName(idx) + " = new " + 130366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cfunc.getArgType(cIndex).getBaseType() + 130466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "["+ remaining + "];"); 1305b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 1306b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos if (nullAllowed) { 1307b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos out.println(indent + "}"); 1308b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos } 1309b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos 131066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(); 131166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else if (jfunc.getArgType(idx).isBuffer()) { 13127969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy needsExit = needsExit || (!nullAllowed && !isPointerFunc); 13137969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String array = numBufferArgs <= 1 ? "_array" : 1315e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "_" + cfunc.getArgName(cIndex) + "Array"; 1316e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" : 1317e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "_" + cfunc.getArgName(cIndex) + "BufferOffset"; 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1319b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos nullAllowed = nullAllowed || isPointerFunc; 1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nullAllowed) { 1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "if (" + cname + "_buf) {"); 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(indent); 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 13247969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy else 13257969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy { 13267969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy out.println(indent + "if (!" + cname + "_buf) {"); 13277969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy out.println(indent + indent + "_exception = 1;"); 13287969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy out.println(indent + indent + "_exceptionType = " + 13297969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy "\"java/lang/IllegalArgumentException\";"); 13307969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy out.println(indent + indent + "_exceptionMessage = \"" + 13317969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy cname +" == null\";"); 13327969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy out.println(indent + indent + "goto exit;"); 13337969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy out.println(indent + "}"); 13347969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy } 13356cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 133646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich if (isPointerFunc) { 133746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich out.println(indent + 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cname + 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project " = (" + 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project cfunc.getArgType(cIndex).getDeclaration() + 13416eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich ") getDirectBufferPointer(_env, " + 134246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich cname + "_buf);"); 134346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich String iii = " "; 13445afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich out.println(iii + indent + "if ( ! " + cname + " ) {"); 134566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(iii + indent + indent + "return;"); 134646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich out.println(iii + indent + "}"); 134746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich } else { 134846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich out.println(indent + 134946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich cname + 135046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich " = (" + 135146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich cfunc.getArgType(cIndex).getDeclaration() + 135246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich ")getPointer(_env, " + 135346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich cname + 1354569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "_buf, (jarray*)&" + array + ", &" + remaining + ", &" + bufferOffset + 135546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich ");"); 135646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich } 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13585afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich emitNativeBoundsChecks(cfunc, cname, out, true, 13595afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich emitExceptionCheck, 13605afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich offset, remaining, nullAllowed ? " " : " "); 13615afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nullAllowed) { 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "}"); 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1369e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer // Emit 'GetPrimitiveArrayCritical' for pointers if needed 1370e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer if (nonPrimitiveArgs.size() > 0) { 1371e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer for (int i = 0; i < nonPrimitiveArgs.size(); i++) { 1372e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer int idx = nonPrimitiveArgs.get(i).intValue(); 1373e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer int cIndex = jfunc.getArgCIndex(idx); 1374e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 1375e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer if(!jfunc.getArgType(idx).isBuffer() || isPointerFunc) continue; 1376e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 1377e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer String cname = cfunc.getArgName(cIndex); 1378e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" : 1379e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "_" + cname + "BufferOffset"; 1380e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer String array = numBufferArgs <= 1 ? "_array" : 1381e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "_" + cfunc.getArgName(cIndex) + "Array"; 1382e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 1383b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos boolean nullAllowed = isNullAllowed(cfunc, cname) || 1384b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos isPointerFunc; 138536b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer if (nullAllowed) { 138636b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer out.println(indent + "if (" + cname + "_buf && " + cname +" == NULL) {"); 138736b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer } else { 138836b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer out.println(indent + "if (" + cname +" == NULL) {"); 138936b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer } 1390569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi JType argType = jfunc.getArgType(idx); 1391569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi if (argType.isTypedBuffer()) { 1392569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi String arrayGetter = argType.getArrayTypeForTypedBuffer().getArrayGetterForPrimitiveArray(); 1393569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + indent + "char * _" + cname + "Base = (char *)_env->" + arrayGetter + "(" + array + ", (jboolean *) 0);"); 1394569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + indent + cname + " = (" +cfunc.getArgType(cIndex).getDeclaration() +") (_" + cname + "Base + " + bufferOffset + ");"); 1395569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + "}"); 1396569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi } else { 1397569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + indent + "char * _" + cname + "Base = (char *)_env->GetPrimitiveArrayCritical(" + array + ", (jboolean *) 0);"); 1398569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + indent + cname + " = (" +cfunc.getArgType(cIndex).getDeclaration() +") (_" + cname + "Base + " + bufferOffset + ");"); 1399569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + "}"); 1400569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi } 1401e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer } 1402e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer } 1403e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 1404e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isVoid) { 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(indent + "_returnValue = "); 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(indent); 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String name = cfunc.getName(); 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mUseContextPointer) { 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name = name.substring(2, name.length()); // Strip off 'gl' prefix 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name = name.substring(0, 1).toLowerCase() + 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project name.substring(1, name.length()); 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print("ctx->procs."); 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 14186cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(name + (isPointerFunc ? "Bounds" : "") + "("); 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14216cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich numArgs = cfunc.getNumArgs(); 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (numArgs == 0) { 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mUseContextPointer) { 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("ctx);"); 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(");"); 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mUseContextPointer) { 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("ctx,"); 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = 0; i < numArgs; i++) { 1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String typecast; 1436071fc660597efdfa5ebc58b427252393e628a497Jesse Hall if (i == numArgs - 1 && isPointerOffsetFunc) { 1437d8f096114da14f9793d4cca6022ca41b70ab9daaAshok Bhat typecast = "reinterpret_cast<GLvoid *>"; 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 143966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer typecast = "(" + cfunc.getArgType(i).getDeclaration() + ")"; 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.print(indent + indent + 144266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer typecast); 144366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 144450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (cfunc.getArgType(i).isConstCharPointer()) { 144550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.print("_native"); 144650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 144766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 1448e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer if (cfunc.getArgType(i).isEGLHandle() && 144966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer !cfunc.getArgType(i).isPointer()){ 145066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.print(cfunc.getArgName(i)+"_native"); 1451d8f096114da14f9793d4cca6022ca41b70ab9daaAshok Bhat } else if (i == numArgs - 1 && isPointerOffsetFunc){ 1452d8f096114da14f9793d4cca6022ca41b70ab9daaAshok Bhat out.print("("+cfunc.getArgName(i)+")"); 145366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 145466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.print(cfunc.getArgName(i)); 145566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (i == numArgs - 1) { 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (isPointerFunc) { 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(","); 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + indent + "(GLsizei)remaining"); 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(","); 1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + ");"); 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (needsExit) { 1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("exit:"); 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project needsExit = false; 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1477e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (nonPrimitiveArgs.size() > 0) { 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) { 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int idx = nonPrimitiveArgs.get(i).intValue(); 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int cIndex = jfunc.getArgCIndex(idx); 148366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) { 14846cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich 1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // If the argument is 'const', GL will not write to it. 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // In this case, we can use the 'JNI_ABORT' flag to avoid 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // the need to write back to the Java array 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "if (" + jfunc.getArgName(idx) + "_base) {"); 1490569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi String arrayReleaser = jfunc.getArgType(idx).getArrayReleaserForPrimitiveArray(); 1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + indent + 1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (mUseCPlusPlus ? "_env" : "(*_env)") + 1493569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "->" + arrayReleaser + "(" + 14946cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich (mUseCPlusPlus ? "" : "_env, ") + 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project jfunc.getArgName(idx) + "_ref, " + 1496569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "(j" + jfunc.getArgType(idx).getBaseType() + "*)" + cfunc.getArgName(cIndex) + 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "_base,"); 1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + indent + indent + 1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (cfunc.getArgType(cIndex).isConst() ? 150066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "JNI_ABORT" : "_exception ? JNI_ABORT: 0" ) + 1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ");"); 1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(indent + "}"); 1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else if (jfunc.getArgType(idx).isBuffer()) { 150446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich if (! isPointerFunc) { 1505569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi JType argType = jfunc.getArgType(idx); 150646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich String array = numBufferArgs <= 1 ? "_array" : 1507e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer "_" + cfunc.getArgName(cIndex) + "Array"; 150846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich out.println(indent + "if (" + array + ") {"); 1509569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi if (argType.isTypedBuffer()) { 1510569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi String arrayReleaser = 1511569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi argType.getArrayTypeForTypedBuffer().getArrayReleaserForPrimitiveArray(); 1512569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + indent + 1513569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "_env->" + arrayReleaser + "(" + array + ", " + 1514569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "(j" + argType.getArrayTypeForTypedBuffer().getBaseType() + "*)" + 1515569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi cfunc.getArgName(cIndex) + 1516569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi ", " + 1517569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi (cfunc.getArgType(cIndex).isConst() ? 1518569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "JNI_ABORT" : (emitExceptionCheck ? 1519569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "_exception ? JNI_ABORT : 0" : "0")) + 1520569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi ");"); 1521569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi } else { 1522569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi out.println(indent + indent + 1523569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "releasePointer(_env, " + array + ", " + 1524569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi cfunc.getArgName(cIndex) + 1525569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi ", " + 1526569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi (cfunc.getArgType(cIndex).isConst() ? 1527569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "JNI_FALSE" : (emitExceptionCheck ? 1528569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi "_exception ? JNI_FALSE : JNI_TRUE" : "JNI_TRUE")) + 1529569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi ");"); 1530569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi } 153146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich out.println(indent + "}"); 153246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich } 1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 153750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich // Emit local variable declaration for strings 153850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich if (stringArgs.size() > 0) { 153950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich for (int i = 0; i < stringArgs.size(); i++) { 154050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int idx = stringArgs.get(i).intValue(); 154150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich int cIndex = jfunc.getArgCIndex(idx); 154250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich String cname = cfunc.getArgName(cIndex); 154350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 154450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + "if (_native" + cname + ") {"); 154550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + " _env->ReleaseStringUTFChars(" + cname + ", _native" + cname + ");"); 154650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(indent + "}"); 154750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 154850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 154950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich out.println(); 155050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich } 155150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 155266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Copy results back to java arrays 155366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (nonPrimitiveArgs.size() > 0) { 155466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) { 155566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int idx = nonPrimitiveArgs.get(i).intValue(); 155666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer int cIndex = jfunc.getArgCIndex(idx); 155766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String baseType = cfunc.getArgType(cIndex).getBaseType().toLowerCase(); 155866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (jfunc.getArgType(idx).isArray() && jfunc.getArgType(idx).isClass()) { 155966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" : 156066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_" + cfunc.getArgName(cIndex) + "Remaining"; 156166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer offset = numArrays <= 1 ? "offset" : cfunc.getArgName(cIndex) + "Offset"; 156266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + 156366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "if (" + jfunc.getArgName(idx) + ") {"); 156466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 156566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "for (int i = 0; i < " + remaining + "; i++) {"); 156666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + indent + 156766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "jobject " + cfunc.getArgName(cIndex) + 156866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_new = toEGLHandle(_env, " + baseType + 156966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "Class, " + baseType + "Constructor, " + 157066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cfunc.getArgName(cIndex) + "[i]);"); 157166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + indent + 157266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (mUseCPlusPlus ? "_env" : "(*_env)") + 157366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "->SetObjectArrayElement(" + 157466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer (mUseCPlusPlus ? "" : "_env, ") + 157566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cfunc.getArgName(cIndex) + 157666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "_ref, i + " + offset + ", " + 157766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer cfunc.getArgName(cIndex) + "_new);"); 157866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + "}"); 157966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 158066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "delete[] " + jfunc.getArgName(idx) + ";"); 158166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "}"); 158266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 158366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 158466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 158566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 158666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 158766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer // Throw exception if there is one 158866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (emitExceptionCheck) { 158966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "if (_exception) {"); 159066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + indent + 159166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "jniThrowException(_env, _exceptionType, _exceptionMessage);"); 159266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + "}"); 159366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 159466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 159566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer 159650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich 1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!isVoid) { 159866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer if (cfunc.getType().isEGLHandle()) { 159966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer String baseType = cfunc.getType().getBaseType().toLowerCase(); 160066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer out.println(indent + 160166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer "return toEGLHandle(_env, " + baseType + "Class, " + 160266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer baseType + "Constructor, _returnValue);"); 160366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } else { 160468fc8bbced285a8a2b716e5fe1900968ad8ba7d3Jesse Hall out.println(indent + "return (" + 160568fc8bbced285a8a2b716e5fe1900968ad8ba7d3Jesse Hall getJniType(jfunc.getType()) + ")_returnValue;"); 160666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer } 1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println("}"); 1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project out.println(); 1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1614