Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(657)

Unified Diff: base/android/jni_generator/jni_generator.py

Issue 2361353002: Link stack frames of JNI stubs to JNI callbacks. (Closed)
Patch Set: git cl format Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/android/jni_generator/jni_generator.py
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py
index 007fedf77fe0138aa3cc3c5722def6bda287a76a..428c4939ae82c879dcf8f4c146c1deab21c33a9e 100755
--- a/base/android/jni_generator/jni_generator.py
+++ b/base/android/jni_generator/jni_generator.py
@@ -524,6 +524,11 @@ RE_CALLED_BY_NATIVE = re.compile(
'\s*\((?P<params>[^\)]*)\)')
+# Removes empty lines that are indented (i.e. start with 2x spaces).
+def RemoveIndentedEmptyLines(string):
+ return re.sub('^(?: {2})+$\n', '', string, flags=re.MULTILINE)
+
+
def ExtractCalledByNatives(contents):
"""Parses all methods annotated with @CalledByNative.
@@ -1001,6 +1006,9 @@ ${NATIVES}
post_call = '.Release()'
return_declaration = ('base::android::ScopedJavaLocalRef<' + return_type +
'>')
+ profiling_entered_native = ''
+ if self.options.enable_profiling:
+ profiling_entered_native = 'JNI_LINK_SAVED_FRAME_POINTER;'
values = {
'RETURN': return_type,
'RETURN_DECLARATION': return_declaration,
@@ -1010,6 +1018,7 @@ ${NATIVES}
'PARAMS_IN_CALL': params_in_call,
'POST_CALL': post_call,
'STUB_NAME': self.GetStubName(native),
+ 'PROFILING_ENTERED_NATIVE': profiling_entered_native,
}
if is_method:
@@ -1025,6 +1034,7 @@ ${NATIVES}
extern "C" __attribute__((visibility("default")))
${RETURN} ${STUB_NAME}(JNIEnv* env,
${PARAMS_IN_STUB}) {
+ ${PROFILING_ENTERED_NATIVE}
${P0_TYPE}* native = reinterpret_cast<${P0_TYPE}*>(${PARAM0_NAME});
CHECK_NATIVE_PTR(env, jcaller, native, "${NAME}"${OPTIONAL_ERROR_RETURN});
return native->${NAME}(${PARAMS_IN_CALL})${POST_CALL};
@@ -1036,11 +1046,12 @@ static ${RETURN_DECLARATION} ${NAME}(JNIEnv* env, ${PARAMS});
extern "C" __attribute__((visibility("default")))
${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS_IN_STUB}) {
+ ${PROFILING_ENTERED_NATIVE}
return ${NAME}(${PARAMS_IN_CALL})${POST_CALL};
}
""")
- return template.substitute(values)
+ return RemoveIndentedEmptyLines(template.substitute(values))
def GetArgument(self, param):
if param.datatype == 'int':
@@ -1093,6 +1104,9 @@ ${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS_IN_STUB}) {
return_clause = 'return ' + return_type + '(env, ret);'
else:
return_clause = 'return ret;'
+ profiling_leaving_native = ''
+ if self.options.enable_profiling:
+ profiling_leaving_native = 'JNI_SAVE_FRAME_POINTER;'
return {
'JAVA_CLASS': java_class,
'RETURN_TYPE': return_type,
@@ -1108,7 +1122,8 @@ ${RETURN} ${STUB_NAME}(JNIEnv* env, ${PARAMS_IN_STUB}) {
'PARAMS_IN_CALL': params_in_call,
'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name,
'CHECK_EXCEPTION': check_exception,
- 'GET_METHOD_ID_IMPL': self.GetMethodIDImpl(called_by_native)
+ 'GET_METHOD_ID_IMPL': self.GetMethodIDImpl(called_by_native),
+ 'PROFILING_LEAVING_NATIVE': profiling_leaving_native,
}
@@ -1129,6 +1144,7 @@ ${FUNCTION_HEADER}
${JAVA_CLASS}_clazz(env)${OPTIONAL_ERROR_RETURN});
jmethodID method_id =
${GET_METHOD_ID_IMPL}
+ ${PROFILING_LEAVING_NATIVE}
${RETURN_DECLARATION}
${PRE_CALL}env->${ENV_CALL}(${FIRST_PARAM_IN_CALL},
method_id${PARAMS_IN_CALL})${POST_CALL};
@@ -1143,7 +1159,7 @@ ${FUNCTION_HEADER}
function_header_with_unused_template.substitute(values))
else:
values['FUNCTION_HEADER'] = function_header_template.substitute(values)
- return template.substitute(values)
+ return RemoveIndentedEmptyLines(template.substitute(values))
def GetKMethodArrayEntry(self, native):
template = Template(' { "native${NAME}", ${JNI_SIGNATURE}, ' +
@@ -1363,6 +1379,8 @@ See SampleForTests.java for more details.
option_parser.add_option('--native_exports_optional', action='store_true',
help='Support both explicit and native method'
'registration.')
+ option_parser.add_option('--enable_profiling', action='store_true',
+ help='Add additional profiling instrumentation.')
options, args = option_parser.parse_args(argv)
if options.jar_file:
input_file = ExtractJarInputFile(options.jar_file, options.input_file,
« no previous file with comments | « base/android/jni_generator/golden_sample_for_tests_jni.h ('k') | base/android/jni_generator/jni_generator_tests.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698