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

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: Created 6 years, 8 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..6df4e0617847025967de3de7123ae38a37741a7d
--- /dev/null
+++ b/base/android/jni_int_wrapper.h
@@ -0,0 +1,38 @@
+// 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_
+
+#include <stdint.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.
bulach 2014/05/02 16:55:56 I think we could do with a #ifdef NDEBUG // Don'
+
+class jni_int_wrapper {
bulach 2014/05/02 16:55:56 nit: should be JniIntWrapper
+ public:
+ jni_int_wrapper() : i_(0) {}
+ jni_int_wrapper(int i) : i_(i) {}
+ jni_int_wrapper(const jni_int_wrapper& ji) : i_(ji.i_) {}
+ template <class T> jni_int_wrapper(const T& t) : i_(t) {}
+ jint asJint() const { return i_; }
bulach 2014/05/02 16:55:56 nit: and here, as_jint()
+ 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.
+ jni_int_wrapper(long);
+ jint i_;
+};
+
+#endif // BASE_ANDROID_JNI_INT_WRAPPER_H_

Powered by Google App Engine
This is Rietveld 408576698