summaryrefslogtreecommitdiffstats
path: root/4034.patch
diff options
context:
space:
mode:
Diffstat (limited to '4034.patch')
-rw-r--r--4034.patch324
1 files changed, 324 insertions, 0 deletions
diff --git a/4034.patch b/4034.patch
new file mode 100644
index 0000000..e77070d
--- /dev/null
+++ b/4034.patch
@@ -0,0 +1,324 @@
+From 9f6aceaa8ce8250d9e36225180c218035bd49fe9 Mon Sep 17 00:00:00 2001
+From: Bo Yang <teboring@google.com>
+Date: Tue, 12 Dec 2017 12:06:51 -0800
+Subject: [PATCH 1/4] Add PROTOBUF_ENABLE_TIMESTAMP to let user decide whether
+ timestamp util can be used at install time.
+
+---
+ php/ext/google/protobuf/message.c | 13 ++++++++++++-
+ php/tests/test.sh | 2 +-
+ 2 files changed, 13 insertions(+), 2 deletions(-)
+
+diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c
+index b14c1f0c5a..70080a3b6e 100644
+--- a/php/ext/google/protobuf/message.c
++++ b/php/ext/google/protobuf/message.c
+@@ -29,9 +29,12 @@
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ #include <php.h>
+-#include <ext/date/php_date.h>
+ #include <stdlib.h>
+
++#ifdef PROTOBUF_ENABLE_TIMESTAMP
++#include <ext/date/php_date.h>
++#endif
++
+ #include "protobuf.h"
+ #include "utf8.h"
+
+@@ -1121,6 +1124,7 @@ PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Seconds, "seconds")
+ PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Nanos, "nanos")
+
+ PHP_METHOD(Timestamp, fromDateTime) {
++#ifdef PROTOBUF_ENABLE_TIMESTAMP
+ zval* datetime;
+ zval member;
+
+@@ -1149,9 +1153,13 @@ PHP_METHOD(Timestamp, fromDateTime) {
+ storage = message_data(self);
+ memory = slot_memory(self->descriptor->layout, storage, field);
+ *(int32_t*)memory = 0;
++#else
++ zend_error(E_USER_ERROR, "fromDateTime needs date extension.");
++#endif
+ }
+
+ PHP_METHOD(Timestamp, toDateTime) {
++#ifdef PROTOBUF_ENABLE_TIMESTAMP
+ zval datetime;
+ php_date_instantiate(php_date_get_date_ce(), &datetime TSRMLS_CC);
+ php_date_obj* dateobj = UNBOX(php_date_obj, &datetime);
+@@ -1184,6 +1192,9 @@ PHP_METHOD(Timestamp, toDateTime) {
+
+ zval* datetime_ptr = &datetime;
+ PHP_PROTO_RETVAL_ZVAL(datetime_ptr);
++#else
++ zend_error(E_USER_ERROR, "toDateTime needs date extension.");
++#endif
+ }
+
+ // -----------------------------------------------------------------------------
+From 88102eae8f86045307e9d46ad900f91158227f2b Mon Sep 17 00:00:00 2001
+From: Bo Yang <teboring@google.com>
+Date: Tue, 12 Dec 2017 13:57:49 -0800
+Subject: [PATCH 2/4] Replace private timelib_update_ts with public
+ date_timestamp_get
+
+---
+ php/ext/google/protobuf/message.c | 24 +++++++++++++++++++-----
+ php/tests/memory_leak_test.php | 12 ++++++++++++
+ 2 files changed, 31 insertions(+), 5 deletions(-)
+
+diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c
+index 70080a3b6e..5b654a78d6 100644
+--- a/php/ext/google/protobuf/message.c
++++ b/php/ext/google/protobuf/message.c
+@@ -1133,12 +1133,24 @@ PHP_METHOD(Timestamp, fromDateTime) {
+ return;
+ }
+
+- php_date_obj* dateobj = UNBOX(php_date_obj, datetime);
+- if (!dateobj->time->sse_uptodate) {
+- timelib_update_ts(dateobj->time, NULL);
++ // Get timestamp from Datetime object.
++ zval* retval_ptr;
++ zval* function_name;
++ int64_t timestamp;
++
++ MAKE_STD_ZVAL(retval_ptr);
++ MAKE_STD_ZVAL(function_name);
++
++ ZVAL_STRING(function_name, "date_timestamp_get", 1);
++
++ if (call_user_function(EG(function_table), NULL,
++ function_name, retval_ptr, 1,
++ &datetime TSRMLS_CC) == SUCCESS) {
++ protobuf_convert_to_int64(retval_ptr, &timestamp);
+ }
+
+- int64_t timestamp = dateobj->time->sse;
++ zval_ptr_dtor(&retval_ptr);
++ zval_ptr_dtor(&function_name);
+
+ // Set seconds
+ MessageHeader* self = UNBOX(MessageHeader, getThis());
+@@ -1146,13 +1158,15 @@ PHP_METHOD(Timestamp, fromDateTime) {
+ upb_msgdef_ntofz(self->descriptor->msgdef, "seconds");
+ void* storage = message_data(self);
+ void* memory = slot_memory(self->descriptor->layout, storage, field);
+- *(int64_t*)memory = dateobj->time->sse;
++ *(int64_t*)memory = timestamp;
+
+ // Set nanos
+ field = upb_msgdef_ntofz(self->descriptor->msgdef, "nanos");
+ storage = message_data(self);
+ memory = slot_memory(self->descriptor->layout, storage, field);
+ *(int32_t*)memory = 0;
++
++ RETURN_NULL();
+ #else
+ zend_error(E_USER_ERROR, "fromDateTime needs date extension.");
+ #endif
+
+From fffe8d39f810d147c6db65f90ae4f71f4e0f0116 Mon Sep 17 00:00:00 2001
+From: Bo Yang <teboring@google.com>
+Date: Tue, 12 Dec 2017 17:47:04 -0800
+Subject: [PATCH 3/4] Call php method via function name instead of calling
+ directly.
+
+This changes the linking error if php extension is not statically linked
+to a runtime error. In this way, users who don't need Timestamp can
+still use protobuf even if date extension is not statically linked in
+php.
+---
+ php/ext/google/protobuf/message.c | 70 ++++++++++++++++++++++----------------
+ php/ext/google/protobuf/protobuf.h | 4 +++
+ php/tests/memory_leak_test.php | 8 ++---
+ php/tests/test.sh | 2 +-
+ 4 files changed, 50 insertions(+), 34 deletions(-)
+
+diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c
+index 5b654a78d6..7d7d86517a 100644
+--- a/php/ext/google/protobuf/message.c
++++ b/php/ext/google/protobuf/message.c
+@@ -31,10 +31,6 @@
+ #include <php.h>
+ #include <stdlib.h>
+
+-#ifdef PROTOBUF_ENABLE_TIMESTAMP
+-#include <ext/date/php_date.h>
+-#endif
+-
+ #include "protobuf.h"
+ #include "utf8.h"
+
+@@ -1124,7 +1120,6 @@ PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Seconds, "seconds")
+ PHP_PROTO_FIELD_ACCESSORS(Timestamp, timestamp, Nanos, "nanos")
+
+ PHP_METHOD(Timestamp, fromDateTime) {
+-#ifdef PROTOBUF_ENABLE_TIMESTAMP
+ zval* datetime;
+ zval member;
+
+@@ -1134,23 +1129,27 @@ PHP_METHOD(Timestamp, fromDateTime) {
+ }
+
+ // Get timestamp from Datetime object.
+- zval* retval_ptr;
+- zval* function_name;
++ zval retval;
++ zval function_name;
+ int64_t timestamp;
+
+- MAKE_STD_ZVAL(retval_ptr);
+- MAKE_STD_ZVAL(function_name);
++#if PHP_MAJOR_VERSION < 7
++ INIT_ZVAL(retval);
++ INIT_ZVAL(function_name);
++#endif
+
+- ZVAL_STRING(function_name, "date_timestamp_get", 1);
++ PHP_PROTO_ZVAL_STRING(&function_name, "date_timestamp_get", 1);
+
+- if (call_user_function(EG(function_table), NULL,
+- function_name, retval_ptr, 1,
+- &datetime TSRMLS_CC) == SUCCESS) {
+- protobuf_convert_to_int64(retval_ptr, &timestamp);
++ if (call_user_function(EG(function_table), NULL, &function_name, &retval, 1,
++ ZVAL_PTR_TO_CACHED_PTR(datetime) TSRMLS_CC) == FAILURE) {
++ zend_error(E_ERROR, "Cannot get timestamp from DateTime.");
++ return;
+ }
+
+- zval_ptr_dtor(&retval_ptr);
+- zval_ptr_dtor(&function_name);
++ protobuf_convert_to_int64(&retval, &timestamp);
++
++ zval_dtor(&retval);
++ zval_dtor(&function_name);
+
+ // Set seconds
+ MessageHeader* self = UNBOX(MessageHeader, getThis());
+@@ -1167,17 +1166,9 @@ PHP_METHOD(Timestamp, fromDateTime) {
+ *(int32_t*)memory = 0;
+
+ RETURN_NULL();
+-#else
+- zend_error(E_USER_ERROR, "fromDateTime needs date extension.");
+-#endif
+ }
+
+ PHP_METHOD(Timestamp, toDateTime) {
+-#ifdef PROTOBUF_ENABLE_TIMESTAMP
+- zval datetime;
+- php_date_instantiate(php_date_get_date_ce(), &datetime TSRMLS_CC);
+- php_date_obj* dateobj = UNBOX(php_date_obj, &datetime);
+-
+ // Get seconds
+ MessageHeader* self = UNBOX(MessageHeader, getThis());
+ const upb_fielddef* field =
+@@ -1198,16 +1189,37 @@ PHP_METHOD(Timestamp, toDateTime) {
+ strftime(formated_time, sizeof(formated_time), "%Y-%m-%dT%H:%M:%SUTC",
+ utc_time);
+
+- if (!php_date_initialize(dateobj, formated_time, strlen(formated_time), NULL,
+- NULL, 0 TSRMLS_CC)) {
+- zval_dtor(&datetime);
+- RETURN_NULL();
++ // Create Datetime object.
++ zval datetime;
++ zval formated_time_php;
++ zval function_name;
++ int64_t timestamp = 0;
++
++#if PHP_MAJOR_VERSION < 7
++ INIT_ZVAL(function_name);
++ INIT_ZVAL(formated_time_php);
++#endif
++
++ PHP_PROTO_ZVAL_STRING(&function_name, "date_create", 1);
++ PHP_PROTO_ZVAL_STRING(&formated_time_php, formated_time, 1);
++
++ CACHED_VALUE params[1] = {ZVAL_TO_CACHED_VALUE(formated_time_php)};
++
++ if (call_user_function(EG(function_table), NULL,
++ &function_name, &datetime, 1,
++ params TSRMLS_CC) == FAILURE) {
++ zend_error(E_ERROR, "Cannot create DateTime.");
++ return;
+ }
+
++ zval_dtor(&formated_time_php);
++ zval_dtor(&function_name);
++
++#if PHP_MAJOR_VERSION < 7
+ zval* datetime_ptr = &datetime;
+ PHP_PROTO_RETVAL_ZVAL(datetime_ptr);
+ #else
+- zend_error(E_USER_ERROR, "toDateTime needs date extension.");
++ ZVAL_OBJ(return_value, Z_OBJ(datetime));
+ #endif
+ }
+
+diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h
+index f299b4150d..6ab0f13478 100644
+--- a/php/ext/google/protobuf/protobuf.h
++++ b/php/ext/google/protobuf/protobuf.h
+@@ -182,6 +182,8 @@
+ #define CACHED_TO_ZVAL_PTR(VALUE) (VALUE)
+ #define CACHED_PTR_TO_ZVAL_PTR(VALUE) (*VALUE)
+ #define ZVAL_PTR_TO_CACHED_PTR(VALUE) (&VALUE)
++#define ZVAL_PTR_TO_CACHED_VALUE(VALUE) (VALUE)
++#define ZVAL_TO_CACHED_VALUE(VALUE) (&VALUE)
+
+ #define CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(zval_ptr, class_type) \
+ ZVAL_OBJ(zval_ptr, class_type->create_object(class_type TSRMLS_CC));
+@@ -452,6 +454,8 @@ static inline int php_proto_zend_hash_get_current_data_ex(HashTable* ht,
+ #define CACHED_TO_ZVAL_PTR(VALUE) (&VALUE)
+ #define CACHED_PTR_TO_ZVAL_PTR(VALUE) (VALUE)
+ #define ZVAL_PTR_TO_CACHED_PTR(VALUE) (VALUE)
++#define ZVAL_PTR_TO_CACHED_VALUE(VALUE) (*VALUE)
++#define ZVAL_TO_CACHED_VALUE(VALUE) (VALUE)
+
+ #define CREATE_OBJ_ON_ALLOCATED_ZVAL_PTR(zval_ptr, class_type) \
+ ZVAL_OBJ(zval_ptr, class_type->create_object(class_type));
+
+From 1a549d9a902151e980bfa76093b3d82b7589e158 Mon Sep 17 00:00:00 2001
+From: Bo Yang <teboring@google.com>
+Date: Wed, 13 Dec 2017 17:09:55 -0800
+Subject: [PATCH 4/4] Avoid using php_date_get_date_ce() in case date extension
+ is not available.
+
+---
+ php/ext/google/protobuf/message.c | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c
+index 7d7d86517a..df5eb408a1 100644
+--- a/php/ext/google/protobuf/message.c
++++ b/php/ext/google/protobuf/message.c
+@@ -1123,8 +1123,21 @@ PHP_METHOD(Timestamp, fromDateTime) {
+ zval* datetime;
+ zval member;
+
+- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &datetime,
+- php_date_get_date_ce()) == FAILURE) {
++ if (zend_parse_parameters(
++ ZEND_NUM_ARGS() TSRMLS_CC, "z", &datetime) == FAILURE) {
++ return;
++ }
++
++ zend_class_entry* ce = Z_OBJCE_P(datetime);
++ PHP_PROTO_CE_DECLARE datetime_ce;
++ if (php_proto_zend_lookup_class("\\Datetime", 9, &datetime_ce) ==
++ FAILURE) {
++ zend_error(E_ERROR, "Make sure date extension is enabled.");
++ return;
++ }
++
++ if (!instanceof_function(PHP_PROTO_CE_UNREF(datetime_ce), ce TSRMLS_CC)) {
++ zend_error(E_USER_ERROR, "Expect Datetime.");
+ return;
+ }
+