コード例 #1
0
ファイル: promise.c プロジェクト: Lucups/Skyray
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(&params[0]);
        ZVAL_NULL(&params[1]);

        ZVAL_STR(&function_name, intern_str_then);

        if (on_fulfilled) {
            ZVAL_COPY_VALUE(&params[0], on_fulfilled);
        }
        if (on_rejected) {
            ZVAL_COPY_VALUE(&params[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);
    }
}
コード例 #2
0
ファイル: promise.c プロジェクト: Lucups/Skyray
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(&params[0]);
        ZVAL_NULL(&params[1]);

        ZVAL_STR(&function_name, intern_str_done);

        if (on_fulfilled) {
            ZVAL_COPY_VALUE(&params[0], on_fulfilled);
        }
        if (on_rejected) {
            ZVAL_COPY_VALUE(&params[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);
    }
}
コード例 #3
0
ファイル: proc_open.c プロジェクト: AxiosCros/php-src
/* {{{ _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();