瀏覽代碼

make it compile on PHP 7.3 and 7.4

Stefan Siegl 5 年之前
父節點
當前提交
e153ff1651
共有 4 個文件被更改,包括 25 次插入17 次删除
  1. 9 8
      php_v8js_macros.h
  2. 4 4
      v8js_class.cc
  3. 7 0
      v8js_v8.h
  4. 5 5
      v8js_v8object_class.cc

+ 9 - 8
php_v8js_macros.h

@@ -29,16 +29,17 @@
 #include <mutex>
 
 #include <cmath>
-#if PHP_VERSION_ID < 70400 && !defined(isnan)
-/* php.h requires the isnan() macro, which is removed by c++ <cmath> header,
- * work around: re-define the macro to std::isnan function */
-#define isnan(a) std::isnan(a)
-
-/* likewise isfinite */
-#define isfinite(a) std::isfinite(a)
-#endif
 
 extern "C" {
+#include "php_config.h"
+
+/* work around incompatibilities regarding isnan() and isfinite() macros,
+ * affecting PHP versions before 7.4. */
+#undef HAVE_DECL_ISFINITE
+#undef HAVE_DECL_ISNAN
+#define HAVE_DECL_ISFINITE 0
+#define HAVE_DECL_ISNAN 0
+
 #include "php.h"
 #include "php_v8js.h"
 }

+ 4 - 4
v8js_class.cc

@@ -1307,10 +1307,10 @@ const zend_function_entry v8js_methods[] = { /* {{{ */
 
 /* V8Js object handlers */
 
-static zval* v8js_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */
+static SINCE74(zval*, void) v8js_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */
 {
 	v8js_ctx *c = Z_V8JS_CTX_OBJ_P(object);
-	V8JS_CTX_PROLOGUE_EX(c, value);
+	V8JS_CTX_PROLOGUE_EX(c, SINCE74(value,));
 
 	/* Check whether member is public, if so, export to V8. */
 	zend_property_info *property_info = zend_get_property_info(c->std.ce, Z_STR_P(member), 1);
@@ -1324,7 +1324,7 @@ static zval* v8js_write_property(zval *object, zval *member, zval *value, void *
 		if (Z_STRLEN_P(member) > std::numeric_limits<int>::max()) {
 				zend_throw_exception(php_ce_v8js_exception,
 						"Property name exceeds maximum supported length", 0);
-				return value;
+				return SINCE74(value,);
 		}
 
 		/* Write value to PHP JS object */
@@ -1333,7 +1333,7 @@ static zval* v8js_write_property(zval *object, zval *member, zval *value, void *
 	}
 
 	/* Write value to PHP object */
-	return std_object_handlers.write_property(object, member, value, NULL);
+	SINCE74(return,) std_object_handlers.write_property(object, member, value, NULL);
 }
 /* }}} */
 

+ 7 - 0
v8js_v8.h

@@ -83,6 +83,13 @@ int v8js_get_properties_hash(v8::Local<v8::Value> jsValue, HashTable *retval, in
 	V8JS_CTX_PROLOGUE(ctx);
 
 
+#if PHP_VERSION_ID < 70400
+#define SINCE74(x,y) y
+#else
+#define SINCE74(x,y) x
+#endif
+
+
 #endif /* V8JS_V8_H */
 
 /*

+ 5 - 5
v8js_v8object_class.cc

@@ -167,23 +167,23 @@ static zval *v8js_v8object_get_property_ptr_ptr(zval *object, zval *member, int
 }
 /* }}} */
 
-static zval *v8js_v8object_write_property(zval *object, zval *member, zval *value, void **cache_slot ) /* {{{ */
+static SINCE74(zval*, void) v8js_v8object_write_property(zval *object, zval *member, zval *value, void **cache_slot ) /* {{{ */
 {
 	v8js_v8object *obj = Z_V8JS_V8OBJECT_OBJ_P(object);
 
 	if (!obj->ctx) {
 		zend_throw_exception(php_ce_v8js_exception,
 			"Can't access V8Object after V8Js instance is destroyed!", 0);
-		return value;
+		return SINCE74(value,);
 	}
 
-	V8JS_CTX_PROLOGUE_EX(obj->ctx, value);
+	V8JS_CTX_PROLOGUE_EX(obj->ctx, SINCE74(value,));
 	v8::Local<v8::Value> v8objHandle = v8::Local<v8::Value>::New(isolate, obj->v8obj);
 
 	if (Z_STRLEN_P(member) > std::numeric_limits<int>::max()) {
 		zend_throw_exception(php_ce_v8js_exception,
 			"Member name length exceeds maximum supported length", 0);
-		return value;
+		return SINCE74(value,);
 	}
 
 	v8::Local<v8::Object> v8obj;
@@ -191,7 +191,7 @@ static zval *v8js_v8object_write_property(zval *object, zval *member, zval *valu
 		v8obj->CreateDataProperty(v8_context, V8JS_ZSYM(Z_STR_P(member)), zval_to_v8js(value, isolate));
 	}
 
-	return value;
+	return SINCE74(value,);
 }
 /* }}} */