فهرست منبع

Passing integers that didn't fit in 32-bit integers from PHP to Javascript
did not work properly, now uses float to pass larger numbers.

Taneli Leppa 11 سال پیش
والد
کامیت
9ddac3f124
2فایلهای تغییر یافته به همراه9 افزوده شده و 1 حذف شده
  1. 1 0
      package.xml
  2. 8 1
      v8js_convert.cc

+ 1 - 0
package.xml

@@ -91,6 +91,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
    <file name="array_pass.phpt" role="test" />
    <file name="array_pass_flags.phpt" role="test" />
    <file name="timezones.phpt" role="test" />
+   <file name="long.phpt" role="test" />
 </dir>
 </dir>
  </contents>

+ 8 - 1
v8js_convert.cc

@@ -28,6 +28,7 @@ extern "C" {
 #include "php_v8js_macros.h"
 #include <v8.h>
 #include <stdexcept>
+#include <limits>
 
 static void php_v8js_weak_object_callback(const v8::WeakCallbackData<v8::Object, zval> &data);
 
@@ -852,6 +853,7 @@ static v8::Handle<v8::Value> php_v8js_hash_to_jsarr(zval *value, v8::Isolate *is
 v8::Handle<v8::Value> zval_to_v8js(zval *value, v8::Isolate *isolate TSRMLS_DC) /* {{{ */
 {
 	v8::Handle<v8::Value> jsValue;
+	long v;
 
 	switch (Z_TYPE_P(value))
 	{
@@ -868,7 +870,12 @@ v8::Handle<v8::Value> zval_to_v8js(zval *value, v8::Isolate *isolate TSRMLS_DC)
 			break;
 
 		case IS_LONG:
-			jsValue = V8JS_INT(Z_LVAL_P(value));
+		    v = Z_LVAL_P(value);
+			if (v < - std::numeric_limits<int32_t>::min() || v > std::numeric_limits<int32_t>::max()) {
+				jsValue = V8JS_FLOAT((double)v);
+			} else {
+				jsValue = V8JS_INT(v);
+			}
 			break;
 
 		case IS_DOUBLE: