wez             Thu Apr 22 10:27:11 2004 EDT

  Modified files:              
    /php-src/ext/com_dotnet     com_variant.c 
  Log:
  A working fix for the safearray mapping bug.
  
  
http://cvs.php.net/diff.php/php-src/ext/com_dotnet/com_variant.c?r1=1.5&r2=1.6&ty=u
Index: php-src/ext/com_dotnet/com_variant.c
diff -u php-src/ext/com_dotnet/com_variant.c:1.5 
php-src/ext/com_dotnet/com_variant.c:1.6
--- php-src/ext/com_dotnet/com_variant.c:1.5    Wed Apr 21 20:50:49 2004
+++ php-src/ext/com_dotnet/com_variant.c        Thu Apr 22 10:27:11 2004
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: com_variant.c,v 1.5 2004/04/22 00:50:49 wez Exp $ */
+/* $Id: com_variant.c,v 1.6 2004/04/22 14:27:11 wez Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -37,18 +37,24 @@
        SAFEARRAY *sa = NULL;
        SAFEARRAYBOUND bound;
        HashPosition pos;
+       int keytype;
        char *strindex;
        int strindexlen;
        long intindex;
        long max_index = 0;
        VARIANT *va;
        zval **item;
-
+               
        /* find the largest array index, and assert that all keys are integers */
        zend_hash_internal_pointer_reset_ex(HASH_OF(z), &pos);
        for (;; zend_hash_move_forward_ex(HASH_OF(z), &pos)) {
-               if (HASH_KEY_IS_LONG != zend_hash_get_current_key_ex(HASH_OF(z), 
&strindex, &strindexlen, &intindex, 0, &pos)) {
+
+               keytype = zend_hash_get_current_key_ex(HASH_OF(z), &strindex, 
&strindexlen, &intindex, 0, &pos);
+
+               if (HASH_KEY_IS_STRING == keytype) {
                        goto bogus;
+               } else if (HASH_KEY_NON_EXISTANT == keytype) {
+                       break;
                }
                if (intindex > max_index) {
                        max_index = intindex;
@@ -57,25 +63,25 @@
 
        /* allocate the structure */    
        bound.lLbound = 0;
-       bound.cElements = intindex;
+       bound.cElements = intindex + 1;
        sa = SafeArrayCreate(VT_VARIANT, 1, &bound);
 
        /* get a lock on the array itself */
-       SafeArrayLock(sa);
+       SafeArrayAccessData(sa, &va);
        va = (VARIANT*)sa->pvData;
        
        /* now fill it in */
        zend_hash_internal_pointer_reset_ex(HASH_OF(z), &pos);
        for (;; zend_hash_move_forward_ex(HASH_OF(z), &pos)) {
                if (FAILURE == zend_hash_get_current_data_ex(HASH_OF(z), 
(void**)&item, &pos)) {
-                       goto bogus;
+                       break;
                }
                zend_hash_get_current_key_ex(HASH_OF(z), &strindex, &strindexlen, 
&intindex, 0, &pos);
                php_com_variant_from_zval(&va[intindex], *item, codepage TSRMLS_CC);   
         
        }
 
        /* Unlock it and stuff it into our variant */
-       SafeArrayUnlock(sa);
+       SafeArrayUnaccessData(sa);
        V_VT(v) = VT_ARRAY|VT_VARIANT;
        V_ARRAY(v) = sa;
 
@@ -278,7 +284,9 @@
                obj->code_page = codepage;
        }
 
-       php_com_variant_from_zval(&obj->v, zvalue, obj->code_page TSRMLS_CC);
+       if (zvalue) {
+               php_com_variant_from_zval(&obj->v, zvalue, obj->code_page TSRMLS_CC);
+       }
 
        if (ZEND_NUM_ARGS() >= 2) {
 
@@ -818,7 +826,7 @@
                return;
        }
        obj = CDNO_FETCH(zobj);
-
+               
        RETURN_LONG(V_VT(&obj->v));
 }
 /* }}} */

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to