1/*
2 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26#include "util.h"
27#include "inStream.h"
28#include "outStream.h"
29#include "ModuleReferenceImpl.h"
30
31
32static jclass jlM(JNIEnv *env) {
33    return findClass(env, "Ljava/lang/Module;");
34}
35
36static jboolean
37getName(PacketInputStream *in, PacketOutputStream *out)
38{
39    static jmethodID method = NULL;
40    JNIEnv *env = getEnv();
41    char *name = NULL;
42    jstring namestr;
43    jobject module;
44
45    if (method == NULL) {
46        method = getMethod(env, jlM(env), "getName", "()Ljava/lang/String;");
47    }
48    module = inStream_readModuleRef(getEnv(), in);
49    if (inStream_error(in)) {
50        return JNI_TRUE;
51    }
52    namestr = (jstring)JNI_FUNC_PTR(env, CallObjectMethod) (env, module, method);
53    if (namestr != NULL) {
54        name = (char*)JNI_FUNC_PTR(env, GetStringUTFChars)(env, namestr, NULL);
55    } else {
56        // The JDWP converts null into an empty string
57    }
58    (void)outStream_writeString(out, name);
59    if (name != NULL) {
60        jvmtiDeallocate(name);
61    }
62    return JNI_TRUE;
63}
64
65static jboolean
66getClassLoader(PacketInputStream *in, PacketOutputStream *out)
67{
68    static jmethodID method = NULL;
69    JNIEnv *env = getEnv();
70    jobject loader;
71    jobject module;
72
73    if (method == NULL) {
74        method = getMethod(env, jlM(env), "getClassLoader", "()Ljava/lang/ClassLoader;");
75    }
76    module = inStream_readModuleRef(env, in);
77    if (inStream_error(in)) {
78        return JNI_TRUE;
79    }
80    loader = JNI_FUNC_PTR(env, CallObjectMethod) (env, module, method);
81
82    (void)outStream_writeObjectRef(env, out, loader);
83    return JNI_TRUE;
84}
85
86
87void *ModuleReference_Cmds[] = { (void *)3
88    ,(void *)getName
89    ,(void *)getClassLoader
90};
91