test/hotspot/jtreg/vmTestbase/vm/mlvm/share/mlvmJvmtiUtils.cpp
author jcbeyler
Thu, 27 Sep 2018 15:56:40 -0700
changeset 51941 0f7d0bb6cfe2
parent 51774 79dc492c00ab
child 52229 d8843761f478
permissions -rw-r--r--
8211036: Remove the NSK_STUB macros from vmTestbase for non jvmti Summary: Remove the NSK_STUB macros from code outside of the jvmti subfolder Reviewed-by: iignatyev, amenkov, dholmes

/*
 * Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "jvmti.h"
#include "agent_common.h"
#include "JVMTITools.h"
#include "jvmti_tools.h"
#include "mlvmJvmtiUtils.h"

extern "C" {

void copyFromJString(JNIEnv * pEnv, jstring src, char ** dst) {
    const char * pStr;
        jsize len;

    if ( ! NSK_VERIFY((pStr = pEnv->GetStringUTFChars(src, NULL)) != NULL) ) {
        return;
    }

    len = pEnv->GetStringUTFLength(src) + 1;
    *dst = (char*) malloc(len);
    strncpy(*dst, pStr, len);

    pEnv->ReleaseStringUTFChars(src, pStr);
}

struct MethodName * getMethodName(jvmtiEnv * pJvmtiEnv, jmethodID method) {
    char * szName;
    char * szSignature;
    jclass clazz;
    struct MethodName * mn;

    if ( ! NSK_JVMTI_VERIFY(pJvmtiEnv->GetMethodName(method, &szName, NULL, NULL)) ) {
        return NULL;
    }

    if ( ! NSK_JVMTI_VERIFY(pJvmtiEnv->GetMethodDeclaringClass(method, &clazz)) ) {
        NSK_JVMTI_VERIFY(pJvmtiEnv->Deallocate((unsigned char*) szName));
        return NULL;
    }

    if ( ! NSK_JVMTI_VERIFY(pJvmtiEnv->GetClassSignature(clazz, &szSignature, NULL)) ) {
        NSK_JVMTI_VERIFY(pJvmtiEnv->Deallocate((unsigned char*) szName));
        return NULL;
    }

    mn = (MethodName*) malloc(sizeof(MethodNameStruct));
    strncpy(mn->methodName, szName, sizeof(mn->methodName));
    strncpy(mn->classSig, szSignature, sizeof(mn->classSig));

    NSK_JVMTI_VERIFY(pJvmtiEnv->Deallocate((unsigned char*) szName));
    NSK_JVMTI_VERIFY(pJvmtiEnv->Deallocate((unsigned char*) szSignature));
    return mn;
}

char * locationToString(jvmtiEnv * pJvmtiEnv, jmethodID method, jlocation location) {
    struct MethodName * pMN;
    int len;
    char * result;
    const char * const format = "%s .%s :" JLONG_FORMAT;

    pMN = getMethodName(pJvmtiEnv, method);
    if ( ! pMN )
        return strdup("NONE");

    len = snprintf(NULL, 0, format, pMN->classSig, pMN->methodName, location) + 1;

    if (len <= 0) {
        free(pMN);
        return NULL;
    }

    result = (char*) malloc(len);
    if (result == NULL) {
        free(pMN);
        return NULL;
    }

    snprintf(result, len, format, pMN->classSig, pMN->methodName, location);

    free(pMN);
    return result;
}

void * getTLS(jvmtiEnv * pJvmtiEnv, jthread thread, jsize sizeToAllocate) {
    void * tls;
    if ( ! NSK_JVMTI_VERIFY(pJvmtiEnv->GetThreadLocalStorage(thread, &tls)) )
        return NULL;

    if ( ! tls) {
        if ( ! NSK_VERIFY((tls = malloc(sizeToAllocate)) != NULL) )
            return NULL;

        memset(tls, 0, sizeToAllocate);

        if ( ! NSK_JVMTI_VERIFY(pJvmtiEnv->SetThreadLocalStorage(thread, tls)) )
            return NULL;
    }

    return tls;
}

}