--- old/src/share/vm/classfile/vmSymbols.cpp 2016-04-26 16:59:01.594074200 -0700 +++ new/src/share/vm/classfile/vmSymbols.cpp 2016-04-26 16:59:01.141048300 -0700 @@ -416,9 +416,46 @@ } } +bool vmIntrinsics::is_intrinsic_available(vmIntrinsics::ID id) { + return !vmIntrinsics::is_intrinsic_disabled(id) && + !vmIntrinsics::is_disabled_by_flags(id); +} + +bool vmIntrinsics::is_intrinsic_disabled(vmIntrinsics::ID id) { + assert(id != vmIntrinsics::_none, "must be a VM intrinsic"); + + ResourceMark rm; + ccstr DisableIntrinsicString = DirectiveSet::canonicalize_disableintrinsic(DisableIntrinsic); + // Create a copy of the string that contains the list of disabled + // intrinsics. The copy is created because the string + // will be modified by strtok(). Then, the list is tokenized with + // ',' as a separator. + size_t length = strlen(DisableIntrinsicString); + char* local_list = NEW_RESOURCE_ARRAY(char, length + 1); + strncpy(local_list, DisableIntrinsicString, length + 1); + + char* token = strtok(local_list, ","); + while (token != NULL) { + if (strcmp(token, vmIntrinsics::name_at(id)) == 0) { + return true; + } + else { + token = strtok(NULL, ","); + } + } + + return false; +} + + bool vmIntrinsics::is_disabled_by_flags(const methodHandle& method) { vmIntrinsics::ID id = method->intrinsic_id(); assert(id != vmIntrinsics::_none, "must be a VM intrinsic"); + return is_disabled_by_flags(id); +} + +bool vmIntrinsics::is_disabled_by_flags(vmIntrinsics::ID id) { + assert(id != vmIntrinsics::_none, "must be a VM intrinsic"); // -XX:-InlineNatives disables nearly all intrinsics except the ones listed in // the following switch statement.