Path: blob/master/src/hotspot/share/prims/jvmtiEnter.xsl
41144 views
<?xml version="1.0"?>1<!--2Copyright (c) 2002, 2021, Oracle and/or its affiliates. All rights reserved.3DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.45This code is free software; you can redistribute it and/or modify it6under the terms of the GNU General Public License version 2 only, as7published by the Free Software Foundation.89This code is distributed in the hope that it will be useful, but WITHOUT10ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or11FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License12version 2 for more details (a copy is included in the LICENSE file that13accompanied this code).1415You should have received a copy of the GNU General Public License version162 along with this work; if not, write to the Free Software Foundation,17Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.1819Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA20or visit www.oracle.com if you need additional information or have any21questions.2223-->2425<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">2627<xsl:import href="jvmtiLib.xsl"/>2829<xsl:output method="text" indent="no" omit-xml-declaration="yes"/>3031<xsl:param name="trace"></xsl:param>32<xsl:param name="interface"></xsl:param>333435<xsl:template match="specification">36<xsl:call-template name="sourceHeader"/>37<xsl:text>38# include "precompiled.hpp"39# include "classfile/javaClasses.inline.hpp"40# include "classfile/vmClasses.hpp"41# include "memory/resourceArea.hpp"42# include "utilities/macros.hpp"43#if INCLUDE_JVMTI44# include "logging/log.hpp"45# include "oops/oop.inline.hpp"46# include "prims/jvmtiEnter.inline.hpp"47# include "prims/jvmtiRawMonitor.hpp"48# include "prims/jvmtiUtil.hpp"49# include "runtime/fieldDescriptor.inline.hpp"50# include "runtime/jniHandles.hpp"51# include "runtime/threadSMR.hpp"5253</xsl:text>5455<xsl:if test="$trace = 'Trace'">56<xsl:text>57#ifdef JVMTI_TRACE58</xsl:text>59</xsl:if>6061<xsl:if test="$trace != 'Trace'">62<xsl:text>6364// Error names65const char* JvmtiUtil::_error_names[] = {66</xsl:text>67<xsl:call-template name="fillEntityName">68<xsl:with-param name="entities" select="errorsection/errorcategory/errorid"/>69</xsl:call-template>70<xsl:text>71};727374// Event threaded75const bool JvmtiUtil::_event_threaded[] = {76</xsl:text>77<xsl:call-template name="fillEventThreaded">78<xsl:with-param name="entities" select="eventsection/event"/>79</xsl:call-template>80<xsl:text>81};8283</xsl:text>84<xsl:call-template name="eventCapabilitiesTest"/>85</xsl:if>8687<xsl:if test="$trace = 'Trace'">8889<!-- all this just to return the highest event number -->90<xsl:variable name="maxEvent">91<xsl:for-each select="eventsection/event">92<xsl:variable name="mynum" select="@num"/>93<xsl:if test="count(../../eventsection/event[@num > $mynum]) = 0">94<xsl:value-of select="@num"/>95</xsl:if>96</xsl:for-each>97</xsl:variable>9899<xsl:text>jbyte JvmtiTrace::_event_trace_flags[</xsl:text>100<xsl:value-of select="1+$maxEvent"/>101<xsl:text>];102103jint JvmtiTrace::_max_event_index = </xsl:text>104<xsl:value-of select="$maxEvent"/>105<xsl:text>;106107// Event names108const char* JvmtiTrace::_event_names[] = {109</xsl:text>110<xsl:call-template name="fillEntityName">111<xsl:with-param name="entities" select="eventsection/event"/>112</xsl:call-template>113<xsl:text>114};115</xsl:text>116<xsl:apply-templates select="//constants[@kind='enum']"/>117</xsl:if>118<xsl:apply-templates select="functionsection"/>119120<xsl:if test="$trace='Trace'">121<xsl:text>122#endif /*JVMTI_TRACE */123</xsl:text>124</xsl:if>125126</xsl:template>127128<xsl:template match="constants">129<xsl:text>130131// </xsl:text>132<xsl:value-of select="@label"/>133<xsl:text> names134const char* </xsl:text>135<xsl:value-of select="@id"/>136<xsl:text>ConstantNames[] = {137</xsl:text>138<xsl:apply-templates select="constant" mode="constname"/>139<xsl:text> NULL140};141142// </xsl:text>143<xsl:value-of select="@label"/>144<xsl:text> value145jint </xsl:text>146<xsl:value-of select="@id"/>147<xsl:text>ConstantValues[] = {148</xsl:text>149<xsl:apply-templates select="constant" mode="constvalue"/>150<xsl:text> 0151};152153</xsl:text>154</xsl:template>155156<xsl:template match="constant" mode="constname">157<xsl:text> "</xsl:text>158<xsl:value-of select="@id"/>159<xsl:text>",160</xsl:text>161</xsl:template>162163<xsl:template match="constant" mode="constvalue">164<xsl:text> </xsl:text>165<xsl:value-of select="@num"/>166<xsl:text>,167</xsl:text>168</xsl:template>169170<xsl:template name="eventCapabilitiesTest">171<xsl:text>172173// Check Event Capabilities174const bool JvmtiUtil::has_event_capability(jvmtiEvent event_type, const jvmtiCapabilities* capabilities_ptr) {175switch (event_type) {176</xsl:text>177<xsl:for-each select="//eventsection/event">178<xsl:variable name="capa" select="capabilities/required"/>179<xsl:if test="count($capa)">180<xsl:text> case </xsl:text>181<xsl:value-of select="@const"/>182<xsl:text>:183return capabilities_ptr-></xsl:text>184<xsl:value-of select="$capa/@id"/>185<xsl:text> != 0;186</xsl:text>187</xsl:if>188</xsl:for-each>189<xsl:text> default: break; }190// if it does not have a capability it is required191return JNI_TRUE;192}193194</xsl:text>195</xsl:template>196197<xsl:template match="functionsection">198<xsl:if test="$trace='Trace'">199200<!-- all this just to return the highest function number -->201<xsl:variable name="maxFunction">202<xsl:for-each select="category/function">203<xsl:variable name="mynum" select="@num"/>204<xsl:if test="count(../../category/function[@num > $mynum]) = 0">205<xsl:value-of select="@num"/>206</xsl:if>207</xsl:for-each>208</xsl:variable>209210<xsl:text>jbyte JvmtiTrace::_trace_flags[</xsl:text>211<xsl:value-of select="1+$maxFunction"/>212<xsl:text>];213214jint JvmtiTrace::_max_function_index = </xsl:text>215<xsl:value-of select="$maxFunction"/>216<xsl:text>;217218// Function names219const char* JvmtiTrace::_function_names[] = {220</xsl:text>221<xsl:call-template name="fillEntityName">222<xsl:with-param name="entities" select="category/function"/>223</xsl:call-template>224<xsl:text>225};226227// Exclude list228short JvmtiTrace::_exclude_functions[] = {229</xsl:text>230<xsl:apply-templates select="category/function" mode="notrace">231<xsl:sort select="@num"/>232</xsl:apply-templates>233<xsl:text>0234};235236</xsl:text>237</xsl:if>238239<xsl:text>240extern "C" {241242</xsl:text>243<xsl:apply-templates select="category" mode="wrapper"/>244<xsl:text>245} /* end extern "C" */246247// JVMTI API functions248struct jvmtiInterface_1_ jvmti</xsl:text>249<xsl:value-of select="$trace"/>250<xsl:text>_Interface = {251</xsl:text>252253<xsl:call-template name="fillFuncStruct">254<xsl:with-param name="funcs" select="category/function[count(@hide)=0]"/>255</xsl:call-template>256257<xsl:text>258};259#endif // INCLUDE_JVMTI260</xsl:text>261</xsl:template>262263<xsl:template match="function" mode="functionid">264<xsl:text>jvmti</xsl:text>265<xsl:value-of select="$trace"/>266<xsl:text>_</xsl:text>267<xsl:value-of select="@id"/>268</xsl:template>269270<xsl:template name="fillFuncStructDoit">271<xsl:param name="func"/>272<xsl:param name="index"/>273<xsl:text> /* </xsl:text>274<xsl:number value="$index" format=" 1"/>275<xsl:text> : </xsl:text>276<xsl:choose>277<xsl:when test="count($func)=1">278<xsl:value-of select="$func/synopsis"/>279<xsl:text> */280</xsl:text>281<xsl:apply-templates select="$func" mode="functionid"/>282</xsl:when>283<xsl:otherwise>284<xsl:text> RESERVED */285NULL</xsl:text>286</xsl:otherwise>287</xsl:choose>288</xsl:template>289290<!-- generic function iterator applied to the function structure -->291<xsl:template name="fillFuncStruct">292<xsl:param name="funcs"/>293<xsl:param name="index" select="1"/>294<xsl:call-template name="fillFuncStructDoit">295<xsl:with-param name="func" select="$funcs[@num=$index]"/>296<xsl:with-param name="index" select="$index"/>297</xsl:call-template>298<xsl:if test="count($funcs[@num > $index]) > 0">299<xsl:text>,300</xsl:text>301<xsl:call-template name="fillFuncStruct">302<xsl:with-param name="funcs" select="$funcs"/>303<xsl:with-param name="index" select="1+$index"/>304</xsl:call-template>305</xsl:if>306</xsl:template>307308<xsl:template name="fillEntityNameDoit">309<xsl:param name="entity"/>310<xsl:param name="index"/>311<xsl:choose>312<xsl:when test="count($entity) > 0">313<xsl:text> "</xsl:text>314<xsl:value-of select="$entity[position()=1]/@id"/>315<xsl:text>"</xsl:text>316</xsl:when>317<xsl:otherwise>318<xsl:text> NULL</xsl:text>319</xsl:otherwise>320</xsl:choose>321</xsl:template>322323<!-- generic entity (with id and num) iterator applied to entity names -->324<xsl:template name="fillEntityName">325<xsl:param name="entities"/>326<xsl:param name="index" select="0"/>327<xsl:call-template name="fillEntityNameDoit">328<xsl:with-param name="entity" select="$entities[@num=$index]"/>329<xsl:with-param name="index" select="$index"/>330</xsl:call-template>331<xsl:if test="count($entities[@num > $index]) > 0">332<xsl:text>,333</xsl:text>334<xsl:call-template name="fillEntityName">335<xsl:with-param name="entities" select="$entities"/>336<xsl:with-param name="index" select="1+$index"/>337</xsl:call-template>338</xsl:if>339</xsl:template>340341<xsl:template name="fillEventThreadedDoit">342<xsl:param name="entity"/>343<xsl:param name="index"/>344<xsl:choose>345<xsl:when test="count($entity) > 0">346<xsl:choose>347<xsl:when test="count($entity[position()=1]/@filtered)=0">348<xsl:text> false</xsl:text>349</xsl:when>350<xsl:otherwise>351<xsl:text> true</xsl:text>352</xsl:otherwise>353</xsl:choose>354</xsl:when>355<xsl:otherwise>356<xsl:text> false</xsl:text>357</xsl:otherwise>358</xsl:choose>359</xsl:template>360361362<xsl:template name="fillEventThreaded">363<xsl:param name="entities"/>364<xsl:param name="index" select="0"/>365<xsl:call-template name="fillEventThreadedDoit">366<xsl:with-param name="entity" select="$entities[@num=$index]"/>367<xsl:with-param name="index" select="$index"/>368</xsl:call-template>369<xsl:if test="count($entities[@num > $index]) > 0">370<xsl:text>,371</xsl:text>372<xsl:call-template name="fillEventThreaded">373<xsl:with-param name="entities" select="$entities"/>374<xsl:with-param name="index" select="1+$index"/>375</xsl:call-template>376</xsl:if>377</xsl:template>378379<xsl:template match="function" mode="notrace">380<xsl:if test="count(@impl)=1 and contains(@impl,'notrace')">381<xsl:value-of select="@num"/>382<xsl:text>,383</xsl:text>384</xsl:if>385</xsl:template>386387<xsl:template match="category" mode="wrapper">388<xsl:text>389//390// </xsl:text><xsl:value-of select="@label"/><xsl:text> functions391//392</xsl:text>393<xsl:apply-templates select="function[count(@hide)=0]"/>394</xsl:template>395396<xsl:template match="function" mode="transition">397<xsl:param name="space">398<xsl:text>399</xsl:text>400</xsl:param>401<xsl:value-of select="$space"/>402403<xsl:choose>404<xsl:when test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">405<xsl:text>if (this_thread == NULL || !this_thread->is_Java_thread()) {</xsl:text>406</xsl:when>407<xsl:otherwise>408<xsl:choose>409<xsl:when test="count(@phase)=0 or contains(@phase,'live') or contains(@phase,'start')">410<xsl:text>if (this_thread == NULL || (!this_thread->is_Java_thread() && !this_thread->is_Named_thread())) {</xsl:text>411</xsl:when>412<xsl:otherwise>413<xsl:text>if (!this_thread->is_Java_thread()) {</xsl:text>414</xsl:otherwise>415</xsl:choose>416</xsl:otherwise>417</xsl:choose>418419<xsl:if test="$trace='Trace'">420<xsl:value-of select="$space"/>421<xsl:text> if (trace_flags) {</xsl:text>422<xsl:value-of select="$space"/>423<xsl:text> log_trace(jvmti)("[non-attached thread] %s %s", func_name,</xsl:text>424<xsl:value-of select="$space"/>425<xsl:text> JvmtiUtil::error_name(JVMTI_ERROR_UNATTACHED_THREAD));</xsl:text>426<xsl:value-of select="$space"/>427<xsl:text> }</xsl:text>428</xsl:if>429<xsl:value-of select="$space"/>430<xsl:text> return JVMTI_ERROR_UNATTACHED_THREAD;</xsl:text>431<xsl:value-of select="$space"/>432<xsl:text>}</xsl:text>433<xsl:value-of select="$space"/>434<xsl:if test="count(@impl)=0 or not(contains(@impl,'innative'))">435<xsl:text>JavaThread* current_thread = this_thread->as_Java_thread();</xsl:text>436<xsl:value-of select="$space"/>437<xsl:text>MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, current_thread));</xsl:text>438<xsl:value-of select="$space"/>439<xsl:text>ThreadInVMfromNative __tiv(current_thread);</xsl:text>440<xsl:value-of select="$space"/>441<xsl:text>VM_ENTRY_BASE(jvmtiError, </xsl:text>442<xsl:apply-templates select="." mode="functionid"/>443<xsl:text> , current_thread)</xsl:text>444<xsl:value-of select="$space"/>445<xsl:text>debug_only(VMNativeEntryWrapper __vew;)</xsl:text>446<xsl:if test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">447<xsl:value-of select="$space"/>448<xsl:text>PreserveExceptionMark __em(this_thread);</xsl:text>449</xsl:if>450</xsl:if>451</xsl:template>452453454<xsl:template match="required">455<xsl:text>456if (jvmti_env->get_capabilities()-></xsl:text>457<xsl:value-of select="@id"/>458<xsl:text> == 0) {459</xsl:text>460<xsl:if test="$trace='Trace'">461<xsl:text> if (trace_flags) {462log_trace(jvmti)("[%s] %s %s", curr_thread_name, func_name,463JvmtiUtil::error_name(JVMTI_ERROR_MUST_POSSESS_CAPABILITY));464}465</xsl:text>466</xsl:if>467<xsl:text> return JVMTI_ERROR_MUST_POSSESS_CAPABILITY;468}469</xsl:text>470</xsl:template>471472473<xsl:template match="function">474<xsl:text>475static jvmtiError JNICALL476</xsl:text>477<xsl:apply-templates select="." mode="functionid"/>478<xsl:text>(jvmtiEnv* env</xsl:text>479<xsl:apply-templates select="parameters" mode="signature"/>480<xsl:text>) {481</xsl:text>482483<xsl:if test="not(contains(@jkernel,'yes'))">484<xsl:text>
#if !INCLUDE_JVMTI 
</xsl:text>485<xsl:text> return JVMTI_ERROR_NOT_AVAILABLE; 
</xsl:text>486<xsl:text>#else 
</xsl:text>487</xsl:if>488489<xsl:apply-templates select="." mode="traceSetUp"/>490<xsl:choose>491<xsl:when test="count(@phase)=0 or contains(@phase,'live')">492<xsl:text> if(!JvmtiEnv::is_vm_live()) {493</xsl:text>494<xsl:if test="$trace='Trace'">495<xsl:text> if (trace_flags) {496log_trace(jvmti)("[-] %s %s(%d)", func_name,497JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE), JvmtiEnv::get_phase());498}499</xsl:text>500</xsl:if>501<xsl:text> return JVMTI_ERROR_WRONG_PHASE;502}</xsl:text>503504<xsl:text>505Thread* this_thread = Thread::current_or_null(); </xsl:text>506507<xsl:apply-templates select="." mode="transition"/>508</xsl:when>509<xsl:otherwise>510<xsl:if test="contains(@phase,'onload')">511<xsl:text> if(JvmtiEnv::get_phase()!=JVMTI_PHASE_ONLOAD</xsl:text>512<xsl:if test="not(contains(@phase,'onloadOnly'))">513<xsl:text> && JvmtiEnv::get_phase()!=JVMTI_PHASE_LIVE</xsl:text>514</xsl:if>515<xsl:text>) {516</xsl:text>517<xsl:if test="$trace='Trace'">518<xsl:text> if (trace_flags) {519log_trace(jvmti)("[-] %s %s", func_name,520JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));521}522</xsl:text>523</xsl:if>524<xsl:text> return JVMTI_ERROR_WRONG_PHASE;525}</xsl:text>526</xsl:if>527<xsl:if test="contains(@phase,'start')">528<xsl:text> if(JvmtiEnv::get_phase(env)!=JVMTI_PHASE_START && JvmtiEnv::get_phase()!=JVMTI_PHASE_LIVE) {529</xsl:text>530<xsl:if test="$trace='Trace'">531<xsl:text> if (trace_flags) {532log_trace(jvmti)("[-] %s %s", func_name,533JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));534}535</xsl:text>536</xsl:if>537<xsl:text> return JVMTI_ERROR_WRONG_PHASE;538}539Thread* this_thread = Thread::current_or_null(); </xsl:text>540<xsl:apply-templates select="." mode="transition"/>541</xsl:if>542</xsl:otherwise>543</xsl:choose>544545<xsl:text>546JvmtiEnv* jvmti_env = JvmtiEnv::JvmtiEnv_from_jvmti_env(env);547if (!jvmti_env->is_valid()) {548</xsl:text>549<xsl:if test="$trace='Trace'">550<xsl:text> if (trace_flags) {551log_trace(jvmti)("[%s] %s %s env=" PTR_FORMAT, curr_thread_name, func_name,552JvmtiUtil::error_name(JVMTI_ERROR_INVALID_ENVIRONMENT), p2i(env));553}554</xsl:text>555</xsl:if>556<xsl:text> return JVMTI_ERROR_INVALID_ENVIRONMENT;557}558</xsl:text>559560<xsl:apply-templates select="capabilities/required"/>561562<xsl:text> jvmtiError err;563</xsl:text>564<xsl:choose>565<xsl:when test="count(@phase)=1 and not(contains(@phase,'live')) and not(contains(@phase,'start'))">566<xsl:choose>567<xsl:when test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">568<xsl:text> if (Threads::number_of_threads() != 0) {569Thread* this_thread = Thread::current_or_null();</xsl:text>570</xsl:when>571<xsl:otherwise>572573<xsl:text> Thread* this_thread = NULL;574bool transition;575if (Threads::number_of_threads() == 0) {576transition = false;577} else {578this_thread = Thread::current_or_null();579transition = ((this_thread != NULL) && !this_thread->is_Named_thread());580}581if (transition) {</xsl:text>582</xsl:otherwise>583584</xsl:choose>585<!-- we allow use in early phases but there are threads now, -->586<!-- so do thread transition -->587<xsl:apply-templates select="." mode="transition">588<xsl:with-param name="space">589<xsl:text>590</xsl:text>591</xsl:with-param>592</xsl:apply-templates>593<xsl:text>594</xsl:text>595<xsl:apply-templates select="." mode="doCall"/>596<xsl:text> } else {597</xsl:text>598<!-- we are pre-thread - no thread transition code -->599<xsl:apply-templates select="." mode="doCall"/>600<xsl:text> }601</xsl:text>602</xsl:when>603<xsl:otherwise>604<xsl:apply-templates select="." mode="doCall"/>605</xsl:otherwise>606</xsl:choose>607<xsl:text> return err;608</xsl:text>609610<xsl:if test="not(contains(@jkernel,'yes'))">611<xsl:text>#endif // INCLUDE_JVMTI
</xsl:text>612</xsl:if>613614<xsl:text>}
</xsl:text>615</xsl:template>616617<xsl:template match="function" mode="doCall">618<xsl:apply-templates select="parameters" mode="dochecks"/>619<xsl:apply-templates select="." mode="traceBefore"/>620<xsl:apply-templates select="." mode="genCall"/>621<xsl:apply-templates select="." mode="traceAfter"/>622</xsl:template>623624<xsl:template match="function" mode="genCall">625<xsl:text> err = jvmti_env-></xsl:text>626<xsl:value-of select="@id"/>627<xsl:text>(</xsl:text>628<xsl:apply-templates select="parameters" mode="HotSpotValue"/>629<xsl:text>);630</xsl:text>631</xsl:template>632633634<xsl:template match="function" mode="traceSetUp">635<xsl:if test="$trace='Trace'">636<xsl:text> SafeResourceMark rm;637jint trace_flags = JvmtiTrace::trace_flags(</xsl:text>638<xsl:value-of select="@num"/>639<xsl:text>);640const char *func_name = NULL;641const char *curr_thread_name = NULL;642if (trace_flags) {643func_name = JvmtiTrace::function_name(</xsl:text>644<xsl:value-of select="@num"/>645<xsl:text>);646curr_thread_name = JvmtiTrace::safe_get_current_thread_name();647}648</xsl:text>649</xsl:if>650</xsl:template>651652653<xsl:template match="function" mode="traceBefore">654<xsl:if test="$trace='Trace'">655<xsl:text>656if ((trace_flags & JvmtiTrace::SHOW_IN) != 0) {657</xsl:text>658<xsl:apply-templates select="." mode="traceIn"/>659<xsl:text> }660</xsl:text>661</xsl:if>662</xsl:template>663664665<xsl:template match="param" mode="traceError">666<xsl:param name="err"/>667<xsl:param name="comment"></xsl:param>668<xsl:param name="extraValue"></xsl:param>669<xsl:if test="$trace='Trace'">670<xsl:text> if ((trace_flags & JvmtiTrace::SHOW_ERROR) != 0) {671if ((trace_flags & JvmtiTrace::SHOW_IN) == 0) {672</xsl:text>673<xsl:apply-templates select="../.." mode="traceIn">674<xsl:with-param name="endParam" select="."/>675</xsl:apply-templates>676<xsl:text> }677log_error(jvmti)("[%s] %s } %s - erroneous arg is </xsl:text>678<xsl:value-of select="@id"/>679<xsl:value-of select="$comment"/>680<xsl:text>", curr_thread_name, func_name,681JvmtiUtil::error_name(</xsl:text>682<xsl:value-of select="$err"/>683<xsl:text>)</xsl:text>684<xsl:value-of select="$extraValue"/>685<xsl:text>);686}687</xsl:text>688</xsl:if>689<xsl:text> return </xsl:text>690<xsl:value-of select="$err"/>691<xsl:text>;</xsl:text>692</xsl:template>693694695<xsl:template match="function" mode="traceAfter">696<xsl:if test="$trace='Trace'">697<xsl:text> if ( err != JVMTI_ERROR_NONE && (trace_flags & JvmtiTrace::SHOW_ERROR) != 0) {698if ((trace_flags & JvmtiTrace::SHOW_IN) == 0) {699</xsl:text>700<xsl:apply-templates select="." mode="traceIn"/>701<xsl:text> }702log_error(jvmti)("[%s] %s } %s", curr_thread_name, func_name,703JvmtiUtil::error_name(err));704} else if ((trace_flags & JvmtiTrace::SHOW_OUT) != 0) {705log_trace(jvmti)("[%s] %s }", curr_thread_name, func_name);706}707</xsl:text>708</xsl:if>709</xsl:template>710711<xsl:template match="function" mode="traceIn">712<xsl:param name="endParam"></xsl:param>713<xsl:text> log_trace(jvmti)("[%s] %s { </xsl:text>714<xsl:apply-templates select="parameters" mode="traceInFormat">715<xsl:with-param name="endParam" select="$endParam"/>716</xsl:apply-templates>717<xsl:text>", curr_thread_name, func_name</xsl:text>718<xsl:apply-templates select="parameters" mode="traceInValue">719<xsl:with-param name="endParam" select="$endParam"/>720</xsl:apply-templates>721<xsl:text>);722</xsl:text>723</xsl:template>724725<xsl:template match="parameters" mode="dochecks">726<xsl:apply-templates select="param" mode="dochecks"/>727</xsl:template>728729<xsl:template match="param" mode="dochecks">730<xsl:apply-templates select="child::*[position()=1]" mode="dochecks">731<xsl:with-param name="name" select="@id"/>732</xsl:apply-templates>733</xsl:template>734735<xsl:template match="outptr|outbuf|allocfieldbuf|ptrtype|inptr|inbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="dochecks">736<xsl:param name="name"/>737<xsl:if test="count(nullok)=0">738<xsl:text> if (</xsl:text>739<xsl:value-of select="$name"/>740<xsl:text> == NULL) {741</xsl:text>742<xsl:apply-templates select=".." mode="traceError">743<xsl:with-param name="err">JVMTI_ERROR_NULL_POINTER</xsl:with-param>744</xsl:apply-templates>745<xsl:text>746}747</xsl:text>748</xsl:if>749</xsl:template>750751<xsl:template match="jrawMonitorID" mode="dochecks">752<xsl:param name="name"/>753<xsl:text> JvmtiRawMonitor *rmonitor = (JvmtiRawMonitor *)</xsl:text>754<xsl:value-of select="$name"/>755<xsl:text>;756if (rmonitor == NULL) {757</xsl:text>758<xsl:apply-templates select=".." mode="traceError">759<xsl:with-param name="err">JVMTI_ERROR_INVALID_MONITOR</xsl:with-param>760<xsl:with-param name="comment"> - raw monitor is NULL</xsl:with-param>761</xsl:apply-templates>762<xsl:text>763}764if (!rmonitor->is_valid()) {765</xsl:text>766<xsl:apply-templates select=".." mode="traceError">767<xsl:with-param name="err">JVMTI_ERROR_INVALID_MONITOR</xsl:with-param>768<xsl:with-param name="comment"> - not a raw monitor " PTR_FORMAT "</xsl:with-param>769<xsl:with-param name="extraValue">, p2i(rmonitor)</xsl:with-param>770</xsl:apply-templates>771<xsl:text>772}773</xsl:text>774</xsl:template>775776<xsl:template match="jthread" mode="dochecksbody">777<xsl:param name="name"/>778<xsl:text> err = JvmtiExport::cv_external_thread_to_JavaThread(tlh.list(), </xsl:text>779<xsl:value-of select="$name"/>780<xsl:text>, &java_thread, NULL);781if (err != JVMTI_ERROR_NONE) {782</xsl:text>783<xsl:apply-templates select=".." mode="traceError">784<xsl:with-param name="err">err</xsl:with-param>785<xsl:with-param name="comment"> - jthread did not convert to a JavaThread - jthread = " PTR_FORMAT "</xsl:with-param>786<xsl:with-param name="extraValue">, p2i(<xsl:value-of select="$name"/>)</xsl:with-param>787</xsl:apply-templates>788<xsl:text>789}790</xsl:text>791</xsl:template>792793<xsl:template match="jthread" mode="dochecks">794<xsl:param name="name"/>795<!-- If we convert and test threads -->796<xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">797<xsl:text> JavaThread* java_thread = NULL;798ThreadsListHandle tlh(this_thread);799</xsl:text>800<xsl:choose>801<xsl:when test="count(@null)=0">802<xsl:apply-templates select="." mode="dochecksbody">803<xsl:with-param name="name" select="$name"/>804</xsl:apply-templates>805</xsl:when>806<xsl:otherwise>807<xsl:text> if (</xsl:text>808<xsl:value-of select="$name"/>809<xsl:text> == NULL) {810java_thread = current_thread;811} else {812</xsl:text>813<xsl:apply-templates select="." mode="dochecksbody">814<xsl:with-param name="name" select="$name"/>815</xsl:apply-templates>816<xsl:text> }817</xsl:text>818</xsl:otherwise>819</xsl:choose>820</xsl:if>821</xsl:template>822823<xsl:template match="jframeID" mode="dochecks">824<xsl:param name="name"/>825<xsl:text>826if (depth < 0) {827</xsl:text>828<xsl:apply-templates select=".." mode="traceError">829<xsl:with-param name="err">JVMTI_ERROR_ILLEGAL_ARGUMENT</xsl:with-param>830<xsl:with-param name="comment"> - negative depth - jthread = " INT32_FORMAT "</xsl:with-param>831<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>832</xsl:apply-templates>833<xsl:text>834}835</xsl:text>836</xsl:template>837838<xsl:template match="jclass" mode="dochecks">839<xsl:param name="name"/>840<!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->841<xsl:if test="count(@method)=0">842<xsl:text> oop k_mirror = JNIHandles::resolve_external_guard(</xsl:text>843<xsl:value-of select="$name"/>844<xsl:text>);845if (k_mirror == NULL) {846</xsl:text>847<xsl:apply-templates select=".." mode="traceError">848<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>849<xsl:with-param name="comment"> - resolved to NULL - jclass = " PTR_FORMAT "</xsl:with-param>850<xsl:with-param name="extraValue">, p2i(<xsl:value-of select="$name"/>)</xsl:with-param>851</xsl:apply-templates>852<xsl:text>853}854if (!k_mirror->is_a(vmClasses::Class_klass())) {855</xsl:text>856<xsl:apply-templates select=".." mode="traceError">857<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>858<xsl:with-param name="comment"> - not a class - jclass = " PTR_FORMAT "</xsl:with-param>859<xsl:with-param name="extraValue">, p2i(<xsl:value-of select="$name"/>)</xsl:with-param>860</xsl:apply-templates>861<xsl:text>862}863</xsl:text>864<xsl:if test="count(@method|@field)=1">865<xsl:text>866if (java_lang_Class::is_primitive(k_mirror)) {867</xsl:text>868<xsl:apply-templates select=".." mode="traceError">869<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>870<xsl:with-param name="comment"> - is a primitive class - jclass = " PTR_FORMAT "</xsl:with-param>871<xsl:with-param name="extraValue">, p2i(<xsl:value-of select="$name"/>)</xsl:with-param>872</xsl:apply-templates>873<xsl:text>874}875Klass* k_oop = java_lang_Class::as_Klass(k_mirror);876if (k_oop == NULL) {877</xsl:text>878<xsl:apply-templates select=".." mode="traceError">879<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>880<xsl:with-param name="comment"> - no Klass* - jclass = " PTR_FORMAT "</xsl:with-param>881<xsl:with-param name="extraValue">, p2i(<xsl:value-of select="$name"/>)</xsl:with-param>882</xsl:apply-templates>883<xsl:text>884}885</xsl:text>886</xsl:if>887</xsl:if>888</xsl:template>889890891<xsl:template match="jmethodID" mode="dochecks">892<xsl:param name="name"/>893<xsl:text> Method* checked_method = Method::checked_resolve_jmethod_id(</xsl:text>894<xsl:value-of select="$name"/>895<xsl:text>);
</xsl:text>896<xsl:text> if (checked_method == NULL) {
</xsl:text>897<xsl:apply-templates select=".." mode="traceError">898<xsl:with-param name="err">JVMTI_ERROR_INVALID_METHODID</xsl:with-param>899<xsl:with-param name="comment"></xsl:with-param>900<xsl:with-param name="extraValue"></xsl:with-param>901</xsl:apply-templates>902<xsl:text>
</xsl:text>903<xsl:text> }
</xsl:text>904<xsl:if test="count(@native)=1 and contains(@native,'error')">905<xsl:text> if (checked_method->is_native()) {
</xsl:text>906<xsl:text> return JVMTI_ERROR_NATIVE_METHOD;
</xsl:text>907<xsl:text> }
</xsl:text>908</xsl:if>909</xsl:template>910911912<xsl:template match="jfieldID" mode="dochecks">913<xsl:param name="name"/>914<xsl:text> ResourceMark rm_fdesc(current_thread);
</xsl:text>915<xsl:text> fieldDescriptor fdesc;
</xsl:text>916<xsl:text> if (!JvmtiEnv::get_field_descriptor(k_oop, </xsl:text>917<xsl:value-of select="$name"/>918<xsl:text>, &fdesc)) {
</xsl:text>919<xsl:apply-templates select=".." mode="traceError">920<xsl:with-param name="err">JVMTI_ERROR_INVALID_FIELDID</xsl:with-param>921</xsl:apply-templates>922<xsl:text>
</xsl:text>923<xsl:text> }
</xsl:text>924</xsl:template>925926927<xsl:template match="jint" mode="dochecks">928<xsl:param name="name"/>929<xsl:if test="count(@min)=1">930<xsl:text> if (</xsl:text>931<xsl:value-of select="$name"/>932<xsl:text> < </xsl:text>933<xsl:value-of select="@min"/>934<xsl:text>) {935</xsl:text>936<xsl:apply-templates select=".." mode="traceError">937<xsl:with-param name="err">JVMTI_ERROR_ILLEGAL_ARGUMENT</xsl:with-param>938</xsl:apply-templates>939<xsl:text>940}941</xsl:text>942</xsl:if>943</xsl:template>944945<xsl:template match="jobject|jvalue|jthreadGroup|enum|jchar|jlong|jfloat|jdouble|jlocation|jboolean|char|uchar|size_t|void|struct" mode="dochecks">946</xsl:template>947948<!-- iterate over parameters, stopping if specified is encountered -->949<xsl:template name="traceInValueParamsUpTo">950<xsl:param name="params"/>951<xsl:param name="endParam"></xsl:param>952<xsl:param name="index" select="1"/>953<xsl:variable name="cParam" select="$params[position()=$index]"/>954<xsl:if test="$cParam!=$endParam">955<xsl:apply-templates select="$cParam" mode="traceInValue"/>956<xsl:if test="count($params) > $index">957<xsl:call-template name="traceInValueParamsUpTo">958<xsl:with-param name="params" select="$params"/>959<xsl:with-param name="endParam" select="$endParam"/>960<xsl:with-param name="index" select="1+$index"/>961</xsl:call-template>962</xsl:if>963</xsl:if>964</xsl:template>965966<xsl:template name="traceInFormatParamsUpTo">967<xsl:param name="params"/>968<xsl:param name="endParam"></xsl:param>969<xsl:param name="index" select="1"/>970<xsl:variable name="cParam" select="$params[position()=$index]"/>971<xsl:if test="$cParam!=$endParam">972<xsl:apply-templates select="$cParam" mode="traceInFormat"/>973<xsl:if test="count($params) > $index">974<xsl:call-template name="traceInFormatParamsUpTo">975<xsl:with-param name="params" select="$params"/>976<xsl:with-param name="endParam" select="$endParam"/>977<xsl:with-param name="index" select="1+$index"/>978</xsl:call-template>979</xsl:if>980</xsl:if>981</xsl:template>982983<xsl:template match="parameters" mode="traceInFormat">984<xsl:param name="endParam"></xsl:param>985<xsl:call-template name="traceInFormatParamsUpTo">986<xsl:with-param name="params" select="param"/>987<xsl:with-param name="endParam" select="$endParam"/>988</xsl:call-template>989</xsl:template>990991<xsl:template match="parameters" mode="traceInValue">992<xsl:param name="endParam"></xsl:param>993<xsl:call-template name="traceInValueParamsUpTo">994<xsl:with-param name="params" select="param"/>995<xsl:with-param name="endParam" select="$endParam"/>996</xsl:call-template>997</xsl:template>998999<xsl:template match="param" mode="traceInFormat">1000<xsl:apply-templates select="child::*[position()=1]" mode="traceInFormat">1001<xsl:with-param name="name" select="@id"/>1002</xsl:apply-templates>1003</xsl:template>10041005<xsl:template match="param" mode="traceInValue">1006<xsl:apply-templates select="child::*[position()=1]" mode="traceInValue">1007<xsl:with-param name="name" select="@id"/>1008</xsl:apply-templates>1009</xsl:template>10101011<xsl:template match="outptr|outbuf|allocfieldbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="traceInFormat">1012</xsl:template>10131014<xsl:template match="outptr|outbuf|allocfieldbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="traceInValue">1015</xsl:template>10161017<xsl:template match="inbuf" mode="traceInFormat">1018<xsl:param name="name"/>1019<xsl:text> </xsl:text>1020<xsl:value-of select="$name"/>1021<xsl:variable name="child" select="child::*[position()=1]"/>1022<xsl:choose>g1023<xsl:when test="name($child)='char'">1024<xsl:text>='%s'</xsl:text>1025</xsl:when>1026<xsl:otherwise>1027<xsl:text>=" PTR_FORMAT "</xsl:text>1028</xsl:otherwise>1029</xsl:choose>1030</xsl:template>10311032<xsl:template match="inbuf" mode="traceInValue">1033<xsl:param name="name"/>1034<xsl:text>, </xsl:text>1035<xsl:variable name="child" select="child::*[position()=1]"/>1036<xsl:choose>1037<xsl:when test="name($child)='char'">1038<xsl:value-of select="$name"/>1039</xsl:when>1040<xsl:otherwise>1041p2i(<xsl:value-of select="$name"/>)1042</xsl:otherwise>1043</xsl:choose>1044</xsl:template>10451046<xsl:template match="ptrtype" mode="traceInFormat">1047<xsl:param name="name"/>1048<xsl:variable name="child" select="child::*[position()=1]"/>1049<xsl:choose>1050<xsl:when test="name($child)='jclass'">1051<xsl:text> </xsl:text>1052<xsl:value-of select="$name"/>1053<xsl:text>=" PTR_FORMAT "</xsl:text>1054</xsl:when>1055<xsl:otherwise>1056<xsl:apply-templates select="$child" mode="traceInFormat"/>1057</xsl:otherwise>1058</xsl:choose>1059</xsl:template>10601061<xsl:template match="ptrtype" mode="traceInValue">1062<xsl:param name="name"/>1063<xsl:variable name="child" select="child::*[position()=1]"/>1064<xsl:choose>1065<xsl:when test="name($child)='jclass'">1066<xsl:text>, </xsl:text>1067p2i(<xsl:value-of select="$name"/>)1068</xsl:when>1069<xsl:otherwise>1070<xsl:apply-templates select="$child" mode="traceInValue"/>1071</xsl:otherwise>1072</xsl:choose>1073</xsl:template>10741075<xsl:template match="inptr" mode="traceInFormat">1076<xsl:param name="name"/>1077<xsl:text> </xsl:text>1078<xsl:value-of select="$name"/>1079<xsl:text>=" PTR_FORMAT "</xsl:text>1080</xsl:template>10811082<xsl:template match="inptr" mode="traceInValue">1083<xsl:param name="name"/>1084<xsl:text>, </xsl:text>1085p2i(<xsl:value-of select="$name"/>)1086</xsl:template>10871088<xsl:template match="jrawMonitorID|jfieldID" mode="traceInFormat">1089<xsl:param name="name"/>1090<xsl:text> </xsl:text>1091<xsl:value-of select="$name"/>1092<xsl:text>=%s</xsl:text>1093</xsl:template>10941095<xsl:template match="jclass" mode="traceInFormat">1096<xsl:param name="name"/>1097<!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->1098<xsl:if test="count(@method)=0">1099<xsl:text> </xsl:text>1100<xsl:value-of select="$name"/>1101<xsl:text>=%s</xsl:text>1102</xsl:if>1103</xsl:template>11041105<xsl:template match="jrawMonitorID" mode="traceInValue">1106<xsl:param name="name"/>1107<xsl:text>, rmonitor->get_name()</xsl:text>1108</xsl:template>11091110<xsl:template match="jthread" mode="traceInFormat">1111<xsl:param name="name"/>1112<!-- If we convert and test threads -->1113<xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">1114<xsl:text> </xsl:text>1115<xsl:value-of select="$name"/>1116<xsl:text>=%s</xsl:text>1117</xsl:if>1118</xsl:template>11191120<xsl:template match="jthread" mode="traceInValue">1121<xsl:param name="name"/>1122<!-- If we convert and test threads -->1123<xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">1124<xsl:text>,1125JvmtiTrace::safe_get_thread_name(java_thread)</xsl:text>1126</xsl:if>1127</xsl:template>11281129<xsl:template match="jframeID" mode="traceInFormat">1130<xsl:param name="name"/>1131<xsl:text>depth=%d</xsl:text>1132</xsl:template>11331134<xsl:template match="jframeID" mode="traceInValue">1135<xsl:param name="name"/>1136<xsl:text>, </xsl:text>1137<xsl:value-of select="$name"/>1138</xsl:template>11391140<xsl:template match="jclass" mode="traceInValue">1141<!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->1142<xsl:if test="count(@method)=0">1143<xsl:text>,1144JvmtiTrace::get_class_name(k_mirror)</xsl:text>1145</xsl:if>1146</xsl:template>11471148<xsl:template match="jmethodID" mode="traceInFormat">1149<xsl:param name="name"/>1150<xsl:text> </xsl:text>1151<xsl:value-of select="$name"/>1152<xsl:text>=%s.%s</xsl:text>1153</xsl:template>11541155<xsl:template match="jmethodID" mode="traceInValue">1156<xsl:param name="name"/>1157<xsl:text>,1158checked_method == NULL? "NULL" : checked_method->klass_name()->as_C_string(),1159checked_method == NULL? "NULL" : checked_method->name()->as_C_string()1160</xsl:text>1161</xsl:template>11621163<xsl:template match="jfieldID" mode="traceInValue">1164<xsl:param name="name"/>1165<xsl:text>, fdesc.name()->as_C_string()</xsl:text>1166</xsl:template>11671168<xsl:template match="enum" mode="traceInFormat">1169<xsl:param name="name"/>1170<xsl:text> </xsl:text>1171<xsl:value-of select="$name"/>1172<xsl:text>=%d:%s</xsl:text>1173</xsl:template>11741175<xsl:template match="enum" mode="traceInValue">1176<xsl:param name="name"/>1177<xsl:text>, </xsl:text>1178<xsl:value-of select="$name"/>1179<xsl:text>,1180</xsl:text>1181<xsl:choose>1182<xsl:when test=".='jvmtiError'">1183<xsl:text>JvmtiUtil::error_name(</xsl:text>1184<xsl:value-of select="$name"/>1185<xsl:text>)1186</xsl:text>1187</xsl:when>1188<xsl:otherwise>1189<xsl:choose>1190<xsl:when test=".='jvmtiEvent'">1191<xsl:text>JvmtiTrace::event_name(</xsl:text>1192<xsl:value-of select="$name"/>1193<xsl:text>)1194</xsl:text>1195</xsl:when>1196<xsl:otherwise>1197<xsl:text>JvmtiTrace::enum_name(</xsl:text>1198<xsl:value-of select="."/>1199<xsl:text>ConstantNames, </xsl:text>1200<xsl:value-of select="."/>1201<xsl:text>ConstantValues, </xsl:text>1202<xsl:value-of select="$name"/>1203<xsl:text>)</xsl:text>1204</xsl:otherwise>1205</xsl:choose>1206</xsl:otherwise>1207</xsl:choose>1208</xsl:template>12091210<xsl:template match="jint" mode="traceInFormat">1211<xsl:param name="name"/>1212<xsl:text> </xsl:text>1213<xsl:value-of select="$name"/>1214<xsl:text>=" INT32_FORMAT "</xsl:text>1215</xsl:template>12161217<xsl:template match="jlocation" mode="traceInFormat">1218<xsl:param name="name"/>1219<xsl:text> </xsl:text>1220<xsl:value-of select="$name"/>1221<xsl:text>=" JLONG_FORMAT "</xsl:text>1222</xsl:template>12231224<xsl:template match="jlong" mode="traceInFormat">1225<xsl:param name="name"/>1226<xsl:text> </xsl:text>1227<xsl:value-of select="$name"/>1228<xsl:text>=" JLONG_FORMAT "</xsl:text>1229</xsl:template>12301231<xsl:template match="size_t" mode="traceInFormat">1232<xsl:param name="name"/>1233<xsl:text> </xsl:text>1234<xsl:value-of select="$name"/>1235<xsl:text>=" SIZE_FORMAT_HEX "</xsl:text>1236</xsl:template>12371238<xsl:template match="jfloat|jdouble" mode="traceInFormat">1239<xsl:param name="name"/>1240<xsl:text> </xsl:text>1241<xsl:value-of select="$name"/>1242<xsl:text>=%f</xsl:text>1243</xsl:template>12441245<xsl:template match="char" mode="traceInFormat">1246<xsl:param name="name"/>1247<xsl:text> </xsl:text>1248<xsl:value-of select="$name"/>1249<xsl:text>=%c</xsl:text>1250</xsl:template>12511252<xsl:template match="uchar|jchar" mode="traceInFormat">1253<xsl:param name="name"/>1254<xsl:text> </xsl:text>1255<xsl:value-of select="$name"/>1256<xsl:text>=0x%x</xsl:text>1257</xsl:template>12581259<xsl:template match="jint|jlocation|jchar|jlong|jfloat|jdouble|char|uchar|size_t" mode="traceInValue">1260<xsl:param name="name"/>1261<xsl:text>, </xsl:text>1262<xsl:value-of select="$name"/>1263</xsl:template>126412651266<xsl:template match="jboolean" mode="traceInFormat">1267<xsl:param name="name"/>1268<xsl:text> </xsl:text>1269<xsl:value-of select="$name"/>1270<xsl:text>=%s</xsl:text>1271</xsl:template>12721273<xsl:template match="jboolean" mode="traceInValue">1274<xsl:param name="name"/>1275<xsl:text>, </xsl:text>1276<xsl:value-of select="$name"/>1277<xsl:text>? "true" : "false"</xsl:text>1278</xsl:template>12791280<xsl:template match="jobject|jvalue|jthreadGroup|void|struct" mode="traceInFormat">1281</xsl:template>12821283<xsl:template match="jobject|jvalue|jthreadGroup|void|struct" mode="traceInValue">1284</xsl:template>1285128612871288</xsl:stylesheet>128912901291