You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/04/14 16:28:10 UTC

svn commit: r764789 - in /commons/sandbox/runtime/trunk/src: main/native/ main/native/include/ main/native/include/arch/unix/ main/native/include/arch/windows/ main/native/shared/ main/native/test/ test/org/apache/commons/runtime/

Author: mturk
Date: Tue Apr 14 14:28:09 2009
New Revision: 764789

URL: http://svn.apache.org/viewvc?rev=764789&view=rev
Log:
Add table utility code and test case

Added:
    commons/sandbox/runtime/trunk/src/main/native/include/acr_tables.h   (with props)
    commons/sandbox/runtime/trunk/src/main/native/shared/tables.c   (with props)
Modified:
    commons/sandbox/runtime/trunk/src/main/native/Makefile.in
    commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in
    commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h
    commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h
    commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
    commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java

Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.in
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.in?rev=764789&r1=764788&r2=764789&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.in Tue Apr 14 14:28:09 2009
@@ -68,7 +68,8 @@
 	$(SRCDIR)/shared/dbb.$(OBJ) \
 	$(SRCDIR)/shared/error.$(OBJ) \
 	$(SRCDIR)/shared/memory.$(OBJ) \
-	$(SRCDIR)/shared/string.$(OBJ)
+	$(SRCDIR)/shared/string.$(OBJ) \
+	$(SRCDIR)/shared/tables.$(OBJ)
 
 LINUX_OBJS= \
 	$(SRCDIR)/os/unix/main.$(OBJ) \

Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in?rev=764789&r1=764788&r2=764789&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in Tue Apr 14 14:28:09 2009
@@ -62,7 +62,8 @@
 	$(SRCDIR)/shared/dbb.$(OBJ) \
 	$(SRCDIR)/shared/error.$(OBJ) \
 	$(SRCDIR)/shared/memory.$(OBJ) \
-	$(SRCDIR)/shared/string.$(OBJ)
+	$(SRCDIR)/shared/string.$(OBJ) \
+	$(SRCDIR)/shared/tables.$(OBJ)
 
 WINDOWS_OBJS= \
 	$(SRCDIR)/os/win32/main.$(OBJ) \

Added: commons/sandbox/runtime/trunk/src/main/native/include/acr_tables.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_tables.h?rev=764789&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_tables.h (added)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_tables.h Tue Apr 14 14:28:09 2009
@@ -0,0 +1,191 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ACR_TABLES_H
+#define _ACR_TABLES_H
+
+#include "acr.h"
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file acr_tables.h
+ * @brief
+ *
+ * ACR table functions and structures
+ *
+ */
+
+#define ACR_TABLE_HASH_MASK        255
+#define ACR_TABLE_HASH_SIZE        256
+
+/** the table abstract data type */
+typedef struct acr_table_t acr_table_t;
+
+typedef struct acr_array_t {
+    acr_size_t  nelts;
+    acr_size_t  nalloc;
+    acr_size_t  esize;
+    char       *elts;
+} acr_array_t;
+
+/**
+ * Create array
+ * @param env Current JNI environment.
+ * @param file Source file where the function was called
+ * @param line Source file line where the function was called
+ * @param nelts Initial number of elements in the array.
+ * @param esize Size of the each element
+ */
+ACR_DECLARE(acr_array_t *) ACR_ArrayMake(JNIEnv *env, const char *file, int line,
+                                         acr_size_t nelts, acr_size_t esize);
+
+/**
+ * Destroy the array and free used memory
+ * @param env Current JNI environment.
+ * @param file Source file where the function was called
+ * @param line Source file line where the function was called
+ * @param arr Array to destroy.
+ */
+ACR_DECLARE(void) ACR_ArrayFree(JNIEnv *_E, const char *file, int line,
+                                acr_array_t *arr);
+
+/**
+ * Add a new element to an array (as a first-in, last-out stack)
+ * @param env Current JNI environment.
+ * @param file Source file where the function was called
+ * @param line Source file line where the function was called
+ * @param arr The array to add an element to.
+ */
+ACR_DECLARE(void *) ACR_ArrayPush(JNIEnv *_E, const char *file, int line,
+                                  acr_array_t *arr);
+
+/**
+ * Remove an element from an array (as a first-in, last-out stack)
+ * @param env Current JNI environment.
+ * @param file Source file where the function was called
+ * @param line Source file line where the function was called
+ * @param arr The array to remove an element from.
+ * @return Location of the element in the array.
+ * @remark If there are no elements in the array, NULL is returned.
+ */
+ACR_DECLARE(void *) ACR_ArrayPop(acr_array_t *arr);
+
+/**
+ * Remove all elements from an array.
+ * @param arr The array to remove all elements from.
+ * @remark No memory is freed by this operation,
+ * but is available for reuse.
+ */
+ACR_DECLARE(void) ACR_ArrayClear(acr_array_t *arr);
+
+/** A helper macro for accessing a member of an ACR array.
+ *
+ * @param A the array
+ * @param I the index into the array to return
+ * @param T the type of the objects stored in the array
+ *
+ * @return the item at index i
+ */
+#define ACR_ARRAY_IDX(A,I,T) (((T *)(A)->elts)[I])
+
+/** A helper macro for pushing elements into an ACR array.
+ *
+ * @param A the array
+ * @param T the type of the objects stored in the array
+ *
+ * @return the location where the new object should be placed
+ */
+#define ACR_ARRAY_PUSH(A,T) (*((T *)ACR_ArrayPush(_E,THROW_FMARK,A)))
+
+/**
+ * Create table
+ * @param env Current JNI environment.
+ * @param file Source file where the function was called
+ * @param line Source file line where the function was called
+ * @param nelts Initial number of elements in the table.
+ */
+ACR_DECLARE(acr_table_t *) ACR_TableMake(JNIEnv *_E, const char *file, int line,
+                                         acr_size_t nelts);
+
+/**
+ * Destroy the table and free used memory
+ * @param env Current JNI environment.
+ * @param file Source file where the function was called
+ * @param line Source file line where the function was called
+ * @param tbl Table to destroy.
+ */
+ACR_DECLARE(void) ACR_TableFree(JNIEnv *_E, const char *file, int line,
+                                acr_table_t *tbl);
+
+/**
+ * Set the table key/data pair
+ * @param env Current JNI environment.
+ * @param file Source file where the function was called
+ * @param line Source file line where the function was called
+ * @param t Table to use.
+ * @param key Key
+ * @param data Data
+ * @param dlen Data length
+ * @remark If key already exists in the table it's data will
+ * be overwritten.
+ */
+ACR_DECLARE(void) ACR_TableSet(JNIEnv *_E, const char *file, int line,
+                               acr_table_t *t, const char *key,
+                               const void *data, acr_size_t dlen);
+
+/**
+ * Add the key/data pair to the table
+ * @param env Current JNI environment.
+ * @param file Source file where the function was called
+ * @param line Source file line where the function was called
+ * @param t Table to use.
+ * @param key Key
+ * @param data Data
+ * @param dlen Data length
+ * @remark If the key alredy exists another instance will be added.
+ */
+ACR_DECLARE(void) ACR_TableAdd(JNIEnv *_E, const char *file, int line,
+                               acr_table_t *t, const char *key,
+                               const void *data, acr_size_t dlen);
+
+/**
+ * Get the data from the table
+ * @param t Table to use.
+ * @param key Key to get
+ * @param data Pointer where to store the data. Can be NULL
+ * @param dlen Pointer where to store the data length. Can be NULL
+ * @remark If the key was not found ACR_NOTFOUND is returned. In case
+ * it is found the data and dlen are set and ACR_SUCCESS is returned.
+ */
+ACR_DECLARE(int) ACR_TableGet(acr_table_t *t, const char *key,
+                              void **data, acr_size_t *dlen);
+
+/**
+ * Get the internal table array
+ * @param tbl Table from which to get the array.
+ * @remark Returned array should be used only for traversing the data.
+ */
+ACR_DECLARE(const acr_array_t *) ACR_TableArray(acr_table_t *tbl);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ACR_TABLES_H */

Propchange: commons/sandbox/runtime/trunk/src/main/native/include/acr_tables.h
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h?rev=764789&r1=764788&r2=764789&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h Tue Apr 14 14:28:09 2009
@@ -23,6 +23,8 @@
 extern "C" {
 #endif
 
+#define ACR_INLINE  inline
+
 #define ACR_PLATFORM_CLASS_PATH   ACR_CLASS_PATH "platform/unix/"
 #define ACR_JNI_PLATFORM_DECLARE(RT, CL, FN)  \
     JNIEXPORT RT JNICALL Java_org_apache_commons_runtime_platform_unix_##CL##_##FN

Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h?rev=764789&r1=764788&r2=764789&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h Tue Apr 14 14:28:09 2009
@@ -179,6 +179,7 @@
 extern "C" {
 #endif
 
+#define ACR_INLINE                __inline
 #define LOG_MSG_DOMAIN            "ApacheCommonsRuntime"
 
 typedef enum {

Added: commons/sandbox/runtime/trunk/src/main/native/shared/tables.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/tables.c?rev=764789&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/tables.c (added)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/tables.c Tue Apr 14 14:28:09 2009
@@ -0,0 +1,272 @@
+/* Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "acr.h"
+#include "acr_arch.h"
+#include "acr_private.h"
+#include "acr_error.h"
+#include "acr_memory.h"
+#include "acr_string.h"
+#include "acr_vm.h"
+#include "acr_tables.h"
+
+typedef struct table_entry_t table_entry_t;
+
+struct table_entry_t {
+    table_entry_t *next;
+    char          *key;
+    void          *data;
+    acr_size_t     dlen;
+};
+
+struct acr_table_t {
+    /* Pointer to the array of table entries */
+    acr_array_t     a;
+    /* Table of hash buckets            */
+    table_entry_t  *hash[ACR_TABLE_HASH_SIZE];
+};
+
+ACR_DECLARE(acr_array_t *) ACR_ArrayMake(JNIEnv *_E, const char *file, int line,
+                                         acr_size_t nelts, acr_size_t esize)
+{
+    acr_array_t *arr = (acr_array_t *)ACR_Malloc(_E, file, line,
+                                                 sizeof(acr_array_t));
+    if (!arr)
+        return NULL;
+    if (nelts < 1)
+        nelts = 1;
+    if (esize < 1)
+        esize = 1;
+    arr->elts = (char *)ACR_Malloc(_E, file, line, nelts * esize);
+    if (!arr->elts) {
+        free(arr);
+        return NULL;
+    }
+    arr->nalloc = nelts;
+    arr->esize  = esize;
+    arr->nelts  = 0;
+
+    return arr;
+}
+
+ACR_DECLARE(void) ACR_ArrayFree(JNIEnv *_E, const char *file, int line,
+                                acr_array_t *arr)
+{
+    if (arr) {
+        if (arr->elts)
+            free(arr->elts);
+        free(arr);
+    }
+    else {
+        ACR_ThrowException(_E,  file, line, ACR_EX_ENULL,
+                           ACR_EISNULL);
+    }
+}
+
+ACR_DECLARE(void *) ACR_ArrayPush(JNIEnv *_E, const char *file, int line,
+                                  acr_array_t *arr)
+{
+    if (!arr) {
+        ACR_ThrowException(_E,  file, line, ACR_EX_ENULL,
+                           ACR_EISNULL);
+        return NULL;
+    }
+    if (!arr->elts) {
+        ACR_ThrowException(_E,  file, line, ACR_EX_ENULL,
+                           ACR_EISNULL);
+        return NULL;
+    }
+    if (arr->nelts == arr->nalloc) {
+        acr_size_t ns = (arr->nalloc << 1);
+        void *nd;
+
+        if (!(nd = ACR_Malloc(_E, file, line, arr->esize * ns)))
+            return NULL;
+        memcpy(nd, arr->elts, arr->nalloc * arr->esize);
+        free(arr->elts);
+        arr->elts   = nd;
+        arr->nalloc = ns;
+    }
+
+    ++arr->nelts;
+    return arr->elts + (arr->esize * (arr->nelts - 1));
+}
+
+ACR_DECLARE(void *) ACR_ArrayPop(acr_array_t *arr)
+{
+    if (!arr || !arr->elts || !arr->nelts) {
+        return NULL;
+    }
+    else
+        return arr->elts + (arr->esize * (--arr->nelts));
+}
+
+ACR_DECLARE(void) ACR_ArrayClear(acr_array_t *arr)
+{
+    if (arr) {
+        arr->nelts = 0;
+    }
+}
+
+static ACR_INLINE unsigned int times33hash(const char *key)
+{
+    const char *p;
+    unsigned int hash = 0;
+    for (p = key; *p; p++) {
+        hash = hash * 33 + *p;
+    }
+    return hash & ACR_TABLE_HASH_MASK;
+}
+
+ACR_DECLARE(acr_table_t *) ACR_TableMake(JNIEnv *_E, const char *file, int line,
+                                         acr_size_t nelts)
+{
+    acr_table_t *tbl = (acr_table_t *)ACR_Calloc(_E, file, line,
+                                                 sizeof(acr_table_t));
+    if (!tbl)
+        return NULL;
+    if (nelts < 1)
+        nelts = 1;
+    tbl->a.elts = (char *)ACR_Malloc(_E, file, line,
+                                     nelts * sizeof(table_entry_t));
+    if (!tbl->a.elts) {
+        free(tbl);
+        return NULL;
+    }
+    tbl->a.nalloc = nelts;
+    tbl->a.esize  = sizeof(table_entry_t);
+    tbl->a.nelts  = 0;
+
+    return tbl;
+}
+
+ACR_DECLARE(void) ACR_TableSet(JNIEnv *_E, const char *file, int line,
+                               acr_table_t *t, const char *key,
+                               const void *data, acr_size_t dlen)
+{
+    table_entry_t *e = NULL;
+    unsigned int hash;
+
+    if (!key || !*key) {
+        ACR_ThrowException(_E, file, line, ACR_EX_ENULL,
+                           ACR_EISNULL);
+        return;     /* Skip empty and null strings */
+    }
+    hash = times33hash(key);
+
+    if (t->hash[hash]) {
+       /*
+        * This spot in the table is already in use.  See if the current string
+        * has already been inserted, and if so, increment its count.
+        */
+        for (e = t->hash[hash]; e; e = e->next) {
+            if (!strcmp(key, e->key))
+                break;
+        }
+    }
+    if (e == NULL) {
+        e = (table_entry_t *)ACR_ArrayPush(_E, file, line, &(t->a));
+        if (!e) {
+            /* The exception has already been thrown.
+             * Just bail out.
+             */
+            return;
+        }
+        e->key  = (char *)key;
+        /* Insert new bucket into the list */
+        e->next = t->hash[hash];
+        t->hash[hash] = e;
+    }
+    e->data = (void *)data;
+    e->dlen = dlen;
+}
+
+ACR_DECLARE(void) ACR_TableAdd(JNIEnv *_E, const char *file, int line,
+                               acr_table_t *t, const char *key,
+                               const void *data, acr_size_t dlen)
+{
+    table_entry_t *e;
+    unsigned int hash;
+
+    if (!key || !*key) {
+        ACR_ThrowException(_E, file, line, ACR_EX_ENULL,
+                           ACR_EISNULL);
+        return;     /* Skip empty and null strings */
+    }
+    hash = times33hash(key);
+
+    e = (table_entry_t *)ACR_ArrayPush(_E, file, line, &(t->a));
+    if (!e) {
+        /* The exception has already been thrown.
+         * Just bail out.
+         */
+        return;
+    }
+    e->key  = (char *)key;
+    e->data = (void *)data;
+    e->dlen = dlen;
+    /* Insert new bucket into the list */
+    e->next = t->hash[hash];
+    t->hash[hash] = e;
+}
+
+ACR_DECLARE(int) ACR_TableGet(acr_table_t *t, const char *key,
+                              void **data, acr_size_t *dlen)
+{
+    table_entry_t *e = NULL;
+    unsigned int hash;
+
+    if (!key || !*key) {
+        return ACR_EINVAL;     /* Skip empty and null strings */
+    }
+    hash = times33hash(key);
+
+    if (t->hash[hash]) {
+        for (e = t->hash[hash]; e; e = e->next) {
+            if (!strcmp(key, e->key)) {
+                if (data)
+                    *data = e->data;
+                if (dlen)
+                    *dlen = e->dlen;
+
+                return ACR_SUCCESS;
+            }
+        }
+    }
+    return ACR_NOTFOUND;
+}
+
+ACR_DECLARE(void) ACR_TableFree(JNIEnv *_E, const char *file, int line,
+                                acr_table_t *tbl)
+{
+    if (tbl) {
+        if (tbl->a.elts)
+            free(tbl->a.elts);
+        free(tbl);
+    }
+    else {
+        ACR_ThrowException(_E, file, line, ACR_EX_ENULL,
+                           ACR_EISNULL);
+    }
+}
+
+ACR_DECLARE(const acr_array_t *) ACR_TableArray(acr_table_t *tbl)
+{
+    if (tbl)
+        return &(tbl->a);
+    else
+        return NULL;
+}

Propchange: commons/sandbox/runtime/trunk/src/main/native/shared/tables.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/test/testcase.c?rev=764789&r1=764788&r2=764789&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/test/testcase.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/test/testcase.c Tue Apr 14 14:28:09 2009
@@ -20,6 +20,7 @@
 #include "acr_error.h"
 #include "acr_string.h"
 #include "acr_memory.h"
+#include "acr_tables.h"
 #include "acr_vm.h"
 
 
@@ -84,3 +85,48 @@
     CSTR_RELEASE(s);
     return l;
 }
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test007)(ACR_JNISTDARGS, jint d)
+{
+    acr_array_t *a;
+    int i;
+
+    a = ACR_ArrayMake(_E, THROW_FMARK, 0, sizeof(int));
+    for (i = 0; i < 10; i++) {
+        ACR_ARRAY_PUSH(a, int) = i;
+    }
+    for (i = 0; i < 10; i++) {
+        if (i != (ACR_ARRAY_IDX(a, i, int)))
+            break;
+    }
+    ACR_ArrayFree(_E, THROW_FMARK, a);
+    return i;
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test008)(ACR_JNISTDARGS, jstring s)
+{
+    acr_table_t *t;
+    void *d;
+    acr_size_t l;
+    jint rc = 0;
+    CSTR_GETCHAR(s);
+
+    t = ACR_TableMake(_E, THROW_FMARK, 1);
+    ACR_TableSet(_E, THROW_FMARK, t, J2S(s), J2S(s), 0);
+    ACR_TableSet(_E, THROW_FMARK, t, J2S(s), J2S(s), 1);
+    
+    if (ACR_TableGet(t, J2S(s), &d, &l) == ACR_SUCCESS) {
+        if (!strcmp(J2S(s), (const char *)d) && l == 1)
+            rc = 1;
+    }
+    if (rc) {
+        const acr_array_t *a;
+        ACR_TableAdd(_E, THROW_FMARK, t, J2S(s), J2S(s), 2);
+        a = ACR_TableArray(t);
+        if (a->nelts != 2)
+            rc = 0;
+    }
+    ACR_TableFree(_E, THROW_FMARK, t);
+    CSTR_RELEASE(s);
+    return rc;
+}

Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java?rev=764789&r1=764788&r2=764789&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java (original)
+++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java Tue Apr 14 14:28:09 2009
@@ -46,6 +46,8 @@
     private static native int  test004(int d);
     private static native int  test005(String msg);
     private static native int  test006(String msg);
+    private static native int  test007(int d);
+    private static native int  test008(String msg);
 
 
     protected void setUp()
@@ -138,4 +140,18 @@
         assertEquals("Length", 6, i);
     }
 
+    public void testArray()
+        throws Exception
+    {
+        int i = test007(0);
+        assertEquals("Count", 10, i);
+    }
+
+    public void testTable()
+        throws Exception
+    {
+        int i = test008("Foo");
+        assertEquals("Result", 1, i);
+    }
+
 }