void skyray_promise_then(skyray_promise_t *self, zval *on_fulfilled, zval *on_rejected, zval *retval) { zval *result, params[2], function_name; if (Z_TYPE(self->result) != IS_UNDEF) { result = skyray_promise_unwrap(self); ZVAL_NULL(¶ms[0]); ZVAL_NULL(¶ms[1]); ZVAL_STR(&function_name, intern_str_then); if (on_fulfilled) { ZVAL_COPY_VALUE(¶ms[0], on_fulfilled); } if (on_rejected) { ZVAL_COPY_VALUE(¶ms[1], on_rejected); } call_user_function(NULL, result, &function_name, retval, 2, params); assert(EG(exception) == NULL); } else { object_init_ex(retval, skyray_ce_Promise); skyray_promise_t *promise = skyray_promise_from_obj(Z_OBJ_P(retval)); promise_resolve_context_t *context; if (on_fulfilled != NULL && !ZVAL_IS_NULL(on_fulfilled)) { context = promise_resolve_context_create(promise, on_fulfilled, NULL); } else { context = promise_resolve_context_create(promise, NULL, self); } zend_hash_next_index_insert_ptr(&self->on_fulfilled, context); if (on_rejected != NULL && !ZVAL_IS_NULL(on_rejected)) { context = promise_resolve_context_create(promise, on_rejected, NULL); } else { context = promise_resolve_context_create(promise, NULL, self); } zend_hash_next_index_insert_ptr(&self->on_rejcted, context); } }
void skyray_promise_done(skyray_promise_t *self, zval *on_fulfilled, zval *on_rejected) { zval *result, params[2], function_name, retval; if (Z_TYPE(self->result) != IS_UNDEF) { result = skyray_promise_unwrap(self); ZVAL_NULL(¶ms[0]); ZVAL_NULL(¶ms[1]); ZVAL_STR(&function_name, intern_str_done); if (on_fulfilled) { ZVAL_COPY_VALUE(¶ms[0], on_fulfilled); } if (on_rejected) { ZVAL_COPY_VALUE(¶ms[1], on_rejected); } call_user_function(NULL, result, &function_name, &retval, 2, params); zval_ptr_dtor(&retval); } else { promise_resolve_context_t *context; if (on_fulfilled != NULL && !ZVAL_IS_NULL(on_fulfilled)) { context = promise_resolve_context_create(NULL, on_fulfilled, NULL); zend_hash_next_index_insert_ptr(&self->on_fulfilled, context); } if (on_rejected != NULL && !ZVAL_IS_NULL(on_rejected)) { context = promise_resolve_context_create(NULL, on_rejected, NULL); } else { context = promise_resolve_context_create(NULL, NULL, self); } zend_hash_next_index_insert_ptr(&self->on_rejcted, context); } }
/* {{{ _php_array_to_envp */ static php_process_env_t _php_array_to_envp(zval *environment, int is_persistent) { zval *element; php_process_env_t env; zend_string *key, *str; #ifndef PHP_WIN32 char **ep; #endif char *p; size_t cnt, l, sizeenv = 0; HashTable *env_hash; memset(&env, 0, sizeof(env)); if (!environment) { return env; } cnt = zend_hash_num_elements(Z_ARRVAL_P(environment)); if (cnt < 1) { #ifndef PHP_WIN32 env.envarray = (char **) pecalloc(1, sizeof(char *), is_persistent); #endif env.envp = (char *) pecalloc(4, 1, is_persistent); return env; } ALLOC_HASHTABLE(env_hash); zend_hash_init(env_hash, cnt, NULL, NULL, 0); /* first, we have to get the size of all the elements in the hash */ ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(environment), key, element) { str = zval_get_string(element); if (ZSTR_LEN(str) == 0) { zend_string_release(str); continue; } sizeenv += ZSTR_LEN(str) + 1; if (key && ZSTR_LEN(key)) { sizeenv += ZSTR_LEN(key) + 1; zend_hash_add_ptr(env_hash, key, str); } else { zend_hash_next_index_insert_ptr(env_hash, str); } } ZEND_HASH_FOREACH_END();