blob: 95a1e9faeec3f37fe9a7da97880e4c59c24a0063 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.tools.internal;
import java.lang.reflect.*;
public class StatsGenerator extends JNIGenerator {
public StatsGenerator() {
}
public void generate(Class clazz) {
generateHeaderFile(clazz);
generateSourceFile(clazz);
}
public void generate(Method[] methods) {
sort(methods);
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
generateStringArray(method);
}
}
public void generateHeaderFile(Class clazz){
generateNATIVEMacros(clazz);
Method[] methods = clazz.getDeclaredMethods();
generateHeaderFile(methods);
}
public void generateHeaderFile(Class[] classes) {
if (classes.length == 0) return;
sort(classes);
generateMetaData("swt_copyright");
for (int i = 0; i < classes.length; i++) {
Class clazz = classes[i];
ClassData classData = getMetaData().getMetaData(clazz);
if (classData.getFlag("no_gen")) continue;
generateHeaderFile(clazz);
}
}
void generateNATIVEMacros(Class clazz) {
String className = getClassName(clazz);
output("#ifdef NATIVE_STATS");
outputDelimiter();
output("int ");
output(className);
output("_nativeFunctionCallCount[];");
outputDelimiter();
output("char* ");
output(className);
output("_nativeFunctionNames[];");
outputDelimiter();
output("#define ");
output(className);
output("_NATIVE_ENTER(env, that, func) ");
output(className);
output("_nativeFunctionCallCount[func]++;");
outputDelimiter();
output("#define ");
output(className);
output("_NATIVE_EXIT(env, that, func) ");
outputDelimiter();
output("#else");
outputDelimiter();
output("#define ");
output(className);
output("_NATIVE_ENTER(env, that, func) ");
outputDelimiter();
output("#define ");
output(className);
output("_NATIVE_EXIT(env, that, func) ");
outputDelimiter();
output("#endif");
outputDelimiter();
outputDelimiter();
}
public void generateHeaderFile(Method[] methods) {
sort(methods);
generateDefines(methods);
}
public void generateSourceFile(Class[] classes) {
if (classes.length == 0) return;
sort(classes);
generateMetaData("swt_copyright");
generateMetaData("swt_includes");
output("#ifdef NATIVE_STATS");
outputDelimiter();
outputDelimiter();
for (int i = 0; i < classes.length; i++) {
Class clazz = classes[i];
ClassData classData = getMetaData().getMetaData(clazz);
if (classData.getFlag("no_gen")) continue;
generateSourceFile(clazz);
}
outputDelimiter();
output("#endif");
outputDelimiter();
}
public void generateSourceFile(Class clazz) {
Method[] methods = clazz.getDeclaredMethods();
int methodCount = 0;
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
methodCount++;
}
String className = getClassName(clazz);
output("int ");
output(className);
output("_nativeFunctionCount = ");
output(String.valueOf(methodCount));
output(";");
outputDelimiter();
output("int ");
output(className);
output("_nativeFunctionCallCount[");
output(String.valueOf(methodCount));
output("];");
outputDelimiter();
output("char * ");
output(className);
output("_nativeFunctionNames[] = {");
outputDelimiter();
generate(methods);
output("};");
outputDelimiter();
}
void generateStringArray(Method method) {
output("\t\"" + getFunctionName(method) + "\", ");
outputDelimiter();
}
void generateDefines(Method[] methods) {
int methodCount = 0;
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
if ((method.getModifiers() & Modifier.NATIVE) == 0) continue;
output("#define " + getFunctionName(method) + "_FUNC " + methodCount);
methodCount++;
outputDelimiter();
}
}
}