Bug 987669 - Implement IsErrorObjectKey and do more at compile-time. r=gabor
authorBobby Holley <bobbyholley@gmail.com>
Fri, 11 Jul 2014 09:09:21 -0700
changeset 193611 8fed72d0f4961bedc9e726b229e66a3d92914580
parent 193610 2f058f0f4c1cc062ac9981c1988defe1677bece9
child 193612 4e45b8a55bfbdf96b6ca113efab4bbb926decf8e
push id27123
push userryanvm@gmail.com
push dateFri, 11 Jul 2014 20:35:05 +0000
treeherdermozilla-central@84bd8d9f4256 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgabor
bugs987669
milestone33.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 987669 - Implement IsErrorObjectKey and do more at compile-time. r=gabor
js/xpconnect/wrappers/XrayWrapper.cpp
--- a/js/xpconnect/wrappers/XrayWrapper.cpp
+++ b/js/xpconnect/wrappers/XrayWrapper.cpp
@@ -34,36 +34,42 @@ using js::BaseProxyHandler;
 using js::IsCrossCompartmentWrapper;
 using js::UncheckedUnwrap;
 using js::CheckedUnwrap;
 
 namespace xpc {
 
 using namespace XrayUtils;
 
+constexpr bool Between(JSProtoKey x, JSProtoKey a, JSProtoKey b) { return a <= x && x <= b; }
+
+static_assert(JSProto_URIError - JSProto_Error == 7, "New prototype added in error object range");
+#define AssertErrorObjectKeyInBounds(key) \
+    static_assert(Between(key, JSProto_Error, JSProto_URIError), "We depend on jsprototypes.h ordering here");
+MOZ_FOR_EACH(AssertErrorObjectKeyInBounds, (),
+             (JSProto_Error, JSProto_InternalError, JSProto_EvalError, JSProto_RangeError,
+              JSProto_ReferenceError, JSProto_SyntaxError, JSProto_TypeError, JSProto_URIError));
+
+inline bool
+IsErrorObjectKey(JSProtoKey key)
+{
+    return key >= JSProto_Error && key <= JSProto_URIError;
+}
+
+static_assert(JSProto_Uint8ClampedArray - JSProto_Int8Array == 8, "New prototype added in typed array range");
+#define AssertTypedArrayKeyInBounds(key) \
+    static_assert(Between(key, JSProto_Int8Array, JSProto_Uint8ClampedArray), "We depend on jsprototypes.h ordering here");
+MOZ_FOR_EACH(AssertTypedArrayKeyInBounds, (),
+             (JSProto_Int8Array, JSProto_Uint8Array, JSProto_Int16Array, JSProto_Uint16Array,
+              JSProto_Int32Array, JSProto_Uint32Array, JSProto_Float32Array, JSProto_Float64Array, JSProto_Uint8ClampedArray));
+
 inline bool
 IsTypedArrayKey(JSProtoKey key)
 {
-#ifdef DEBUG
-    bool isTypedArraySlow = key == JSProto_Int8Array ||
-                            key == JSProto_Uint8Array ||
-                            key == JSProto_Int16Array ||
-                            key == JSProto_Uint16Array ||
-                            key == JSProto_Int32Array ||
-                            key == JSProto_Uint32Array ||
-                            key == JSProto_Float32Array ||
-                            key == JSProto_Float64Array ||
-                            key == JSProto_Uint8ClampedArray;
-#endif
-    bool isTypedArray = key >= JSProto_Int8Array &&
-                        key <= JSProto_Uint8ClampedArray;
-    MOZ_ASSERT(isTypedArray == isTypedArraySlow, "Somebody reordered jsprototypes.h!");
-    static_assert(JSProto_Uint8ClampedArray - JSProto_Int8Array == 8,
-                  "New prototype added in typed array range");
-    return isTypedArray;
+    return key >= JSProto_Int8Array && key <= JSProto_Uint8ClampedArray;
 }
 
 // Whitelist for the standard ES classes we can Xray to.
 static bool
 IsJSXraySupported(JSProtoKey key)
 {
     if (IsTypedArrayKey(key))
         return true;