|
|
|
@ -110,10 +110,10 @@ static void Message_dtor(zend_object* obj) { |
|
|
|
|
* |
|
|
|
|
* Helper function to look up a field given a member name (as a string). |
|
|
|
|
*/ |
|
|
|
|
static const upb_FieldDef* get_field(Message* msg, PROTO_STR* member) { |
|
|
|
|
static const upb_FieldDef* get_field(Message* msg, zend_string* member) { |
|
|
|
|
const upb_MessageDef* m = msg->desc->msgdef; |
|
|
|
|
const upb_FieldDef* f = upb_MessageDef_FindFieldByNameWithSize( |
|
|
|
|
m, PROTO_STRVAL_P(member), PROTO_STRLEN_P(member)); |
|
|
|
|
m, ZSTR_VAL(member), ZSTR_LEN(member)); |
|
|
|
|
|
|
|
|
|
if (!f) { |
|
|
|
|
zend_throw_exception_ex(NULL, 0, "No such property %s.", |
|
|
|
@ -287,9 +287,9 @@ static int Message_compare_objects(zval* m1, zval* m2) { |
|
|
|
|
* return isset($this->optional_int32); |
|
|
|
|
* } |
|
|
|
|
*/ |
|
|
|
|
static int Message_has_property(PROTO_VAL* obj, PROTO_STR* member, |
|
|
|
|
static int Message_has_property(zend_object* obj, zend_string* member, |
|
|
|
|
int has_set_exists, void** cache_slot) { |
|
|
|
|
Message* intern = PROTO_VAL_P(obj); |
|
|
|
|
Message* intern = (Message*)obj; |
|
|
|
|
const upb_FieldDef* f = get_field(intern, member); |
|
|
|
|
|
|
|
|
|
if (!f) return 0; |
|
|
|
@ -321,9 +321,9 @@ static int Message_has_property(PROTO_VAL* obj, PROTO_STR* member, |
|
|
|
|
* unset($this->optional_int32); |
|
|
|
|
* } |
|
|
|
|
*/ |
|
|
|
|
static void Message_unset_property(PROTO_VAL* obj, PROTO_STR* member, |
|
|
|
|
static void Message_unset_property(zend_object* obj, zend_string* member, |
|
|
|
|
void** cache_slot) { |
|
|
|
|
Message* intern = PROTO_VAL_P(obj); |
|
|
|
|
Message* intern = (Message*)obj; |
|
|
|
|
const upb_FieldDef* f = get_field(intern, member); |
|
|
|
|
|
|
|
|
|
if (!f) return; |
|
|
|
@ -357,9 +357,9 @@ static void Message_unset_property(PROTO_VAL* obj, PROTO_STR* member, |
|
|
|
|
* We lookup the field and return the scalar, RepeatedField, or MapField for |
|
|
|
|
* this field. |
|
|
|
|
*/ |
|
|
|
|
static zval* Message_read_property(PROTO_VAL* obj, PROTO_STR* member, int type, |
|
|
|
|
void** cache_slot, zval* rv) { |
|
|
|
|
Message* intern = PROTO_VAL_P(obj); |
|
|
|
|
static zval* Message_read_property(zend_object* obj, zend_string* member, |
|
|
|
|
int type, void** cache_slot, zval* rv) { |
|
|
|
|
Message* intern = (Message*)obj; |
|
|
|
|
const upb_FieldDef* f = get_field(intern, member); |
|
|
|
|
|
|
|
|
|
if (!f) return &EG(uninitialized_zval); |
|
|
|
@ -388,24 +388,15 @@ static zval* Message_read_property(PROTO_VAL* obj, PROTO_STR* member, int type, |
|
|
|
|
* The C extension version of checkInt32() doesn't actually check anything, so |
|
|
|
|
* we perform all checking and conversion in this function. |
|
|
|
|
*/ |
|
|
|
|
static PROTO_RETURN_VAL Message_write_property(PROTO_VAL* obj, |
|
|
|
|
PROTO_STR* member, zval* val, |
|
|
|
|
void** cache_slot) { |
|
|
|
|
Message* intern = PROTO_VAL_P(obj); |
|
|
|
|
static zval* Message_write_property(zend_object* obj, zend_string* member, |
|
|
|
|
zval* val, void** cache_slot) { |
|
|
|
|
Message* intern = (Message*)obj; |
|
|
|
|
const upb_FieldDef* f = get_field(intern, member); |
|
|
|
|
|
|
|
|
|
if (f && Message_set(intern, f, val)) { |
|
|
|
|
#if PHP_VERSION_ID < 70400 |
|
|
|
|
return; |
|
|
|
|
#else |
|
|
|
|
return val; |
|
|
|
|
#endif |
|
|
|
|
} else { |
|
|
|
|
#if PHP_VERSION_ID < 70400 |
|
|
|
|
return; |
|
|
|
|
#else |
|
|
|
|
return &EG(error_zval); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -416,8 +407,9 @@ static PROTO_RETURN_VAL Message_write_property(PROTO_VAL* obj, |
|
|
|
|
* reference to our internal properties. We don't support this, so we return |
|
|
|
|
* NULL. |
|
|
|
|
*/ |
|
|
|
|
static zval* Message_get_property_ptr_ptr(PROTO_VAL* object, PROTO_STR* member, |
|
|
|
|
int type, void** cache_slot) { |
|
|
|
|
static zval* Message_get_property_ptr_ptr(zend_object* object, |
|
|
|
|
zend_string* member, int type, |
|
|
|
|
void** cache_slot) { |
|
|
|
|
return NULL; // We do not have a properties table.
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -428,9 +420,9 @@ static zval* Message_get_property_ptr_ptr(PROTO_VAL* object, PROTO_STR* member, |
|
|
|
|
* |
|
|
|
|
* $msg2 = clone $msg; |
|
|
|
|
*/ |
|
|
|
|
static zend_object* Message_clone_obj(PROTO_VAL* object) { |
|
|
|
|
Message* intern = PROTO_VAL_P(object); |
|
|
|
|
upb_MiniTable* t = upb_MessageDef_MiniTable(intern->desc->msgdef); |
|
|
|
|
static zend_object* Message_clone_obj(zend_object* object) { |
|
|
|
|
Message* intern = (Message*)object; |
|
|
|
|
const upb_MiniTable* t = upb_MessageDef_MiniTable(intern->desc->msgdef); |
|
|
|
|
upb_Message* clone = upb_Message_New(t, Arena_Get(&intern->arena)); |
|
|
|
|
|
|
|
|
|
// TODO: copy unknown fields?
|
|
|
|
@ -447,7 +439,7 @@ static zend_object* Message_clone_obj(PROTO_VAL* object) { |
|
|
|
|
* Object handler for the get_properties event in PHP. This returns a HashTable |
|
|
|
|
* of our internal properties. We don't support this, so we return NULL. |
|
|
|
|
*/ |
|
|
|
|
static HashTable* Message_get_properties(PROTO_VAL* object) { |
|
|
|
|
static HashTable* Message_get_properties(zend_object* object) { |
|
|
|
|
return NULL; // We don't offer direct references to our properties.
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -584,7 +576,7 @@ bool Message_InitFromPhp(upb_Message* msg, const upb_MessageDef* m, zval* init, |
|
|
|
|
|
|
|
|
|
static void Message_Initialize(Message* intern, const Descriptor* desc) { |
|
|
|
|
intern->desc = desc; |
|
|
|
|
upb_MiniTable* t = upb_MessageDef_MiniTable(desc->msgdef); |
|
|
|
|
const upb_MiniTable* t = upb_MessageDef_MiniTable(desc->msgdef); |
|
|
|
|
intern->msg = upb_Message_New(t, Arena_Get(&intern->arena)); |
|
|
|
|
ObjCache_Add(intern->msg, &intern->std); |
|
|
|
|
} |
|
|
|
@ -1434,11 +1426,7 @@ void Message_ModuleInit() { |
|
|
|
|
|
|
|
|
|
memcpy(h, &std_object_handlers, sizeof(zend_object_handlers)); |
|
|
|
|
h->dtor_obj = Message_dtor; |
|
|
|
|
#if PHP_VERSION_ID < 80000 |
|
|
|
|
h->compare_objects = Message_compare_objects; |
|
|
|
|
#else |
|
|
|
|
h->compare = Message_compare_objects; |
|
|
|
|
#endif |
|
|
|
|
h->read_property = Message_read_property; |
|
|
|
|
h->write_property = Message_write_property; |
|
|
|
|
h->has_property = Message_has_property; |
|
|
|
|