< prev index next >

test/hotspot/jtreg/vmTestbase/nsk/share/jni/ExceptionCheckingJniEnv.cpp

Print this page
rev 52828 : 8213501: Deploy ExceptionJniWrapper for a few tests
Summary:
Reviewed-by:
rev 52829 : [mq]: new_version

*** 139,186 **** // We are aiming to do: // snprintf(full_message, len, "JNI method %s : %s from %s : %d", _base_message, _error_message, // _file, _line); // but will use strlen + memcpy instead. const char* pre_message = "JNI method "; ! size_t pre_len = strlen(pre_message); ! size_t base_len = strlen(_base_message); ! const char* between_message = " : "; ! size_t between_len = strlen(between_message); ! const char* from_message = " from "; ! size_t from_len = strlen(from_message); ! size_t error_len = strlen(_error_message); ! const char* file_name = _file ? _file : "Unknown file"; ! size_t file_len = strlen(file_name); ! // +10 for the integer and +1 for the '\0' ! size_t len = pre_len + base_len + between_len + error_len + from_len + file_len + between_len + 10 + 1; char* full_message = (char*) malloc(len); if (full_message == NULL) { _env->HandleError(_error_message); return; } ! // Now we construct the string using memcpy to not use sprintf/std::string // instead of: ! // snprintf(full_message, len, "%s : %s", _base_message, _error_message); ! memcpy(full_message, pre_message, pre_len); ! memcpy(full_message + pre_len, _base_message, base_len); ! memcpy(full_message + pre_len + base_len, between_message, between_len); ! memcpy(full_message + pre_len + base_len + between_len, _error_message, error_len); ! memcpy(full_message + pre_len + base_len + between_len + error_len, from_message, from_len); ! memcpy(full_message + pre_len + base_len + between_len + error_len + from_len, file_name, file_len); ! memcpy(full_message + pre_len + base_len + between_len + error_len + from_len + file_len, ! between_message, between_len); ! ! DecimalToAscii( ! full_message + pre_len + base_len + between_len + error_len + from_len + file_len + between_len, ! _line); ! ! // -1 due to the '\0' not counted by strlen but is counted for the allocation. ! if (strlen(full_message) >= len - 1) { ! _env->GetJNIEnv()->FatalError("Length of message is greater than expected"); } _env->HandleError(full_message); free(full_message); } --- 139,204 ---- // We are aiming to do: // snprintf(full_message, len, "JNI method %s : %s from %s : %d", _base_message, _error_message, // _file, _line); // but will use strlen + memcpy instead. const char* pre_message = "JNI method "; ! const char* between_msg = " : "; ! const char* from_msg = " from "; ! const char* file_name = _file ? _file : "Unknown File"; ! const char* strs[] = { ! pre_message, ! _base_message, ! between_msg, ! _error_message, ! from_msg, ! file_name, ! between_msg, ! }; ! ! size_t msg_number = sizeof(strs) / sizeof(strs[0]); ! size_t len = 0; ! for (size_t i = 0; i < msg_number; i++) { ! len += strlen(strs[i]); ! } ! ! // 32-bit signed means 11 characters due to the '-'. ! const int MAX_INTEGER_DIGITS = 11; ! // Add for the line number and 1 for the '\0'. ! len += MAX_INTEGER_DIGITS + 1; char* full_message = (char*) malloc(len); if (full_message == NULL) { _env->HandleError(_error_message); return; } ! // Now we construct the string using strncat to not use sprintf/std::string // instead of: ! // snprintf(full_message, len, "JNI method %s : %s from %s:%d", _base_message, ! // _error_message, _file, _line); ! full_message[0] = '\0'; ! size_t current_len = 0; ! for (size_t i = 0; i < msg_number; i++) { ! size_t current_src_len = strlen(strs[i]); ! current_len += current_src_len; ! if (current_len >= len) { ! _env->GetJNIEnv()->FatalError("Length of message is not what was expected"); ! } ! ! strncat(full_message, strs[i], current_src_len); ! } ! ! // 10 is the max for an integer transformation. ! if (current_len + MAX_INTEGER_DIGITS >= len) { ! _env->GetJNIEnv()->FatalError("Length of message is not what was expected with line"); ! } ! ! DecimalToAscii(full_message + current_len, _line); ! ! if (strlen(full_message) >= len) { ! _env->GetJNIEnv()->FatalError("Final length of message is not what was expected"); } _env->HandleError(full_message); free(full_message); }
< prev index next >