fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * See the License for the specific language governing permissions
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * and limitations under the License.
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 * CDDL HEADER END
e77b06d21580f630e0a7c437495ab283d3672828tomee * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Use is subject to license terms.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee#pragma ident "%Z%%M% %I% %E% SMI"
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/* NativeException */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.io.Serializable */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Number */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Byte */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Character */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Short */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Integer */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Long */
e77b06d21580f630e0a7c437495ab283d3672828tomee/* java.math.BigInteger */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.String */
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee/* java.lang.StringBuilder */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Object */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* java.lang.Enum */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Global list pools */
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/* 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 *,
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 *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic dtj_java_field_t *dtj_java_static_field_create(JNIEnv *, jfieldID *,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *, char *, uu_list_pool_t *);
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/* 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/* Java Throwable */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeestatic void dtj_throw(JNIEnv *, jclass, const char *, va_list *);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Support for uu_list_t wrappers */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NativeException */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.io.Serializable */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Number */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Byte */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Character */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Short */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Integer */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Long */
e77b06d21580f630e0a7c437495ab283d3672828tomee /* java.math.BigInteger */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.String */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_strinit_bytes_jm, CONSTRUCTOR, "([B)V" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_trim_jm, "trim", "()Ljava/lang/String;" },
4ae67516a1d5dc4a5dbc761762bad5b596647388tomee /* java.lang.StringBuilder */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Object */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java.lang.Enum */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_listadd_jm, "add", "(Ljava/lang/Object;)Z" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee { JMETHOD, &g_listget_jm, "get", "(I)Ljava/lang/Object;" },
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_class_cmp(const void * v1, const void * v2, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_method_cmp(const void *v1, const void *v2, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (cmp == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_field_cmp(const void *v1, const void *v2, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_class_create(JNIEnv *jenv, jclass *jc, char *name,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *classpool, uu_list_pool_t *methodpool,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_class_t *c = uu_zalloc(sizeof (dtj_java_class_t));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed method list creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed field list creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to allocate class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (c);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_method_create(JNIEnv *jenv, jmethodID *jm, char *name, char *signature,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_method_t *m = uu_zalloc(sizeof (dtj_java_method_t));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to allocate method description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (m);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_static_method_create(JNIEnv *jenv, jmethodID *jm, char *name,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_method_t *m = dtj_java_method_create(jenv, jm, name, signature,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (m);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_field_create(JNIEnv *jenv, jfieldID *jf, char *name, char *type,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_field_t *f = uu_zalloc(sizeof (dtj_java_field_t));
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to allocate field description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (f);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_java_static_field_create(JNIEnv *jenv, jfieldID *jf, char *name, char *type,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_java_field_t *f = dtj_java_field_create(jenv, jf, name, type,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (f);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee c->djc_ptr = NULL; /* do not free user-defined storage */
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/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee m->djm_ptr = NULL; /* do not free user-defined space */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee f->djf_ptr = NULL; /* do not free user-defined space */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_cache_jni_classes(JNIEnv *jenv, const dtj_table_entry_t *table)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee offsetof(dtj_java_class_t, djc_node), dtj_java_class_cmp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "failed class pool creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee offsetof(dtj_java_method_t, djm_node), dtj_java_method_cmp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "failed method pool creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee offsetof(dtj_java_field_t, djf_node), dtj_java_field_cmp,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "failed field pool creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "failed class list creation");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee status = dtj_get_jni_classes(jenv, classes, classpool, methodpool,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java error pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NoClassDefFoundError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to create global class reference");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java error pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* java error pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_destroy(classes, dtj_java_class_destroy, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Converts JNI table entry desriptions into java_class_t descriptors.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *classpool, uu_list_pool_t *methodpool,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee uu_list_pool_t *fieldpool, const dtj_table_entry_t *table)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (i = 0; table[i].djte_type != DTJ_TYPE_END; ++i) {
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 /* previous class */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add class description");
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 /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "method description not preceded "
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "by class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add method description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "static method description not preceded "
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "by class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add static method description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "field description not preceded "
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "by class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add field description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "static field description not preceded "
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "by class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add static field description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* last class */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "Failed to add class description");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_cache_jni_methods(JNIEnv *jenv, dtj_java_class_t *c)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (jm == 0) {
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.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_cache_jni_fields(JNIEnv *jenv, dtj_java_class_t *c)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (jf == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Common utilities */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw(JNIEnv *jenv, jclass jc, const char *fmt, va_list *ap)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_out_of_memory(JNIEnv *jenv, const char *fmt, ...)
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
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_null_pointer(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_illegal_state(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_illegal_argument(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_no_such_element(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_class_cast(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_assertion(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_throw_resource_limit(JNIEnv *jenv, const char *fmt, ...)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_wrap_exception(JNIEnv *jenv, const char *file, int line)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Unsafe to test while exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Already wrapped */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * Only wrap the exception if possible, otherwise just throw the
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * original exception.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee nx = (jthrowable)(*jenv)->NewObject(jenv, g_nx_jc, g_nxinit_jm,
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 "dtj_load_common() has not been called");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ExceptionDescribe(jenv); /* clears the exception */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee jstr = (*jenv)->CallObjectMethod(jenv, jobj, g_tostring_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ExceptionDescribe(jenv); /* clears the exception */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee (*jenv)->ExceptionDescribe(jenv); /* clears the exception */
e77b06d21580f630e0a7c437495ab283d3672828tomee if (i >= 0) {
e77b06d21580f630e0a7c437495ab283d3672828tomee val64 = (*jenv)->CallStaticObjectMethod(jenv, g_bigint_jc,
e77b06d21580f630e0a7c437495ab283d3672828tomee val64 = (*jenv)->CallStaticObjectMethod(jenv, g_bigint_jc,
e77b06d21580f630e0a7c437495ab283d3672828tomee val128 = (*jenv)->CallStaticObjectMethod(jenv, g_bigint_jc,
e77b06d21580f630e0a7c437495ab283d3672828tomee val128 = (*jenv)->CallObjectMethod(jenv, tmp, g_bigint_shl_jm, 64);
e77b06d21580f630e0a7c437495ab283d3672828tomee val128 = (*jenv)->CallObjectMethod(jenv, tmp, g_bigint_or_jm, low64);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* return NULL if OutOfMemoryError pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "dtj_load_common() has not been called");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (NULL); /* ArrayIndexOutOfBoundsException pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee result = (*jenv)->NewObject(jenv, g_string_jc, g_strinit_bytes_jm,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* return NULL result if exception pending */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "dtj_load_common() has not been called");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee bytes = (*jenv)->CallObjectMethod(jenv, jstr, g_strbytes_jm);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Does not throw exceptions */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "could not allocate native chars");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* Skip check for ArrayIndexOutOfBoundsException */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_ReleaseStringNativeChars(JNIEnv *jenv, jstring jstr, const char *str)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_get_argv(JNIEnv *jenv, jobjectArray args, int *argc)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "dtj_load_common() has not been called");
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 dtj_throw_out_of_memory(jenv, "Failed to allocate args array");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (i = 0; i < *argc; ++i) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "Failed to allocate arg");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_make_argv(JNIEnv *jenv, jstring command, int *argc)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char *s; /* writable command */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "dtj_load_common() has not been called");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee } else if ((*jenv)->GetStringLength(jenv, command) == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee "failed to allocate command string");
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 dtj_throw_out_of_memory(jenv, "failed to allocate args array");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee for (tok = strtok(s, ws); tok != NULL; tok = strtok(NULL, ws)) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_throw_out_of_memory(jenv, "Failed to allocate arg");
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee if (*argc == 0) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee char **s = argv;
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while (*s) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee free((void *)*s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* Wrappers for uu_list_t */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_pointer_list_entry_cmp(const void *v1, const void *v2, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * It is not valid to compare pointers using the relational operators
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee * unless they point to elements in the same array.
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_string_list_entry_cmp(const void *v1, const void *v2, void *arg)
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (1);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee g_pointer_pool = uu_list_pool_create("g_pointer_pool",
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee/* ARGSUSED */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeedtj_list_clear(uu_list_t *list, dtj_value_destroy_f *value_destroy,
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((value = uu_list_teardown(list, &cookie)) != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((value = uu_list_teardown(list, &cookie)) != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee while ((e = uu_list_teardown(list, &cookie)) != NULL) {
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_entry_destroy(e, value_destroy, arg);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_clear(list, dtj_string_list_entry_destroy, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_list_destroy(list, dtj_string_list_entry_destroy, NULL);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (uu_list_insert_before(list, NULL, value) == 0);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_pointer_list_entry_t *e = dtj_pointer_list_entry_create(p);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dple_ptr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NULL is a valid value; use -1 for invalid */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dple_ptr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NULL is a valid value; use -1 for invalid */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dple_ptr);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee dtj_string_list_entry_t *e = dtj_string_list_entry_create(s);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeconst char *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dsle_value);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeconst char *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NULL is a valid string value; use -1 for invalid */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dsle_value);
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomeeconst char *
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee /* NULL is a valid string value; use -1 for invalid */
fb3fb4f3d76d55b64440afd0af72775dfad3bd1dtomee return (e->dsle_value);