fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * CDDL HEADER START
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The contents of this file are subject to the terms of the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Common Development and Distribution License (the "License").
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * You may not use this file except in compliance with the License.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * or http://www.opensolaris.org/os/licensing.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * See the License for the specific language governing permissions
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * and limitations under the License.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * When distributing Covered Code, include this CDDL HEADER in each
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * If applicable, add the following below this CDDL HEADER, with the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * fields enclosed by brackets "[]" replaced with your own identifying
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * information: Portions Copyright [yyyy] [name of copyright owner]
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * CDDL HEADER END
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
e77b06d21580f630e0a7c437495ab283d3672828tomee * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Use is subject to license terms.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#pragma ident "%Z%%M% %I% %E% SMI"
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <stdlib.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <stddef.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <sys/types.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <pthread.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <string.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#include <dtj_util.h>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * dtj_util.c separates functionality that is generally useful from
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * that which is specific to the Java DTrace API. If moved to a separate
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * library, this functionality could be shared by other JNI wrappers.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeboolean_t g_dtj_util_debug = B_FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic boolean_t g_dtj_load_common = B_FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* NativeException */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_nx_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_nxinit_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.io.Serializable */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_serial_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Number */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_number_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_shortval_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_intval_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_longval_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Byte */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_byte_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_byteinit_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Character */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_char_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_charinit_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_charval_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Short */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_short_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_shortinit_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Integer */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_int_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_intinit_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Long */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_long_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_longinit_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
e77b06d21580f630e0a7c437495ab283d3672828tomee/* java.math.BigInteger */
e77b06d21580f630e0a7c437495ab283d3672828tomeejclass g_bigint_jc = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomeejmethodID g_bigint_val_jsm = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomeejmethodID g_bigint_div_jm = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomeejmethodID g_bigint_shl_jm = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomeejmethodID g_bigint_or_jm = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomeejmethodID g_bigint_setbit_jm = 0;
e77b06d21580f630e0a7c437495ab283d3672828tomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.String */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_string_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_strinit_bytes_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_strbytes_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_trim_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee/* java.lang.StringBuilder */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_buf_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_bufinit_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_buf_append_char_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_buf_append_int_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_buf_append_long_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_buf_append_str_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_buf_append_obj_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_buflen_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_bufsetlen_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Object */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_object_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_tostring_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_equals_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Enum */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_enum_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_enumname_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* List */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejclass g_list_jc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_listclear_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_listadd_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_listget_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejmethodID g_listsize_jm = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Global list pools */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic uu_list_pool_t *g_pointer_pool = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic uu_list_pool_t *g_string_pool = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_status_t dtj_get_jni_classes(JNIEnv *, uu_list_t *, uu_list_pool_t *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *, uu_list_pool_t *, const dtj_table_entry_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_status_t dtj_cache_jni_methods(JNIEnv *, dtj_java_class_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_status_t dtj_cache_jni_fields(JNIEnv *, dtj_java_class_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Constructors */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_java_class_t *dtj_java_class_create(JNIEnv *, jclass *, char *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *, uu_list_pool_t *, uu_list_pool_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_java_method_t *dtj_java_method_create(JNIEnv *, jmethodID *, char *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *, uu_list_pool_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_java_method_t *dtj_java_static_method_create(JNIEnv *, jmethodID *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *, char *, uu_list_pool_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_java_field_t *dtj_java_field_create(JNIEnv *, jfieldID *, char *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *, uu_list_pool_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_java_field_t *dtj_java_static_field_create(JNIEnv *, jfieldID *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *, char *, uu_list_pool_t *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Destructors */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void dtj_java_class_destroy(void *, void *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void dtj_java_method_destroy(void *, void *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void dtj_java_field_destroy(void *, void *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Comparison functions, uu_compare_fn_t signature */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int dtj_java_class_cmp(const void *, const void *, void *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int dtj_java_method_cmp(const void *, const void *, void *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int dtj_java_field_cmp(const void *, const void *, void *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Java Throwable */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void dtj_throw(JNIEnv *, jclass, const char *, va_list *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Support for uu_list_t wrappers */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic boolean_t dtj_check_pointer_pool(void);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic boolean_t dtj_check_string_pool(void);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_status_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_load_common(JNIEnv *jenv)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_status_t status;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee static const dtj_table_entry_t table[] = {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NativeException */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_nx_jc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "org/opensolaris/os/dtrace/NativeException" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_nxinit_jm, CONSTRUCTOR,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "(Ljava/lang/String;ILjava/lang/Throwable;)V" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.io.Serializable */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_serial_jc, "java/io/Serializable" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Number */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_number_jc, "java/lang/Number" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_shortval_jm, "shortValue", "()S" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_intval_jm, "intValue", "()I" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_longval_jm, "longValue", "()J" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Byte */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_byte_jc, "java/lang/Byte" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_byteinit_jm, CONSTRUCTOR, "(B)V" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Character */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_char_jc, "java/lang/Character" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_charinit_jm, CONSTRUCTOR, "(C)V" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_charval_jm, "charValue", "()C" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Short */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_short_jc, "java/lang/Short" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_shortinit_jm, CONSTRUCTOR, "(S)V" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Integer */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_int_jc, "java/lang/Integer" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_intinit_jm, CONSTRUCTOR, "(I)V" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Long */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_long_jc, "java/lang/Long" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_longinit_jm, CONSTRUCTOR, "(J)V" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
e77b06d21580f630e0a7c437495ab283d3672828tomee /* java.math.BigInteger */
e77b06d21580f630e0a7c437495ab283d3672828tomee { JCLASS, &g_bigint_jc, "java/math/BigInteger" },
e77b06d21580f630e0a7c437495ab283d3672828tomee { JMETHOD_STATIC, &g_bigint_val_jsm, "valueOf",
e77b06d21580f630e0a7c437495ab283d3672828tomee "(J)Ljava/math/BigInteger;" },
e77b06d21580f630e0a7c437495ab283d3672828tomee { JMETHOD, &g_bigint_div_jm, "divide",
e77b06d21580f630e0a7c437495ab283d3672828tomee "(Ljava/math/BigInteger;)Ljava/math/BigInteger;" },
e77b06d21580f630e0a7c437495ab283d3672828tomee { JMETHOD, &g_bigint_shl_jm, "shiftLeft",
e77b06d21580f630e0a7c437495ab283d3672828tomee "(I)Ljava/math/BigInteger;" },
e77b06d21580f630e0a7c437495ab283d3672828tomee { JMETHOD, &g_bigint_or_jm, "or",
e77b06d21580f630e0a7c437495ab283d3672828tomee "(Ljava/math/BigInteger;)Ljava/math/BigInteger;" },
e77b06d21580f630e0a7c437495ab283d3672828tomee { JMETHOD, &g_bigint_setbit_jm, "setBit",
e77b06d21580f630e0a7c437495ab283d3672828tomee "(I)Ljava/math/BigInteger;" },
e77b06d21580f630e0a7c437495ab283d3672828tomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.String */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_string_jc, "java/lang/String" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_strinit_bytes_jm, CONSTRUCTOR, "([B)V" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_strbytes_jm, "getBytes", "()[B" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_trim_jm, "trim", "()Ljava/lang/String;" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee /* java.lang.StringBuilder */
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee { JCLASS, &g_buf_jc, "java/lang/StringBuilder" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_bufinit_jm, CONSTRUCTOR, "()V" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_buf_append_char_jm, "append",
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee "(C)Ljava/lang/StringBuilder;" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_buf_append_int_jm, "append",
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee "(I)Ljava/lang/StringBuilder;" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_buf_append_long_jm, "append",
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee "(J)Ljava/lang/StringBuilder;" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_buf_append_str_jm, "append",
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee "(Ljava/lang/String;)Ljava/lang/StringBuilder;" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_buf_append_obj_jm, "append",
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee "(Ljava/lang/Object;)Ljava/lang/StringBuilder;" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_buflen_jm, "length", "()I" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_bufsetlen_jm, "setLength", "(I)V" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Object */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_object_jc, "java/lang/Object" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_tostring_jm, "toString",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "()Ljava/lang/String;" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_equals_jm, "equals",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "(Ljava/lang/Object;)Z" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Enum */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_enum_jc, "java/lang/Enum" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_enumname_jm, "name",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "()Ljava/lang/String;" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* List */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JCLASS, &g_list_jc, "java/util/List" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_listclear_jm, "clear", "()V" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_listadd_jm, "add", "(Ljava/lang/Object;)Z" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_listget_jm, "get", "(I)Ljava/lang/Object;" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_listsize_jm, "size", "()I" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { DTJ_TYPE_END }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee };
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee status = dtj_cache_jni_classes(jenv, table);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (status == DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_dtj_load_common = B_TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (status);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_class_cmp(const void * v1, const void * v2, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtj_java_class_t *c1 = v1;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtj_java_class_t *c2 = v2;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (strcmp(c1->djc_name, c2->djc_name));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_method_cmp(const void *v1, const void *v2, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int cmp;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtj_java_method_t *m1 = v1;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtj_java_method_t *m2 = v2;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee cmp = strcmp(m1->djm_name, m2->djm_name);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (cmp == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee cmp = strcmp(m1->djm_signature, m2->djm_signature);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (cmp);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic int
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_field_cmp(const void *v1, const void *v2, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtj_java_field_t *f1 = v1;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtj_java_field_t *f2 = v2;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (strcmp(f1->djf_name, f2->djf_name));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_java_class_t *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_class_create(JNIEnv *jenv, jclass *jc, char *name,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *classpool, uu_list_pool_t *methodpool,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *fieldpool)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_class_t *c = uu_zalloc(sizeof (dtj_java_class_t));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (c) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_init(c, &c->djc_node, classpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->djc_ptr = jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->djc_name = name;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->djc_methods = uu_list_create(methodpool, NULL,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (g_dtj_util_debug ? UU_LIST_DEBUG : 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!c->djc_methods) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed method list creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_fini(c, &c->djc_node, classpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->djc_fields = uu_list_create(fieldpool, NULL,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (g_dtj_util_debug ? UU_LIST_DEBUG : 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!c->djc_fields) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed field list creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_destroy(c->djc_methods);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->djc_methods = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_fini(c, &c->djc_node, classpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to allocate class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_java_method_t *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_method_create(JNIEnv *jenv, jmethodID *jm, char *name, char *signature,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *methodpool)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_method_t *m = uu_zalloc(sizeof (dtj_java_method_t));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (m) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_init(m, &m->djm_node, methodpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee m->djm_ptr = jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee m->djm_name = name;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee m->djm_signature = signature;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee m->djm_static = B_FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to allocate method description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (m);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_java_method_t *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_static_method_create(JNIEnv *jenv, jmethodID *jm, char *name,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *signature, uu_list_pool_t *methodpool)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_method_t *m = dtj_java_method_create(jenv, jm, name, signature,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee methodpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (m) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee m->djm_static = B_TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (m);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_java_field_t *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_field_create(JNIEnv *jenv, jfieldID *jf, char *name, char *type,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *fieldpool)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_field_t *f = uu_zalloc(sizeof (dtj_java_field_t));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (f) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_init(f, &f->djf_node, fieldpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f->djf_ptr = jf;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f->djf_name = name;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f->djf_type = type;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f->djf_static = B_FALSE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to allocate field description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (f);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_java_field_t *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_static_field_create(JNIEnv *jenv, jfieldID *jf, char *name, char *type,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *fieldpool)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_field_t *f = dtj_java_field_create(jenv, jf, name, type,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee fieldpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (f) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f->djf_static = B_TRUE;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (f);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_class_destroy(void *v, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (v) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_class_t *c = v;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->djc_ptr = NULL; /* do not free user-defined storage */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->djc_name = NULL; /* string literal */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_destroy(c->djc_methods, dtj_java_method_destroy, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_destroy(c->djc_fields, dtj_java_field_destroy, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->djc_methods = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->djc_fields = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_free(v);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_method_destroy(void *v, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (v) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_method_t *m = v;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee m->djm_ptr = NULL; /* do not free user-defined space */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee m->djm_name = NULL; /* string literal */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee m->djm_signature = NULL; /* string literal */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_free(v);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_field_destroy(void *v, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (v) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_field_t *f = v;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f->djf_ptr = NULL; /* do not free user-defined space */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f->djf_name = NULL; /* string literal */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f->djf_type = NULL; /* string literal */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_free(f);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_status_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_cache_jni_classes(JNIEnv *jenv, const dtj_table_entry_t *table)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_class_t *class;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *classpool;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *methodpool;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *fieldpool;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_t *classes;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_t *itr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass gjc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_status_t status;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee classpool = uu_list_pool_create("classpool",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee sizeof (dtj_java_class_t),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee offsetof(dtj_java_class_t, djc_node), dtj_java_class_cmp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (g_dtj_util_debug ? UU_LIST_POOL_DEBUG : 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!classpool) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "failed class pool creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee methodpool = uu_list_pool_create("methodpool",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee sizeof (dtj_java_method_t),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee offsetof(dtj_java_method_t, djm_node), dtj_java_method_cmp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (g_dtj_util_debug ? UU_LIST_POOL_DEBUG : 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!methodpool) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "failed method pool creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee fieldpool = uu_list_pool_create("fieldpool",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee sizeof (dtj_java_field_t),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee offsetof(dtj_java_field_t, djf_node), dtj_java_field_cmp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (g_dtj_util_debug ? UU_LIST_POOL_DEBUG : 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!fieldpool) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "failed field pool creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee classes = uu_list_create(classpool, NULL,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (g_dtj_util_debug ? UU_LIST_DEBUG : 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!classes) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "failed class list creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee status = dtj_get_jni_classes(jenv, classes, classpool, methodpool,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee fieldpool, table);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (status != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java error pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (status);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee itr = uu_list_walk_start(classes, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((class = uu_list_walk_next(itr)) != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc = (*jenv)->FindClass(jenv, class->djc_name);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!jc) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NoClassDefFoundError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee gjc = (*jenv)->NewGlobalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!gjc) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to create global class reference");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *(class->djc_ptr) = gjc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee status = dtj_cache_jni_methods(jenv, class);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (status != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java error pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (status);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee status = dtj_cache_jni_fields(jenv, class);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (status != DTJ_OK) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java error pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (status);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_destroy(classes, dtj_java_class_destroy, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_destroy(classpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_destroy(methodpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_destroy(fieldpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_OK);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Converts JNI table entry desriptions into java_class_t descriptors.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_status_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_get_jni_classes(JNIEnv *jenv, uu_list_t *classes,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *classpool, uu_list_pool_t *methodpool,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *fieldpool, const dtj_table_entry_t *table)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int i;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_class_t *c = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_method_t *m;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_field_t *f;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (i = 0; table[i].djte_type != DTJ_TYPE_END; ++i) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Class not added until all of its method and field information
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * is attached, so we defer adding a class until the next
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * element with type JCLASS.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee switch (table[i].djte_type) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee case JCLASS:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (c) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* previous class */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_list_add(classes, c)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * In response to an error return value,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * the caller will delete the class
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * descriptions list with any
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * descriptions created so far.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c = dtj_java_class_create(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (jclass *)table[i].djte_addr, table[i].djte_name,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee classpool, methodpool, fieldpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!c) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee case JMETHOD:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!c) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "method description not preceded "
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "by class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee m = dtj_java_method_create(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (jmethodID *)table[i].djte_addr,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee table[i].djte_name, table[i].djte_desc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee methodpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!m) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_list_add(c->djc_methods, m)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add method description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee case JMETHOD_STATIC:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!c) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "static method description not preceded "
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "by class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee m = dtj_java_static_method_create(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (jmethodID *)table[i].djte_addr,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee table[i].djte_name, table[i].djte_desc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee methodpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!m) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_list_add(c->djc_methods, m)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add static method description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee case JFIELD:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!c) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "field description not preceded "
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "by class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f = dtj_java_field_create(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (jfieldID *)table[i].djte_addr,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee table[i].djte_name, table[i].djte_desc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee fieldpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!f) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_list_add(c->djc_fields, f)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add field description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee case JFIELD_STATIC:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!c) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "static field description not preceded "
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "by class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f = dtj_java_static_field_create(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (jfieldID *)table[i].djte_addr,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee table[i].djte_name, table[i].djte_desc,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee fieldpool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!f) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_list_add(c->djc_fields, f)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add static field description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee break;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee default:
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Unexpected jni_type_e: %d", table[i].djte_type);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (c) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* last class */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_list_add(classes, c)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_OK);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_status_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_cache_jni_methods(JNIEnv *jenv, dtj_java_class_t *c)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_method_t *method;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jmethodID jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_t *itr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee itr = uu_list_walk_start(c->djc_methods, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((method = uu_list_walk_next(itr)) != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (method->djm_static) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jm = (*jenv)->GetStaticMethodID(jenv, *(c->djc_ptr),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee method->djm_name, method->djm_signature);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jm = (*jenv)->GetMethodID(jenv, *(c->djc_ptr),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee method->djm_name, method->djm_signature);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (jm == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * The pending NoSuchMethodError gives only the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * method name, which is not so helpful for
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * overloaded methods and methods such as <init>
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * that have the same name in multiple classes.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Clear the pending error and throw one that
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * includes the class name and the method
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * signature.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char msg[DTJ_MSG_SIZE];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ExceptionClear(jenv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) snprintf(msg, sizeof (msg), "%s %s %s",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->djc_name, method->djm_name,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee method->djm_signature);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc = (*jenv)->FindClass(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "java/lang/NoSuchMethodError");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ThrowNew(jenv, jc, msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *(method->djm_ptr) = jm;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_OK);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_status_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_cache_jni_fields(JNIEnv *jenv, dtj_java_class_t *c)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_field_t *field;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jfieldID jf;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_t *itr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee itr = uu_list_walk_start(c->djc_fields, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((field = uu_list_walk_next(itr)) != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (field->djf_static) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jf = (*jenv)->GetStaticFieldID(jenv, *(c->djc_ptr),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee field->djf_name, field->djf_type);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jf = (*jenv)->GetFieldID(jenv, *(c->djc_ptr),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee field->djf_name, field->djf_type);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (jf == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char msg[DTJ_MSG_SIZE];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ExceptionClear(jenv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) snprintf(msg, sizeof (msg),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "%s.%s signature: %s", c->djc_name,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee field->djf_name, field->djf_type);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc = (*jenv)->FindClass(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "java/lang/NoSuchFieldError");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ThrowNew(jenv, jc, msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_ERR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *(field->djf_ptr) = jf;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_walk_end(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_OK);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Common utilities */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw(JNIEnv *jenv, jclass jc, const char *fmt, va_list *ap)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char msg[DTJ_MSG_SIZE];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) vsnprintf(msg, sizeof (msg), fmt, *ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ThrowNew(jenv, jc, msg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_out_of_memory(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_list ap;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass jc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * JNI documentation unclear whether NewGlobalRef() can throw
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * OutOfMemoryError, so we'll make this function safe in case
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * OutOfMemoryError has already been thrown
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jc = (*jenv)->FindClass(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "java/lang/OutOfMemoryError");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_start(ap, fmt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw(jenv, jc, fmt, &ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_end(ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_null_pointer(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_list ap;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass jc = (*jenv)->FindClass(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "java/lang/NullPointerException");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_start(ap, fmt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw(jenv, jc, fmt, &ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_end(ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_illegal_state(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_list ap;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass jc = (*jenv)->FindClass(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "java/lang/IllegalStateException");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_start(ap, fmt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw(jenv, jc, fmt, &ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_end(ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_illegal_argument(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_list ap;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass jc = (*jenv)->FindClass(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "java/lang/IllegalArgumentException");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_start(ap, fmt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw(jenv, jc, fmt, &ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_end(ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_no_such_element(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_list ap;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass jc = (*jenv)->FindClass(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "java/util/NoSuchElementException");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_start(ap, fmt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw(jenv, jc, fmt, &ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_end(ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_class_cast(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_list ap;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass jc = (*jenv)->FindClass(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "java/lang/ClassCastException");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_start(ap, fmt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw(jenv, jc, fmt, &ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_end(ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_assertion(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_list ap;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass jc = (*jenv)->FindClass(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "java/lang/AssertionError");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_start(ap, fmt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw(jenv, jc, fmt, &ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_end(ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_resource_limit(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_list ap;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jclass jc = (*jenv)->FindClass(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "org/opensolaris/os/dtrace/ResourceLimitException");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_start(ap, fmt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw(jenv, jc, fmt, &ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_end(ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_wrap_exception(JNIEnv *jenv, const char *file, int line)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jthrowable e = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jthrowable nx = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring jfile = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee e = (*jenv)->ExceptionOccurred(jenv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!g_dtj_load_common) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ExceptionClear(jenv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Unsafe to test while exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->IsInstanceOf(jenv, e, g_nx_jc)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Already wrapped */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->Throw(jenv, e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jfile = dtj_NewStringNative(jenv, file);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Only wrap the exception if possible, otherwise just throw the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * original exception.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ExceptionClear(jenv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->Throw(jenv, e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee nx = (jthrowable)(*jenv)->NewObject(jenv, g_nx_jc, g_nxinit_jm,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jfile, line, e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jfile);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ExceptionClear(jenv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->Throw(jenv, e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->Throw(jenv, nx);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, nx);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Calls the given java object's toString() method and prints the value to
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * stdout. Useful for debugging. Guaranteed that no exception is pending when
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * this function returns.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_print_object(JNIEnv *jenv, jobject jobj)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring jstr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *cstr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!g_dtj_load_common) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "dtj_load_common() has not been called");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ExceptionDescribe(jenv); /* clears the exception */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!jobj) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) printf("null\n");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstr = (*jenv)->CallObjectMethod(jenv, jobj, g_tostring_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ExceptionDescribe(jenv); /* clears the exception */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee cstr = (*jenv)->GetStringUTFChars(jenv, jstr, 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (cstr) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) printf("%s\n", cstr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ExceptionDescribe(jenv); /* clears the exception */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jstr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ReleaseStringUTFChars(jenv, jstr, cstr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jstr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
e77b06d21580f630e0a7c437495ab283d3672828tomeejobject
e77b06d21580f630e0a7c437495ab283d3672828tomeedtj_uint64(JNIEnv *jenv, uint64_t u)
e77b06d21580f630e0a7c437495ab283d3672828tomee{
e77b06d21580f630e0a7c437495ab283d3672828tomee int64_t i = (int64_t)u;
e77b06d21580f630e0a7c437495ab283d3672828tomee jobject val64;
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee if (i >= 0) {
e77b06d21580f630e0a7c437495ab283d3672828tomee val64 = (*jenv)->CallStaticObjectMethod(jenv, g_bigint_jc,
e77b06d21580f630e0a7c437495ab283d3672828tomee g_bigint_val_jsm, u);
e77b06d21580f630e0a7c437495ab283d3672828tomee } else {
e77b06d21580f630e0a7c437495ab283d3672828tomee jobject tmp;
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee u ^= ((uint64_t)0x1 << 63);
e77b06d21580f630e0a7c437495ab283d3672828tomee val64 = (*jenv)->CallStaticObjectMethod(jenv, g_bigint_jc,
e77b06d21580f630e0a7c437495ab283d3672828tomee g_bigint_val_jsm, u);
e77b06d21580f630e0a7c437495ab283d3672828tomee tmp = val64;
e77b06d21580f630e0a7c437495ab283d3672828tomee val64 = (*jenv)->CallObjectMethod(jenv, tmp,
e77b06d21580f630e0a7c437495ab283d3672828tomee g_bigint_setbit_jm, 63);
e77b06d21580f630e0a7c437495ab283d3672828tomee (*jenv)->DeleteLocalRef(jenv, tmp);
e77b06d21580f630e0a7c437495ab283d3672828tomee }
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee return (val64);
e77b06d21580f630e0a7c437495ab283d3672828tomee}
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomeejobject
e77b06d21580f630e0a7c437495ab283d3672828tomeedtj_int128(JNIEnv *jenv, uint64_t high, uint64_t low)
e77b06d21580f630e0a7c437495ab283d3672828tomee{
e77b06d21580f630e0a7c437495ab283d3672828tomee jobject val128;
e77b06d21580f630e0a7c437495ab283d3672828tomee jobject low64;
e77b06d21580f630e0a7c437495ab283d3672828tomee jobject tmp;
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee val128 = (*jenv)->CallStaticObjectMethod(jenv, g_bigint_jc,
e77b06d21580f630e0a7c437495ab283d3672828tomee g_bigint_val_jsm, high);
e77b06d21580f630e0a7c437495ab283d3672828tomee tmp = val128;
e77b06d21580f630e0a7c437495ab283d3672828tomee val128 = (*jenv)->CallObjectMethod(jenv, tmp, g_bigint_shl_jm, 64);
e77b06d21580f630e0a7c437495ab283d3672828tomee (*jenv)->DeleteLocalRef(jenv, tmp);
e77b06d21580f630e0a7c437495ab283d3672828tomee low64 = dtj_uint64(jenv, low);
e77b06d21580f630e0a7c437495ab283d3672828tomee tmp = val128;
e77b06d21580f630e0a7c437495ab283d3672828tomee val128 = (*jenv)->CallObjectMethod(jenv, tmp, g_bigint_or_jm, low64);
e77b06d21580f630e0a7c437495ab283d3672828tomee (*jenv)->DeleteLocalRef(jenv, tmp);
e77b06d21580f630e0a7c437495ab283d3672828tomee (*jenv)->DeleteLocalRef(jenv, low64);
e77b06d21580f630e0a7c437495ab283d3672828tomee
e77b06d21580f630e0a7c437495ab283d3672828tomee return (val128);
e77b06d21580f630e0a7c437495ab283d3672828tomee}
e77b06d21580f630e0a7c437495ab283d3672828tomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejstring
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_format_string(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_list ap;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char str[DTJ_MSG_SIZE];
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring jstr = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_start(ap, fmt);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) vsnprintf(str, sizeof (str), fmt, ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee va_end(ap);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstr = dtj_NewStringNative(jenv, str);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* return NULL if OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (jstr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeejstring
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_NewStringNative(JNIEnv *jenv, const char *str)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring result;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jbyteArray bytes = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int len;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!g_dtj_load_common) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "dtj_load_common() has not been called");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee len = strlen(str);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee bytes = (*jenv)->NewByteArray(jenv, len);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!bytes) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->SetByteArrayRegion(jenv, bytes, 0, len,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (jbyte *)str);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, bytes);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* ArrayIndexOutOfBoundsException pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee result = (*jenv)->NewObject(jenv, g_string_jc, g_strinit_bytes_jm,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee bytes);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, bytes);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* return NULL result if exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (result);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeechar *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_GetStringNativeChars(JNIEnv *jenv, jstring jstr)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jbyteArray bytes = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jint len;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *result = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!g_dtj_load_common) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "dtj_load_common() has not been called");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee bytes = (*jenv)->CallObjectMethod(jenv, jstr, g_strbytes_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Does not throw exceptions */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee len = (*jenv)->GetArrayLength(jenv, bytes);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee result = malloc(len + 1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!result) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, bytes);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "could not allocate native chars");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Skip check for ArrayIndexOutOfBoundsException */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->GetByteArrayRegion(jenv, bytes, 0, len,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (jbyte *)result);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, bytes);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee result[len] = '\0'; /* NUL-terminate */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (result);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_ReleaseStringNativeChars(JNIEnv *jenv, jstring jstr, const char *str)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free((void *)str);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeechar **
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_get_argv(JNIEnv *jenv, jobjectArray args, int *argc)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char **argv = NULL; /* return value */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *str;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int i;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstring jstr = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!g_dtj_load_common) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "dtj_load_common() has not been called");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *argc = (*jenv)->GetArrayLength(jenv, args);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Initialize all string pointers to NULL so that in case of an error
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * filling in the array, free_argv() will not attempt to free the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * unallocated elements. Also NULL-terminate the string array for
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * functions that expect terminating NULL rather than rely on argc.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee argv = uu_zalloc((sizeof (char *)) * (*argc + 1));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!argv) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "Failed to allocate args array");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (i = 0; i < *argc; ++i) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstr = (*jenv)->GetObjectArrayElement(jenv, args, i);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_free_argv(argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee str = dtj_GetStringNativeChars(jenv, jstr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_free_argv(argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jstr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee argv[i] = malloc(strlen(str) + 1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!argv[i]) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "Failed to allocate arg");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_free_argv(argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(jenv, jstr, str);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jstr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strcpy(argv[i], str);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(jenv, jstr, str);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->DeleteLocalRef(jenv, jstr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstr = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeechar **
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_make_argv(JNIEnv *jenv, jstring command, int *argc)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *ws = "\f\n\r\t\v ";
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char **argv = NULL; /* return value */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *cmd; /* native command string */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *s; /* writable command */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *tok; /* token */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int len;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!g_dtj_load_common) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_state(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "dtj_load_common() has not been called");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!command) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_null_pointer(jenv, "command is null");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if ((*jenv)->GetStringLength(jenv, command) == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_argument(jenv, "command is empty");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee cmd = dtj_GetStringNativeChars(jenv, command);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if ((*jenv)->ExceptionCheck(jenv)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee len = strlen(cmd);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee s = malloc(len + 1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!s) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "failed to allocate command string");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(jenv, command, cmd);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strcpy(s, cmd);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Initialize all string pointers to NULL so that in case of an error
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * filling in the array, free_argv() will not attempt to free the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * unallocated elements. Also NULL-terminate the string array for
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * functions that expect terminating NULL rather than rely on argc.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Allow for maximum length resulting from single-character tokens
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * separated by single spaces.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee argv = uu_zalloc(sizeof (char *) * (len / 2 + 1));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!argv) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "failed to allocate args array");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(jenv, command, cmd);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *argc = 0;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (tok = strtok(s, ws); tok != NULL; tok = strtok(NULL, ws)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee argv[*argc] = malloc(strlen(tok) + 1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!argv[*argc]) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "Failed to allocate arg");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_free_argv(argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(jenv, command, cmd);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strcpy(argv[(*argc)++], tok);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (*argc == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_illegal_argument(jenv, "command is blank");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_free_argv(argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(jenv, command, cmd);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_ReleaseStringNativeChars(jenv, command, cmd);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_free_argv(char **argv)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (argv) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char **s = argv;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (*s) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free((void *)*s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee *s++ = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free((void *)argv);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Wrappers for uu_list_t */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeint
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_entry_cmp(const void *v1, const void *v2, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtj_pointer_list_entry_t *p1 = v1;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtj_pointer_list_entry_t *p2 = v2;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /*
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * It is not valid to compare pointers using the relational operators
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * unless they point to elements in the same array.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee */
80ab886d233f514d54c2a6bdeb9fdfd951bd6881wesolows uint64_t x = (uintptr_t)p1->dple_ptr;
80ab886d233f514d54c2a6bdeb9fdfd951bd6881wesolows uint64_t y = (uintptr_t)p2->dple_ptr;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee int rc;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee rc = ((x > y) ? 1 : ((x < y) ? -1 : 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (rc);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeint
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_entry_cmp(const void *v1, const void *v2, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtj_string_list_entry_t *p1 = v1;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const dtj_string_list_entry_t *p2 = v2;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *s1 = p1->dsle_value;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee const char *s2 = p2->dsle_value;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (s1 == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (s2 == NULL ? 0 : -1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (s2 == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (strcmp(s1, s2));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic boolean_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_check_pointer_pool(void)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_pointer_pool == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_pointer_pool = uu_list_pool_create("g_pointer_pool",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee sizeof (dtj_pointer_list_entry_t),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee offsetof(dtj_pointer_list_entry_t, dple_node),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_entry_cmp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (g_dtj_util_debug ? UU_LIST_POOL_DEBUG : 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_pointer_pool == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (B_FALSE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (B_TRUE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeuu_list_t *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_create(void)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_t *list;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_check_pointer_pool()) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee list = uu_list_create(g_pointer_pool, NULL,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (g_dtj_util_debug ? UU_LIST_DEBUG : 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (list);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_entry_t *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_entry_create(void *p)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_entry_t *e;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_check_pointer_pool()) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee e = uu_zalloc(sizeof (dtj_pointer_list_entry_t));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_init(e, &e->dple_node, g_pointer_pool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee e->dple_ptr = p;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic boolean_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_check_string_pool(void)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_string_pool == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_string_pool = uu_list_pool_create("g_string_pool",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee sizeof (dtj_string_list_entry_t),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee offsetof(dtj_string_list_entry_t, dsle_node),
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_string_list_entry_cmp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (g_dtj_util_debug ? UU_LIST_POOL_DEBUG : 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (g_string_pool == NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (B_FALSE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (B_TRUE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeuu_list_t *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_create(void)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_t *list;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_check_string_pool()) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee list = uu_list_create(g_string_pool, NULL,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (g_dtj_util_debug ? UU_LIST_DEBUG : 0));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (list);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_entry_t *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_entry_create(const char *s)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_string_list_entry_t *e;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!dtj_check_string_pool()) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee e = uu_zalloc(sizeof (dtj_string_list_entry_t));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_init(e, &e->dsle_node, g_string_pool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (s) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee e->dsle_value = malloc(strlen(s) + 1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (e->dsle_value) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (void) strcpy(e->dsle_value, s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_fini(e, &e->dsle_node,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_string_pool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_free(e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee e = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_entry_destroy(void *v,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_value_destroy_f *value_destroy, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (v) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_entry_t *e = v;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (value_destroy) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee value_destroy(e->dple_ptr, arg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_fini(e, &e->dple_node, g_pointer_pool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee e->dple_ptr = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_free(v);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_entry_destroy(void *v, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (v) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_string_list_entry_t *e = v;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free(e->dsle_value);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_node_fini(e, &e->dsle_node, g_string_pool);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee e->dsle_value = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_free(v);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_list_clear(uu_list_t *list, dtj_value_destroy_f *value_destroy,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee void *cookie; /* needed for uu_list_teardown */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee void *value;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!list) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee cookie = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (value_destroy) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((value = uu_list_teardown(list, &cookie)) != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee value_destroy(value, arg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((value = uu_list_teardown(list, &cookie)) != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_list_destroy(uu_list_t *list,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_value_destroy_f *value_destroy, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_clear(list, value_destroy, arg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_destroy(list);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_clear(uu_list_t *list,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_value_destroy_f *value_destroy, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee void *cookie; /* needed for uu_list_teardown */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_entry_t *e;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!list) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee cookie = NULL;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((e = uu_list_teardown(list, &cookie)) != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_entry_destroy(e, value_destroy, arg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_destroy(uu_list_t *list,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_value_destroy_f *value_destroy, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_clear(list, value_destroy, arg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_destroy(list);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_clear(uu_list_t *list)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_clear(list, dtj_string_list_entry_destroy, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_destroy(uu_list_t *list)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_destroy(list, dtj_string_list_entry_destroy, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeboolean_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_list_empty(uu_list_t *list)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (uu_list_numnodes(list) == 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeboolean_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_list_add(uu_list_t *list, void *value)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (uu_list_insert_before(list, NULL, value) == 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeboolean_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_add(uu_list_t *list, void *p)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_entry_t *e = dtj_pointer_list_entry_create(p);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (B_FALSE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (dtj_list_add(list, e));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_walk_next(uu_list_walk_t *itr)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_entry_t *e = uu_list_walk_next(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_INVALID_PTR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dple_ptr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_first(uu_list_t *list)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_entry_t *e = uu_list_first(list);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NULL is a valid value; use -1 for invalid */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_INVALID_PTR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dple_ptr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeevoid *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_last(uu_list_t *list)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_entry_t *e = uu_list_last(list);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NULL is a valid value; use -1 for invalid */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_INVALID_PTR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dple_ptr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeboolean_t
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_add(uu_list_t *list, const char *s)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_string_list_entry_t *e = dtj_string_list_entry_create(s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (B_FALSE);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (dtj_list_add(list, e));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeconst char *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_walk_next(uu_list_walk_t *itr)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_string_list_entry_t *e = uu_list_walk_next(itr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_INVALID_STR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dsle_value);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeconst char *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_first(uu_list_t *list)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_string_list_entry_t *e = uu_list_first(list);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NULL is a valid string value; use -1 for invalid */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_INVALID_STR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dsle_value);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeconst char *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_last(uu_list_t *list)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee{
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_string_list_entry_t *e = uu_list_last(list);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (!e) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NULL is a valid string value; use -1 for invalid */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (DTJ_INVALID_STR);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee }
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dsle_value);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee}