Skip to content

Commit

Permalink
Fix receiver bindings for PHP 7
Browse files Browse the repository at this point in the history
  • Loading branch information
deuill committed Jan 10, 2016
1 parent 01a48ae commit 600978c
Show file tree
Hide file tree
Showing 7 changed files with 155 additions and 143 deletions.
2 changes: 1 addition & 1 deletion context/context.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ void *context_eval(engine_context *context, char *script) {

void context_bind(engine_context *context, char *name, void *value) {
engine_value *v = (engine_value *) value;
context_value_bind(name, &v->value);
CONTEXT_VALUE_BIND(name, &v->value);
}

void context_destroy(engine_context *context) {
Expand Down
4 changes: 1 addition & 3 deletions include/php5/_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
#ifndef ___CONTEXT_H___
#define ___CONTEXT_H___

static inline void context_value_bind(char *name, zval *val) {
ZEND_SET_SYMBOL(EG(active_symbol_table), name, val);
}
#define CONTEXT_VALUE_BIND(n, v) ZEND_SET_SYMBOL(EG(active_symbol_table), n, v)

#endif
56 changes: 33 additions & 23 deletions include/php5/_receiver.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,46 @@
#ifndef ___RECEIVER_H___
#define ___RECEIVER_H___

#define RECEIVER_GET(o, m) zval *receiver_get(zval *o, zval *m, int t, const zend_literal *k)
#define RECEIVER_RETVAL_GET(v) NULL; MAKE_STD_ZVAL(v)

#define RECEIVER_SET(o, m, v) void receiver_set(zval *o, zval *m, zval *v, const zend_literal *k)
#define RECEIVER_EXISTS(o, m, c) int receiver_exists(zval *o, zval *m, int c, const zend_literal *k)

#define RECEIVER_FUNC_GET() (zend_internal_function *) EG(current_execute_data)->function_state.function
#define RECEIVER_FUNC_DESTROY(f) efree(f->function_name); efree(f)

#define RECEIVER_GET_METHOD(o, n, l) zend_function *receiver_get_method(zval **o, char *n, int l, const zend_literal *k)
#define RECEIVER_METHOD_NAME(n, l) estrndup(n, l)
// Function definition overrides.
#define RECEIVER_GET(o, m) receiver_get(o, m, int t, const zend_literal *k)
#define RECEIVER_SET(o, m, v) receiver_set(o, m, v, const zend_literal *k)
#define RECEIVER_EXISTS(o, m, c) receiver_exists(o, m, c, const zend_literal *k)
#define RECEIVER_DESTROY(o) receiver_destroy(void *o)
#define RECEIVER_CREATE(c) zend_object_value receiver_create(c)
#define RECEIVER_METHOD_GET(o, n, l) receiver_method_get(zval **o, char *n, int l, const zend_literal *k)
#define RECEIVER_METHOD_CALL(m) receiver_method_call(const char *m, INTERNAL_FUNCTION_PARAMETERS)
#define RECEIVER_CONSTRUCTOR_GET(o) receiver_constructor_get(zval *o)

static inline zval *RECEIVER_RETVAL() {
zval *val = NULL;
MAKE_STD_ZVAL(v);
return val;
}

#define RECEIVER_CONSTRUCTOR(o) zend_function *receiver_constructor(zval *o)
#define RECEIVER_CREATE(ct) zend_object_value receiver_create(zend_class_entry *ct)
#define RECEIVER_STRING_COPY(n) estrndup(n, strlen(n))
#define RECEIVER_FUNC() (zend_internal_function *) EG(current_execute_data)->function_state.function
#define RECEIVER_FUNC_NAME(m) (char *) (m)
#define RECEIVER_FUNC_SET_ARGFLAGS(f)

static inline zend_object *RECEIVER_OBJECT_GET(zval *object_ptr) {
static inline zend_object *RECEIVER_OBJECT(zval *object_ptr) {
engine_receiver *this = (engine_receiver *) Z_OBJ_P(object_ptr);
return &this->obj;
}

#define RECEIVER_OBJECT_CREATE(r) \
do { \
zend_object_value object; \
object.handle = zend_objects_store_put(r, \
(zend_objects_store_dtor_t) zend_objects_destroy_object, \
(zend_objects_free_object_storage_t) receiver_free, NULL); \
object.handlers = &receiver_handlers; \
return object; \
#define RECEIVER_OBJECT_CREATE(r) \
do { \
zend_object_value object; \
object.handle = zend_objects_store_put(r, \
(zend_objects_store_dtor_t) zend_objects_destroy_object, \
(zend_objects_free_object_storage_t) receiver_destroy, NULL); \
object.handlers = &receiver_handlers; \
return object; \
} while (0)

#define RECEIVER_GET_ENTRY receiver_get_entry,
#define RECEIVER_OBJECT_DESTROY(r) \
do { \
zend_object_std_dtor(&r->obj); \
efree(r); \
} while (0)

#endif
4 changes: 1 addition & 3 deletions include/php7/_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
#ifndef ___CONTEXT_H___
#define ___CONTEXT_H___

static inline void context_value_bind(char *name, zval *val) {
zend_set_local_var_str(name, strlen(name), val, 1);
}
#define CONTEXT_VALUE_BIND(n, v) zend_set_local_var_str(n, strlen(n), v, 1)

#endif
47 changes: 26 additions & 21 deletions include/php7/_receiver.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,33 @@
#ifndef ___RECEIVER_H___
#define ___RECEIVER_H___

#define RECEIVER_GET(o, m) zval *receiver_get(zval *o, zval *m, int t, void **c, zval *r)
#define RECEIVER_RETVAL_GET(v) r

#define RECEIVER_SET(o, m, v) void receiver_set(zval *o, zval *m, zval *v, void **c)
#define RECEIVER_EXISTS(o, m, ck) int receiver_exists(zval *o, zval *m, int ck, void **c)

#define RECEIVER_FUNC_GET() (zend_internal_function *) EX(func)
#define RECEIVER_FUNC_DESTROY(f) zend_string_release(f->function_name); efree(f)

#define RECEIVER_GET_METHOD(o, n, l) zend_function *receiver_get_method(zend_object **o, zend_string *n, const zval *k)
#define RECEIVER_METHOD_NAME(n, l) zend_string_copy(name)

#define RECEIVER_CONSTRUCTOR(o) zend_function *receiver_constructor(zend_object *o)
#define RECEIVER_CREATE(ct) zend_object *receiver_create(zend_class_entry *ct)

#define RECEIVER_OBJECT_GET(o) o
#define RECEIVER_OBJECT_CREATE(r) \
do { \
r->obj.handlers = &receiver_handlers; \
return (zend_object *) r; \
// Function definition overrides.
#define RECEIVER_GET(o, m) receiver_get(o, m, int t, void **c, zval *r)
#define RECEIVER_SET(o, m, v) receiver_set(o, m, v, void **c)
#define RECEIVER_EXISTS(o, m, h) receiver_exists(o, m, h, void **c)
#define RECEIVER_DESTROY(o) receiver_destroy(zend_object *o)
#define RECEIVER_CREATE(c) zend_object *receiver_create(c)
#define RECEIVER_METHOD_GET(o, n, l) receiver_method_get(zend_object **o, zend_string *n, const zval *k)
#define RECEIVER_METHOD_CALL(m) receiver_method_call(zend_string *m, zend_object *o, INTERNAL_FUNCTION_PARAMETERS)
#define RECEIVER_CONSTRUCTOR_GET(o) receiver_constructor_get(zend_object *o)

#define RECEIVER_RETVAL() (r)
#define RECEIVER_STRING_COPY(n) zend_string_copy(name)
#define RECEIVER_FUNC() (zend_internal_function *) EX(func)
#define RECEIVER_FUNC_NAME(m) (m)->val
#define RECEIVER_FUNC_SET_ARGFLAGS(f) zend_set_function_arg_flags((zend_function *) f);

#define RECEIVER_OBJECT(o) (o)
#define RECEIVER_OBJECT_CREATE(r) \
do { \
receiver_handlers.free_obj = receiver_destroy; \
r->obj.handlers = &receiver_handlers; \
return (zend_object *) r; \
} while (0)

#define RECEIVER_GET_ENTRY
#define RECEIVER_OBJECT_DESTROY(r) \
do { \
zend_object_std_dtor(&r->obj); \
} while (0)

#endif
6 changes: 3 additions & 3 deletions include/receiver.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@

#include "_receiver.h"

#define receiver_get_pointer(ce, name) \
#define RECEIVER_POINTER(ce, name) \
(void *) Z_LVAL_P(zend_read_static_property(ce, name, sizeof(name) - 1, 1))

#define receiver_set_pointer(ce, name, ptr) \
#define RECEIVER_POINTER_SET(ce, name, ptr) \
zend_declare_property_long(ce, name, sizeof(name) - 1, (long int) ptr, \
ZEND_ACC_STATIC | ZEND_ACC_PRIVATE)

This comment has been minimized.

Copy link
@deuill

deuill Jan 10, 2016

Author Owner

Adding ZEND_ACC_PRIVATE seems to crash PHP, this will need to be re-added in the future.

ZEND_ACC_STATIC)

typedef struct _engine_receiver {
zend_object obj;
Expand Down
Loading

0 comments on commit 600978c

Please sign in to comment.