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

Unified Diff: base/android/jni_int_wrapper.h

Issue 267893002: Catch intptr_t to int conversion on 64-bit platforms. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address Marcus' comment about quotes Created 6 years, 7 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_int_wrapper.h
diff --git a/base/android/jni_int_wrapper.h b/base/android/jni_int_wrapper.h
new file mode 100644
index 0000000000000000000000000000000000000000..7e8d0e0ba57457eacf10ad6ad15a8c69d3607bf7
--- /dev/null
+++ b/base/android/jni_int_wrapper.h
@@ -0,0 +1,56 @@
+// Copyright (c) 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JNI_INT_WRAPPER_H_
+#define BASE_ANDROID_JNI_INT_WRAPPER_H_
+
+// Wrapper used to receive int when calling Java from native.
+// The wrapper disallows automatic conversion of long to int.
+// This is to avoid a common anti-pattern where a Java int is used
+// to receive a native pointer. Please use a Java long to receive
+// native pointers, so that the code works on both 32-bit and 64-bit
+// platforms. Note the wrapper allows other lossy conversions into
+// jint that could be consider anti-patterns, such as from size_t.
+
+// Checking is only done in debugging builds.
+
+#ifdef NDEBUG
+
+typedef jint JniIntWrapper;
+
+// This inline is sufficiently trivial that it does not change the
+// final code generated by g++.
+inline jint as_jint(JniIntWrapper wrapper) {
+ return wrapper;
+}
+
+#else
+
+class JniIntWrapper {
+ public:
+ JniIntWrapper() : i_(0) {}
+ JniIntWrapper(int i) : i_(i) {}
+ JniIntWrapper(const JniIntWrapper& ji) : i_(ji.i_) {}
+ template <class T> JniIntWrapper(const T& t) : i_(t) {}
+ jint as_jint() const { return i_; }
+ private:
+ // If you get an "is private" error at the line below it is because you used
+ // an implicit conversion to convert a long to an int when calling Java.
+ // We disallow this, as a common anti-pattern allows converting a native
+ // pointer (intptr_t) to a Java int. Please use a Java long to represent
+ // a native pointer. If you want a lossy conversion, please use an
+ // explicit conversion in your C++ code. Note an error is only seen when
+ // compiling on a 64-bit platform, as intptr_t is indistinguishable from
+ // int on 32-bit platforms.
+ JniIntWrapper(long);
+ jint i_;
+};
+
+inline jint as_jint(const JniIntWrapper& wrapper) {
+ return wrapper.as_jint();
+}
+
+#endif // NDEBUG
+
+#endif // BASE_ANDROID_JNI_INT_WRAPPER_H_
« no previous file with comments | « base/android/jni_generator/testPureNativeMethodsOption.golden ('k') | content/browser/android/content_video_view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698