Index: include/v8config.h |
diff --git a/include/v8config.h b/include/v8config.h |
index 0993a9f3e4fd9b7e13e8ca8eda8f83bb987a5bcd..2dfbcfad002f41d676de9431d5188c119a66a6fd 100644 |
--- a/include/v8config.h |
+++ b/include/v8config.h |
@@ -187,6 +187,7 @@ |
// supported |
// V8_HAS_ATTRIBUTE_DEPRECATED - __attribute__((deprecated)) supported |
// V8_HAS_ATTRIBUTE_NOINLINE - __attribute__((noinline)) supported |
+// V8_HAS_ATTRIBUTE_PURE - __attribute__((pure)) supported |
// V8_HAS_ATTRIBUTE_VISIBILITY - __attribute__((visibility)) supported |
// V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT - __attribute__((warn_unused_result)) |
// supported |
@@ -216,6 +217,7 @@ |
# define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (__has_attribute(always_inline)) |
# define V8_HAS_ATTRIBUTE_DEPRECATED (__has_attribute(deprecated)) |
# define V8_HAS_ATTRIBUTE_NOINLINE (__has_attribute(noinline)) |
+# define V8_HAS_ATTRIBUTE_PURE (__has_attribute(pure)) |
# define V8_HAS_ATTRIBUTE_VISIBILITY (__has_attribute(visibility)) |
# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \ |
(__has_attribute(warn_unused_result)) |
@@ -246,6 +248,7 @@ |
# define V8_HAS_ATTRIBUTE_ALWAYS_INLINE (V8_GNUC_PREREQ(4, 4, 0)) |
# define V8_HAS_ATTRIBUTE_DEPRECATED (V8_GNUC_PREREQ(3, 4, 0)) |
# define V8_HAS_ATTRIBUTE_NOINLINE (V8_GNUC_PREREQ(3, 4, 0)) |
+# define V8_HAS_ATTRIBUTE_PURE (V8_GNUC_PREREQ(2, 96, 0)) |
# define V8_HAS_ATTRIBUTE_VISIBILITY (V8_GNUC_PREREQ(4, 3, 0)) |
# define V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT \ |
(!V8_CC_INTEL && V8_GNUC_PREREQ(4, 1, 0)) |
@@ -325,6 +328,28 @@ |
#endif |
+// Many functions have no effects except the return value and their return value |
+// depends only on the parameters and/or global variables. Such a function can |
+// be subject to common subexpression elimination and loop optimization just as |
+// an arithmetic operator would be. These functions should be declared with the |
+// attribute V8_PURE. For example, |
+// |
+// int square (int) V8_PURE; |
+// |
+// says that the hypothetical function square is safe to call fewer times than |
+// the program says. |
+// |
+// Some of common examples of pure functions are strlen or memcmp. Interesting |
+// non-V8_PURE functions are functions with infinite loops or those depending |
+// on volatile memory or other system resource, that may change between two |
+// consecutive calls (such as feof in a multithreaded environment). |
+#if V8_HAS_ATTRIBUTE_PURE |
+# define V8_PURE __attribute__((pure)) |
+#else |
+# define V8_PURE /* NOT SUPPORTED */ |
+#endif |
+ |
+ |
// Annotate a function indicating the caller must examine the return value. |
// Use like: |
// int foo() V8_WARN_UNUSED_RESULT; |