Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:49958 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 23399 invoked from network); 22 Oct 2010 21:22:14 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 22 Oct 2010 21:22:14 -0000 Authentication-Results: pb1.pair.com smtp.mail=martin@divbyzero.net; spf=permerror; sender-id=unknown Authentication-Results: pb1.pair.com header.from=martin@divbyzero.net; sender-id=unknown Received-SPF: error (pb1.pair.com: domain divbyzero.net from 87.230.111.147 cause and error) X-PHP-List-Original-Sender: martin@divbyzero.net X-Host-Fingerprint: 87.230.111.147 mx.bauer-kirch.de Linux 2.6 Received: from [87.230.111.147] ([87.230.111.147:59631] helo=mx.bauer-kirch.de) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 23/F6-08242-38002CC4 for ; Fri, 22 Oct 2010 17:22:13 -0400 Received: by mx.bauer-kirch.de with ESMTP id 1P9P3v-0003xm-PD for ; Fri, 22 Oct 2010 23:22:07 +0200 Message-ID: <4CC2007E.2070703@divbyzero.net> Date: Fri, 22 Oct 2010 23:22:06 +0200 User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.9) Gecko/20100915 Thunderbird/3.1.4 MIME-Version: 1.0 To: internals@lists.php.net Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Subject: Storing zvals in hash tables in resources From: martin@divbyzero.net (Martin Jansen) I'm trying to store zvals in a hash table which is part of a resource. Unfortunately the zvals do not seem to "persist" between function calls: Please see my code below. In foo_get_value zend_hash_find() does *not* return FAILURE, so the key is there while the value is gone. Can someone spot my mistake? - Martin typedef struct _foo_context { HashTable *variables; } foo_context; PHP_FUNCTION(foo_create_context) { foo_context *ctx; ctx = emalloc(sizeof(foo_context)); ALLOC_HASHTABLE(ctx->variables); zend_hash_init(ctx->variables, 32, NULL, NULL, 0); ZEND_REGISTER_RESOURCE(return_value, ctx, le_foo_context); } PHP_FUNCTION(foo_assign_value) { foo_context *ctx; zval *zcontext; char *name; int name_len; zval *value; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz", &zcontext, &name, &name_len, &value) == FAILURE) { return; } ZEND_FETCH_RESOURCE(ctx, foo_context*, &zcontext, -1, FOO_CONTEXT_RES_NAME, le_adl_context); zend_hash_update(ctx->variables, name, name_len + 1, &value, sizeof(zval*), NULL); } PHP_FUNCTION(foo_get_value) { foo_context *ctx; zval *zcontext; char *name; int name_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &zcontext, &name, &name_len) == FAILURE) { return; } ZEND_FETCH_RESOURCE(ctx, foo_context*, &zcontext, -1, FOO_CONTEXT_RES_NAME, le_foo_context); zval **value; if (zend_hash_find(ctx->variables, name, name_len + 1, (void**)&value) == FAILURE) { return; } RETVAL_ZVAL(*value, 1, 0); }