1
/*******************************************************************************
2
* Copyright (c) 2009 Progress Software, Inc.
3
* Copyright (c) 2004, 2007 IBM Corporation and others.
5
* All rights reserved. This program and the accompanying materials
6
* are made available under the terms of the Eclipse Public License v1.0
7
* which accompanies this distribution, and is available at
8
* http://www.eclipse.org/legal/epl-v10.html
10
*******************************************************************************/
11
package org.fusesource.hawtjni.generator;
13
import java.lang.reflect.Modifier;
14
import java.util.List;
16
import org.fusesource.hawtjni.generator.model.JNIClass;
17
import org.fusesource.hawtjni.generator.model.JNIMethod;
21
* @author <a href="http://hiramchirino.com">Hiram Chirino</a>
23
public class StatsGenerator extends JNIGenerator {
27
public StatsGenerator(boolean header) {
31
public void generateCopyright() {
32
outputln(fixDelimiter(getCopyright()));
35
public void generateIncludes() {
37
outputln("#include \"hawtjni.h\"");
38
outputln("#include \""+getOutputName()+"_stats.h\"");
43
public void generate(JNIClass clazz) {
45
generateHeaderFile(clazz);
47
generateSourceFile(clazz);
51
void generateHeaderFile(JNIClass clazz) {
52
generateNATIVEMacros(clazz);
53
List<JNIMethod> methods = clazz.getDeclaredMethods();
55
generateFunctionEnum(methods);
58
void generateNATIVEMacros(JNIClass clazz) {
59
String className = clazz.getSimpleName();
60
outputln("#ifdef NATIVE_STATS");
61
output("extern int ");
63
outputln("_nativeFunctionCount;");
64
output("extern int ");
66
outputln("_nativeFunctionCallCount[];");
67
output("extern char* ");
69
outputln("_nativeFunctionNames[];");
72
output("_NATIVE_ENTER(env, that, func) ");
74
outputln("_nativeFunctionCallCount[func]++;");
77
outputln("_NATIVE_EXIT(env, that, func) ");
81
outputln("_NATIVE_ENTER");
84
outputln("_NATIVE_ENTER(env, that, func) ");
88
outputln("_NATIVE_EXIT");
91
outputln("_NATIVE_EXIT(env, that, func) ");
97
void generateSourceFile(JNIClass clazz) {
98
outputln("#ifdef NATIVE_STATS");
100
List<JNIMethod> methods = clazz.getDeclaredMethods();
102
for (JNIMethod method : methods) {
103
if ((method.getModifiers() & Modifier.NATIVE) == 0)
107
String className = clazz.getSimpleName();
110
output("_nativeFunctionCount = ");
111
output(String.valueOf(methodCount));
115
output("_nativeFunctionCallCount[");
116
output(String.valueOf(methodCount));
120
outputln("_nativeFunctionNames[] = {");
121
sortMethods(methods);
122
for (JNIMethod method : methods) {
123
if ((method.getModifiers() & Modifier.NATIVE) == 0)
125
String function = getFunctionName(method), function64 = getFunctionName(method, method.getParameterTypes64());
126
if (!function.equals(function64)) {
134
if (!function.equals(function64)) {
141
if (progress != null)
146
generateStatsNatives(className);
151
void generateStatsNatives(String className) {
152
outputln("#define STATS_NATIVE(func) Java_org_fusesource_hawtjni_runtime_NativeStats_##func");
155
output("JNIEXPORT jint JNICALL STATS_NATIVE(");
156
output(toC(className + "_GetFunctionCount"));
158
outputln("\t(JNIEnv *env, jclass that)");
162
outputln("_nativeFunctionCount;");
166
output("JNIEXPORT jstring JNICALL STATS_NATIVE(");
167
output(toC(className + "_GetFunctionName"));
169
outputln("\t(JNIEnv *env, jclass that, jint index)");
173
output("env->NewStringUTF(");
175
output("(*env)->NewStringUTF(env, ");
178
outputln("_nativeFunctionNames[index]);");
182
output("JNIEXPORT jint JNICALL STATS_NATIVE(");
183
output(toC(className + "_GetFunctionCallCount"));
185
outputln("\t(JNIEnv *env, jclass that, jint index)");
189
outputln("_nativeFunctionCallCount[index];");
193
void generateFunctionEnum(List<JNIMethod> methods) {
194
if (methods.isEmpty())
196
outputln("typedef enum {");
197
for (JNIMethod method : methods) {
198
if ((method.getModifiers() & Modifier.NATIVE) == 0)
200
String function = getFunctionName(method), function64 = getFunctionName(method, method.getParameterTypes64());
201
if (!function.equals(function64)) {
207
output(method.getDeclaringClass().getSimpleName()+"_"+function);
209
if (!function.equals(function64)) {
212
output(method.getDeclaringClass().getSimpleName()+"_"+function64);
216
if (progress != null)
219
JNIClass clazz = methods.get(0).getDeclaringClass();
221
output(clazz.getSimpleName());