Clean up context pre-processor bindings

This commit is contained in:
Alex Palaistras 2016-05-03 18:36:00 +01:00
parent d64dade5fe
commit deb519497d
5 changed files with 67 additions and 54 deletions

View File

@ -64,11 +64,12 @@ void context_exec(engine_context *context, char *filename) {
}
void *context_eval(engine_context *context, char *script) {
zval str;
VALUE_SET_STRING(&str, script);
zval str, tmp;
// Compile script value.
uint32_t compiler_options = CG(compiler_options);
VALUE_SET_STRING(&str, script);
CG(compiler_options) = ZEND_COMPILE_DEFAULT_FOR_EVAL;
zend_op_array *op = zend_compile_string(&str, "gophp-engine");
CG(compiler_options) = compiler_options;
@ -82,8 +83,7 @@ void *context_eval(engine_context *context, char *script) {
}
// Attempt to execute compiled string.
zval tmp;
CONTEXT_EXECUTE(op, &tmp);
context_eval_proxy(op, &tmp);
// Allocate result value and copy temporary execution result in.
zval *result = malloc(sizeof(zval));

View File

@ -6,40 +6,6 @@
#define ___CONTEXT_H___
static void context_bind_proxy(char *name, zval *value);
#define CONTEXT_EXECUTE(o, v) do { \
zend_op_array *oparr = EG(active_op_array); \
zval *retval=NULL; \
zval **retvalptr = EG(return_value_ptr_ptr); \
zend_op **opline = EG(opline_ptr); \
int interact = CG(interactive); \
EG(return_value_ptr_ptr) = &retval; \
EG(active_op_array) = o; \
EG(no_extensions) = 1; \
if (!EG(active_symbol_table)) { \
zend_rebuild_symbol_table(); \
} \
CG(interactive) = 0; \
zend_try { \
zend_execute(o); \
} zend_catch { \
destroy_op_array(o); \
efree(o); \
zend_bailout(); \
} zend_end_try(); \
destroy_op_array(o); \
efree(o); \
CG(interactive) = interact; \
if (retval) { \
ZVAL_COPY_VALUE(v, retval); \
zval_copy_ctor(v); \
} else { \
ZVAL_NULL(v); \
} \
EG(no_extensions)=0; \
EG(opline_ptr) = opline; \
EG(active_op_array) = oparr; \
EG(return_value_ptr_ptr) = retvalptr; \
} while (0)
static void context_eval_proxy(zend_op_array *op, zval *ret);
#endif

View File

@ -6,20 +6,6 @@
#define ___CONTEXT_H___
static void context_bind_proxy(char *name, zval *value);
#define CONTEXT_EXECUTE(o, v) do { \
EG(no_extensions) = 1; \
zend_try { \
ZVAL_NULL(v); \
zend_execute(o, v); \
} zend_catch { \
destroy_op_array(o); \
efree_size(o, sizeof(zend_op_array)); \
zend_bailout(); \
} zend_end_try(); \
destroy_op_array(o); \
efree_size(o, sizeof(zend_op_array)); \
EG(no_extensions) = 0; \
} while (0)
static void context_eval_proxy(zend_op_array *op, zval *ret);
#endif

View File

@ -5,3 +5,46 @@
static void context_bind_proxy(char *name, zval *value) {
ZEND_SET_SYMBOL(EG(active_symbol_table), name, value);
}
static void context_eval_proxy(zend_op_array *op, zval *ret) {
zend_op_array *oparr = EG(active_op_array);
zval *retval = NULL;
zval **retvalptr = EG(return_value_ptr_ptr);
zend_op **opline = EG(opline_ptr);
int interact = CG(interactive);
EG(return_value_ptr_ptr) = &retval;
EG(active_op_array) = op;
EG(no_extensions) = 1;
if (!EG(active_symbol_table)) {
zend_rebuild_symbol_table();
}
CG(interactive) = 0;
zend_try {
zend_execute(op);
} zend_catch {
destroy_op_array(op);
efree(op);
zend_bailout();
} zend_end_try();
destroy_op_array(op);
efree(op);
CG(interactive) = interact;
if (retval) {
ZVAL_COPY_VALUE(ret, retval);
zval_copy_ctor(ret);
} else {
ZVAL_NULL(ret);
}
EG(no_extensions) = 0;
EG(opline_ptr) = opline;
EG(active_op_array) = oparr;
EG(return_value_ptr_ptr) = retvalptr;
}

View File

@ -5,3 +5,21 @@
static void context_bind_proxy(char *name, zval *value) {
zend_hash_str_update(&EG(symbol_table), name, strlen(name), value);
}
static void context_eval_proxy(zend_op_array *op, zval *ret) {
EG(no_extensions) = 1;
zend_try {
ZVAL_NULL(ret);
zend_execute(op, ret);
} zend_catch {
destroy_op_array(op);
efree_size(op, sizeof(zend_op_array));
zend_bailout();
} zend_end_try();
destroy_op_array(op);
efree_size(op, sizeof(zend_op_array));
EG(no_extensions) = 0;
}