Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/prims/jvmtiEnter.xsl
32285 views
<?xml version="1.0"?>1<!--2Copyright (c) 2002, 2014, 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 "utilities/macros.hpp"40#if INCLUDE_JVMTI41# include "prims/jvmtiEnter.hpp"42# include "prims/jvmtiRawMonitor.hpp"43# include "prims/jvmtiUtil.hpp"4445// There are known-bad format/arg pairings in the code generated by this file.46PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC4748</xsl:text>4950<xsl:if test="$trace = 'Trace'">51<xsl:text>52#ifdef JVMTI_TRACE53</xsl:text>54</xsl:if>5556<xsl:if test="$trace != 'Trace'">57<xsl:text>5859// Error names60const char* JvmtiUtil::_error_names[] = {61</xsl:text>62<xsl:call-template name="fillEntityName">63<xsl:with-param name="entities" select="errorsection/errorcategory/errorid"/>64</xsl:call-template>65<xsl:text>66};676869// Event threaded70const bool JvmtiUtil::_event_threaded[] = {71</xsl:text>72<xsl:call-template name="fillEventThreaded">73<xsl:with-param name="entities" select="eventsection/event"/>74</xsl:call-template>75<xsl:text>76};7778</xsl:text>79<xsl:call-template name="eventCapabilitiesTest"/>80</xsl:if>8182<xsl:if test="$trace = 'Trace'">8384<!-- all this just to return the highest event number -->85<xsl:variable name="maxEvent">86<xsl:for-each select="eventsection/event">87<xsl:variable name="mynum" select="@num"/>88<xsl:if test="count(../../eventsection/event[@num > $mynum]) = 0">89<xsl:value-of select="@num"/>90</xsl:if>91</xsl:for-each>92</xsl:variable>9394<xsl:text>jbyte JvmtiTrace::_event_trace_flags[</xsl:text>95<xsl:value-of select="1+$maxEvent"/>96<xsl:text>];9798jint JvmtiTrace::_max_event_index = </xsl:text>99<xsl:value-of select="$maxEvent"/>100<xsl:text>;101102// Event names103const char* JvmtiTrace::_event_names[] = {104</xsl:text>105<xsl:call-template name="fillEntityName">106<xsl:with-param name="entities" select="eventsection/event"/>107</xsl:call-template>108<xsl:text>109};110</xsl:text>111<xsl:apply-templates select="//constants[@kind='enum']"/>112</xsl:if>113<xsl:apply-templates select="functionsection"/>114115<xsl:if test="$trace='Trace'">116<xsl:text>117#endif /*JVMTI_TRACE */118</xsl:text>119</xsl:if>120121</xsl:template>122123<xsl:template match="constants">124<xsl:text>125126// </xsl:text>127<xsl:value-of select="@label"/>128<xsl:text> names129const char* </xsl:text>130<xsl:value-of select="@id"/>131<xsl:text>ConstantNames[] = {132</xsl:text>133<xsl:apply-templates select="constant" mode="constname"/>134<xsl:text> NULL135};136137// </xsl:text>138<xsl:value-of select="@label"/>139<xsl:text> value140jint </xsl:text>141<xsl:value-of select="@id"/>142<xsl:text>ConstantValues[] = {143</xsl:text>144<xsl:apply-templates select="constant" mode="constvalue"/>145<xsl:text> 0146};147148</xsl:text>149</xsl:template>150151<xsl:template match="constant" mode="constname">152<xsl:text> "</xsl:text>153<xsl:value-of select="@id"/>154<xsl:text>",155</xsl:text>156</xsl:template>157158<xsl:template match="constant" mode="constvalue">159<xsl:text> </xsl:text>160<xsl:value-of select="@num"/>161<xsl:text>,162</xsl:text>163</xsl:template>164165<xsl:template name="eventCapabilitiesTest">166<xsl:text>167168// Check Event Capabilities169const bool JvmtiUtil::has_event_capability(jvmtiEvent event_type, const jvmtiCapabilities* capabilities_ptr) {170switch (event_type) {171</xsl:text>172<xsl:for-each select="//eventsection/event">173<xsl:variable name="capa" select="capabilities/required"/>174<xsl:if test="count($capa)">175<xsl:text> case </xsl:text>176<xsl:value-of select="@const"/>177<xsl:text>:178return capabilities_ptr-></xsl:text>179<xsl:value-of select="$capa/@id"/>180<xsl:text> != 0;181</xsl:text>182</xsl:if>183</xsl:for-each>184<xsl:text> }185// if it does not have a capability it is required186return JNI_TRUE;187}188189</xsl:text>190</xsl:template>191192<xsl:template match="functionsection">193<xsl:if test="$trace='Trace'">194195<!-- all this just to return the highest function number -->196<xsl:variable name="maxFunction">197<xsl:for-each select="category/function">198<xsl:variable name="mynum" select="@num"/>199<xsl:if test="count(../../category/function[@num > $mynum]) = 0">200<xsl:value-of select="@num"/>201</xsl:if>202</xsl:for-each>203</xsl:variable>204205<xsl:text>jbyte JvmtiTrace::_trace_flags[</xsl:text>206<xsl:value-of select="1+$maxFunction"/>207<xsl:text>];208209jint JvmtiTrace::_max_function_index = </xsl:text>210<xsl:value-of select="$maxFunction"/>211<xsl:text>;212213// Function names214const char* JvmtiTrace::_function_names[] = {215</xsl:text>216<xsl:call-template name="fillEntityName">217<xsl:with-param name="entities" select="category/function"/>218</xsl:call-template>219<xsl:text>220};221222// Exclude list223short JvmtiTrace::_exclude_functions[] = {224</xsl:text>225<xsl:apply-templates select="category/function" mode="notrace">226<xsl:sort select="@num"/>227</xsl:apply-templates>228<xsl:text>0229};230231</xsl:text>232</xsl:if>233234<xsl:text>235extern "C" {236237</xsl:text>238<xsl:apply-templates select="category" mode="wrapper"/>239<xsl:text>240} /* end extern "C" */241242// JVMTI API functions243struct jvmtiInterface_1_ jvmti</xsl:text>244<xsl:value-of select="$trace"/>245<xsl:text>_Interface = {246</xsl:text>247248<xsl:call-template name="fillFuncStruct">249<xsl:with-param name="funcs" select="category/function[count(@hide)=0]"/>250</xsl:call-template>251252<xsl:text>253};254#endif // INCLUDE_JVMTI255</xsl:text>256</xsl:template>257258<xsl:template match="function" mode="functionid">259<xsl:text>jvmti</xsl:text>260<xsl:value-of select="$trace"/>261<xsl:text>_</xsl:text>262<xsl:value-of select="@id"/>263</xsl:template>264265<xsl:template name="fillFuncStructDoit">266<xsl:param name="func"/>267<xsl:param name="index"/>268<xsl:text> /* </xsl:text>269<xsl:number value="$index" format=" 1"/>270<xsl:text> : </xsl:text>271<xsl:choose>272<xsl:when test="count($func)=1">273<xsl:value-of select="$func/synopsis"/>274<xsl:text> */275</xsl:text>276<xsl:apply-templates select="$func" mode="functionid"/>277</xsl:when>278<xsl:otherwise>279<xsl:text> RESERVED */280NULL</xsl:text>281</xsl:otherwise>282</xsl:choose>283</xsl:template>284285<!-- generic function iterator applied to the function structure -->286<xsl:template name="fillFuncStruct">287<xsl:param name="funcs"/>288<xsl:param name="index" select="1"/>289<xsl:call-template name="fillFuncStructDoit">290<xsl:with-param name="func" select="$funcs[@num=$index]"/>291<xsl:with-param name="index" select="$index"/>292</xsl:call-template>293<xsl:if test="count($funcs[@num > $index]) > 0">294<xsl:text>,295</xsl:text>296<xsl:call-template name="fillFuncStruct">297<xsl:with-param name="funcs" select="$funcs"/>298<xsl:with-param name="index" select="1+$index"/>299</xsl:call-template>300</xsl:if>301</xsl:template>302303<xsl:template name="fillEntityNameDoit">304<xsl:param name="entity"/>305<xsl:param name="index"/>306<xsl:choose>307<xsl:when test="count($entity) > 0">308<xsl:text> "</xsl:text>309<xsl:value-of select="$entity[position()=1]/@id"/>310<xsl:text>"</xsl:text>311</xsl:when>312<xsl:otherwise>313<xsl:text> NULL</xsl:text>314</xsl:otherwise>315</xsl:choose>316</xsl:template>317318<!-- generic entity (with id and num) iterator applied to entity names -->319<xsl:template name="fillEntityName">320<xsl:param name="entities"/>321<xsl:param name="index" select="0"/>322<xsl:call-template name="fillEntityNameDoit">323<xsl:with-param name="entity" select="$entities[@num=$index]"/>324<xsl:with-param name="index" select="$index"/>325</xsl:call-template>326<xsl:if test="count($entities[@num > $index]) > 0">327<xsl:text>,328</xsl:text>329<xsl:call-template name="fillEntityName">330<xsl:with-param name="entities" select="$entities"/>331<xsl:with-param name="index" select="1+$index"/>332</xsl:call-template>333</xsl:if>334</xsl:template>335336<xsl:template name="fillEventThreadedDoit">337<xsl:param name="entity"/>338<xsl:param name="index"/>339<xsl:choose>340<xsl:when test="count($entity) > 0">341<xsl:choose>342<xsl:when test="count($entity[position()=1]/@filtered)=0">343<xsl:text> false</xsl:text>344</xsl:when>345<xsl:otherwise>346<xsl:text> true</xsl:text>347</xsl:otherwise>348</xsl:choose>349</xsl:when>350<xsl:otherwise>351<xsl:text> false</xsl:text>352</xsl:otherwise>353</xsl:choose>354</xsl:template>355356357<xsl:template name="fillEventThreaded">358<xsl:param name="entities"/>359<xsl:param name="index" select="0"/>360<xsl:call-template name="fillEventThreadedDoit">361<xsl:with-param name="entity" select="$entities[@num=$index]"/>362<xsl:with-param name="index" select="$index"/>363</xsl:call-template>364<xsl:if test="count($entities[@num > $index]) > 0">365<xsl:text>,366</xsl:text>367<xsl:call-template name="fillEventThreaded">368<xsl:with-param name="entities" select="$entities"/>369<xsl:with-param name="index" select="1+$index"/>370</xsl:call-template>371</xsl:if>372</xsl:template>373374<xsl:template match="function" mode="notrace">375<xsl:if test="count(@impl)=1 and contains(@impl,'notrace')">376<xsl:value-of select="@num"/>377<xsl:text>,378</xsl:text>379</xsl:if>380</xsl:template>381382<xsl:template match="category" mode="wrapper">383<xsl:text>384//385// </xsl:text><xsl:value-of select="@label"/><xsl:text> functions386//387</xsl:text>388<xsl:apply-templates select="function[count(@hide)=0]"/>389</xsl:template>390391<xsl:template match="function" mode="transition">392<xsl:param name="space">393<xsl:text>394</xsl:text>395</xsl:param>396<xsl:value-of select="$space"/>397398<xsl:choose>399<xsl:when test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">400<xsl:text>if (this_thread == NULL || !this_thread->is_Java_thread()) {</xsl:text>401</xsl:when>402<xsl:otherwise>403<xsl:choose>404<xsl:when test="count(@phase)=0 or contains(@phase,'live') or contains(@phase,'start')">405<xsl:text>if (this_thread == NULL || (!this_thread->is_Java_thread() && !this_thread->is_VM_thread())) {</xsl:text>406</xsl:when>407<xsl:otherwise>408<xsl:text>if (!this_thread->is_Java_thread()) {</xsl:text>409</xsl:otherwise>410</xsl:choose>411</xsl:otherwise>412</xsl:choose>413414<xsl:if test="$trace='Trace'">415<xsl:value-of select="$space"/>416<xsl:text> if (trace_flags) {</xsl:text>417<xsl:value-of select="$space"/>418<xsl:text> tty->print_cr("JVMTI [non-attached thread] %s %s", func_name,</xsl:text>419<xsl:value-of select="$space"/>420<xsl:text> JvmtiUtil::error_name(JVMTI_ERROR_UNATTACHED_THREAD));</xsl:text>421<xsl:value-of select="$space"/>422<xsl:text> }</xsl:text>423</xsl:if>424<xsl:value-of select="$space"/>425<xsl:text> return JVMTI_ERROR_UNATTACHED_THREAD;</xsl:text>426<xsl:value-of select="$space"/>427<xsl:text>}</xsl:text>428<xsl:value-of select="$space"/>429<xsl:if test="count(@impl)=0 or not(contains(@impl,'innative'))">430<xsl:text>JavaThread* current_thread = (JavaThread*)this_thread;</xsl:text>431<xsl:value-of select="$space"/>432<xsl:text>MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, current_thread));</xsl:text>433<xsl:value-of select="$space"/>434<xsl:text>ThreadInVMfromNative __tiv(current_thread);</xsl:text>435<xsl:value-of select="$space"/>436<xsl:text>VM_ENTRY_BASE(jvmtiError, </xsl:text>437<xsl:apply-templates select="." mode="functionid"/>438<xsl:text> , current_thread)</xsl:text>439<xsl:value-of select="$space"/>440<xsl:text>debug_only(VMNativeEntryWrapper __vew;)</xsl:text>441<xsl:if test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">442<xsl:value-of select="$space"/>443<xsl:text>CautiouslyPreserveExceptionMark __em(this_thread);</xsl:text>444</xsl:if>445</xsl:if>446</xsl:template>447448449<xsl:template match="required">450<xsl:text>451if (jvmti_env->get_capabilities()-></xsl:text>452<xsl:value-of select="@id"/>453<xsl:text> == 0) {454</xsl:text>455<xsl:if test="$trace='Trace'">456<xsl:text> if (trace_flags) {457tty->print_cr("JVMTI [%s] %s %s", curr_thread_name, func_name,458JvmtiUtil::error_name(JVMTI_ERROR_MUST_POSSESS_CAPABILITY));459}460</xsl:text>461</xsl:if>462<xsl:text> return JVMTI_ERROR_MUST_POSSESS_CAPABILITY;463}464</xsl:text>465</xsl:template>466467468<xsl:template match="function">469<xsl:text>470static jvmtiError JNICALL471</xsl:text>472<xsl:apply-templates select="." mode="functionid"/>473<xsl:text>(jvmtiEnv* env</xsl:text>474<xsl:apply-templates select="parameters" mode="signature"/>475<xsl:text>) {476</xsl:text>477478<xsl:if test="not(contains(@jkernel,'yes'))">479<xsl:text>
#if !INCLUDE_JVMTI 
</xsl:text>480<xsl:text> return JVMTI_ERROR_NOT_AVAILABLE; 
</xsl:text>481<xsl:text>#else 
</xsl:text>482</xsl:if>483484<xsl:apply-templates select="." mode="traceSetUp"/>485<xsl:choose>486<xsl:when test="count(@phase)=0 or contains(@phase,'live')">487<xsl:text> if(!JvmtiEnv::is_vm_live()) {488</xsl:text>489<xsl:if test="$trace='Trace'">490<xsl:text> if (trace_flags) {491tty->print_cr("JVMTI [-] %s %s", func_name,492JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));493}494</xsl:text>495</xsl:if>496<xsl:text> return JVMTI_ERROR_WRONG_PHASE;497}</xsl:text>498499<xsl:text>500Thread* this_thread = (Thread*)ThreadLocalStorage::thread(); </xsl:text>501502<xsl:apply-templates select="." mode="transition"/>503</xsl:when>504<xsl:otherwise>505<xsl:if test="contains(@phase,'onload')">506<xsl:text> if(JvmtiEnv::get_phase()!=JVMTI_PHASE_ONLOAD</xsl:text>507<xsl:if test="not(contains(@phase,'onloadOnly'))">508<xsl:text> && JvmtiEnv::get_phase()!=JVMTI_PHASE_LIVE</xsl:text>509</xsl:if>510<xsl:text>) {511</xsl:text>512<xsl:if test="$trace='Trace'">513<xsl:text> if (trace_flags) {514tty->print_cr("JVMTI [-] %s %s", func_name,515JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));516}517</xsl:text>518</xsl:if>519<xsl:text> return JVMTI_ERROR_WRONG_PHASE;520}</xsl:text>521</xsl:if>522<xsl:if test="contains(@phase,'start')">523<xsl:text> if(JvmtiEnv::get_phase()!=JVMTI_PHASE_START && JvmtiEnv::get_phase()!=JVMTI_PHASE_LIVE) {524</xsl:text>525<xsl:if test="$trace='Trace'">526<xsl:text> if (trace_flags) {527tty->print_cr("JVMTI [-] %s %s", func_name,528JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));529}530</xsl:text>531</xsl:if>532<xsl:text> return JVMTI_ERROR_WRONG_PHASE;533}534Thread* this_thread = (Thread*)ThreadLocalStorage::thread(); </xsl:text>535<xsl:apply-templates select="." mode="transition"/>536</xsl:if>537</xsl:otherwise>538</xsl:choose>539540<xsl:text>541JvmtiEnv* jvmti_env = JvmtiEnv::JvmtiEnv_from_jvmti_env(env);542if (!jvmti_env->is_valid()) {543</xsl:text>544<xsl:if test="$trace='Trace'">545<xsl:text> if (trace_flags) {546tty->print_cr("JVMTI [%s] %s %s env=%d", curr_thread_name, func_name,547JvmtiUtil::error_name(JVMTI_ERROR_INVALID_ENVIRONMENT), env);548}549</xsl:text>550</xsl:if>551<xsl:text> return JVMTI_ERROR_INVALID_ENVIRONMENT;552}553</xsl:text>554555<xsl:apply-templates select="capabilities/required"/>556557<xsl:text> jvmtiError err;558</xsl:text>559<xsl:choose>560<xsl:when test="count(@phase)=1 and not(contains(@phase,'live')) and not(contains(@phase,'start'))">561<xsl:choose>562<xsl:when test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">563<xsl:text> if (Threads::number_of_threads() != 0) {564Thread* this_thread = (Thread*)ThreadLocalStorage::thread();</xsl:text>565</xsl:when>566<xsl:otherwise>567568<xsl:text> Thread* this_thread = NULL;569bool transition;570if (Threads::number_of_threads() == 0) {571transition = false;572} else {573this_thread = (Thread*)ThreadLocalStorage::thread();574transition = ((this_thread != NULL) && !this_thread->is_VM_thread() && !this_thread->is_ConcurrentGC_thread());575}576if (transition) {</xsl:text>577</xsl:otherwise>578579</xsl:choose>580<!-- we allow use in early phases but there are threads now, -->581<!-- so do thread transition -->582<xsl:apply-templates select="." mode="transition">583<xsl:with-param name="space">584<xsl:text>585</xsl:text>586</xsl:with-param>587</xsl:apply-templates>588<xsl:text>589</xsl:text>590<xsl:apply-templates select="." mode="doCall"/>591<xsl:text> } else {592</xsl:text>593<!-- we are pre-thread - no thread transition code -->594<xsl:apply-templates select="." mode="doCall"/>595<xsl:text> }596</xsl:text>597</xsl:when>598<xsl:otherwise>599<xsl:apply-templates select="." mode="doCall"/>600</xsl:otherwise>601</xsl:choose>602<xsl:text> return err;603</xsl:text>604605<xsl:if test="not(contains(@jkernel,'yes'))">606<xsl:text>#endif // INCLUDE_JVMTI
</xsl:text>607</xsl:if>608609<xsl:text>}
</xsl:text>610</xsl:template>611612<xsl:template match="function" mode="doCall">613<xsl:apply-templates select="parameters" mode="dochecks"/>614<xsl:apply-templates select="." mode="traceBefore"/>615<xsl:apply-templates select="." mode="genCall"/>616<xsl:apply-templates select="." mode="traceAfter"/>617</xsl:template>618619<xsl:template match="function" mode="genCall">620<xsl:text> err = jvmti_env-></xsl:text>621<xsl:value-of select="@id"/>622<xsl:text>(</xsl:text>623<xsl:apply-templates select="parameters" mode="HotSpotValue"/>624<xsl:text>);625</xsl:text>626</xsl:template>627628629<xsl:template match="function" mode="traceSetUp">630<xsl:if test="$trace='Trace'">631<xsl:text> SafeResourceMark rm;632jint trace_flags = JvmtiTrace::trace_flags(</xsl:text>633<xsl:value-of select="@num"/>634<xsl:text>);635const char *func_name = NULL;636const char *curr_thread_name = NULL;637if (trace_flags) {638func_name = JvmtiTrace::function_name(</xsl:text>639<xsl:value-of select="@num"/>640<xsl:text>);641curr_thread_name = JvmtiTrace::safe_get_current_thread_name();642}643</xsl:text>644</xsl:if>645</xsl:template>646647648<xsl:template match="function" mode="traceBefore">649<xsl:if test="$trace='Trace'">650<xsl:text>651if ((trace_flags & JvmtiTrace::SHOW_IN) != 0) {652</xsl:text>653<xsl:apply-templates select="." mode="traceIn"/>654<xsl:text> }655</xsl:text>656</xsl:if>657</xsl:template>658659660<xsl:template match="param" mode="traceError">661<xsl:param name="err"/>662<xsl:param name="comment"></xsl:param>663<xsl:param name="extraValue"></xsl:param>664<xsl:if test="$trace='Trace'">665<xsl:text> if ((trace_flags & JvmtiTrace::SHOW_ERROR) != 0) {666if ((trace_flags & JvmtiTrace::SHOW_IN) == 0) {667</xsl:text>668<xsl:apply-templates select="../.." mode="traceIn">669<xsl:with-param name="endParam" select="."/>670</xsl:apply-templates>671<xsl:text> }672tty->print_cr("JVMTI [%s] %s } %s - erroneous arg is </xsl:text>673<xsl:value-of select="@id"/>674<xsl:value-of select="$comment"/>675<xsl:text>", curr_thread_name, func_name,676JvmtiUtil::error_name(</xsl:text>677<xsl:value-of select="$err"/>678<xsl:text>)</xsl:text>679<xsl:value-of select="$extraValue"/>680<xsl:text>);681}682</xsl:text>683</xsl:if>684<xsl:text> return </xsl:text>685<xsl:value-of select="$err"/>686<xsl:text>;</xsl:text>687</xsl:template>688689690<xsl:template match="function" mode="traceAfter">691<xsl:if test="$trace='Trace'">692<xsl:text> if ( err != JVMTI_ERROR_NONE && (trace_flags & JvmtiTrace::SHOW_ERROR) != 0) {693if ((trace_flags & JvmtiTrace::SHOW_IN) == 0) {694</xsl:text>695<xsl:apply-templates select="." mode="traceIn"/>696<xsl:text> }697tty->print_cr("JVMTI [%s] %s } %s", curr_thread_name, func_name,698JvmtiUtil::error_name(err));699} else if ((trace_flags & JvmtiTrace::SHOW_OUT) != 0) {700tty->print_cr("JVMTI [%s] %s }", curr_thread_name, func_name);701}702</xsl:text>703</xsl:if>704</xsl:template>705706<xsl:template match="function" mode="traceIn">707<xsl:param name="endParam"></xsl:param>708<xsl:text> tty->print_cr("JVMTI [%s] %s { </xsl:text>709<xsl:apply-templates select="parameters" mode="traceInFormat">710<xsl:with-param name="endParam" select="$endParam"/>711</xsl:apply-templates>712<xsl:text>", curr_thread_name, func_name</xsl:text>713<xsl:apply-templates select="parameters" mode="traceInValue">714<xsl:with-param name="endParam" select="$endParam"/>715</xsl:apply-templates>716<xsl:text>);717</xsl:text>718</xsl:template>719720<xsl:template match="parameters" mode="dochecks">721<xsl:apply-templates select="param" mode="dochecks"/>722</xsl:template>723724<xsl:template match="param" mode="dochecks">725<xsl:apply-templates select="child::*[position()=1]" mode="dochecks">726<xsl:with-param name="name" select="@id"/>727</xsl:apply-templates>728</xsl:template>729730<xsl:template match="outptr|outbuf|allocfieldbuf|ptrtype|inptr|inbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="dochecks">731<xsl:param name="name"/>732<xsl:if test="count(nullok)=0">733<xsl:text> if (</xsl:text>734<xsl:value-of select="$name"/>735<xsl:text> == NULL) {736</xsl:text>737<xsl:apply-templates select=".." mode="traceError">738<xsl:with-param name="err">JVMTI_ERROR_NULL_POINTER</xsl:with-param>739</xsl:apply-templates>740<xsl:text>741}742</xsl:text>743</xsl:if>744</xsl:template>745746<xsl:template match="jrawMonitorID" mode="dochecks">747<xsl:param name="name"/>748<xsl:text> JvmtiRawMonitor *rmonitor = (JvmtiRawMonitor *)</xsl:text>749<xsl:value-of select="$name"/>750<xsl:text>;751if (rmonitor == NULL) {752</xsl:text>753<xsl:apply-templates select=".." mode="traceError">754<xsl:with-param name="err">JVMTI_ERROR_INVALID_MONITOR</xsl:with-param>755<xsl:with-param name="comment"> - raw monitor is NULL</xsl:with-param>756</xsl:apply-templates>757<xsl:text>758}759if (!rmonitor->is_valid()) {760</xsl:text>761<xsl:apply-templates select=".." mode="traceError">762<xsl:with-param name="err">JVMTI_ERROR_INVALID_MONITOR</xsl:with-param>763<xsl:with-param name="comment"> - not a raw monitor 0x%x</xsl:with-param>764<xsl:with-param name="extraValue">, rmonitor</xsl:with-param>765</xsl:apply-templates>766<xsl:text>767}768</xsl:text>769</xsl:template>770771<xsl:template match="jthread" mode="dochecksbody">772<xsl:param name="name"/>773<xsl:text> oop thread_oop = JNIHandles::resolve_external_guard(</xsl:text>774<xsl:value-of select="$name"/>775<xsl:text>);776if (thread_oop == NULL) {777</xsl:text>778<xsl:apply-templates select=".." mode="traceError">779<xsl:with-param name="err">JVMTI_ERROR_INVALID_THREAD</xsl:with-param>780<xsl:with-param name="comment"> - jthread resolved to NULL - jthread = 0x%x</xsl:with-param>781<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>782</xsl:apply-templates>783<xsl:text>784}785if (!thread_oop->is_a(SystemDictionary::Thread_klass())) {786</xsl:text>787<xsl:apply-templates select=".." mode="traceError">788<xsl:with-param name="err">JVMTI_ERROR_INVALID_THREAD</xsl:with-param>789<xsl:with-param name="comment"> - oop is not a thread - jthread = 0x%x</xsl:with-param>790<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>791</xsl:apply-templates>792<xsl:text>793}794java_thread = java_lang_Thread::thread(thread_oop);795if (java_thread == NULL) {796</xsl:text>797<xsl:apply-templates select=".." mode="traceError">798<xsl:with-param name="err">799<xsl:text>JVMTI_ERROR_THREAD_NOT_ALIVE</xsl:text>800</xsl:with-param>801<xsl:with-param name="comment"> - not a Java thread - jthread = 0x%x</xsl:with-param>802<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>803</xsl:apply-templates>804<xsl:text>805}806</xsl:text>807</xsl:template>808809<xsl:template match="jthread" mode="dochecks">810<xsl:param name="name"/>811<!-- If we convert and test threads -->812<xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">813<xsl:text> JavaThread* java_thread;814</xsl:text>815<xsl:choose>816<xsl:when test="count(@null)=0">817<xsl:apply-templates select="." mode="dochecksbody">818<xsl:with-param name="name" select="$name"/>819</xsl:apply-templates>820</xsl:when>821<xsl:otherwise>822<xsl:text> if (</xsl:text>823<xsl:value-of select="$name"/>824<xsl:text> == NULL) {825java_thread = current_thread;826} else {827</xsl:text>828<xsl:apply-templates select="." mode="dochecksbody">829<xsl:with-param name="name" select="$name"/>830</xsl:apply-templates>831<xsl:text> }832</xsl:text>833</xsl:otherwise>834</xsl:choose>835</xsl:if>836</xsl:template>837838<xsl:template match="jframeID" mode="dochecks">839<xsl:param name="name"/>840<xsl:text>841if (depth < 0) {842</xsl:text>843<xsl:apply-templates select=".." mode="traceError">844<xsl:with-param name="err">JVMTI_ERROR_ILLEGAL_ARGUMENT</xsl:with-param>845<xsl:with-param name="comment"> - negative depth - jthread = 0x%x</xsl:with-param>846<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>847</xsl:apply-templates>848<xsl:text>849}850</xsl:text>851</xsl:template>852853<xsl:template match="jclass" mode="dochecks">854<xsl:param name="name"/>855<!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->856<xsl:if test="count(@method)=0">857<xsl:text> oop k_mirror = JNIHandles::resolve_external_guard(</xsl:text>858<xsl:value-of select="$name"/>859<xsl:text>);860if (k_mirror == NULL) {861</xsl:text>862<xsl:apply-templates select=".." mode="traceError">863<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>864<xsl:with-param name="comment"> - resolved to NULL - jclass = 0x%x</xsl:with-param>865<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>866</xsl:apply-templates>867<xsl:text>868}869if (!k_mirror->is_a(SystemDictionary::Class_klass())) {870</xsl:text>871<xsl:apply-templates select=".." mode="traceError">872<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>873<xsl:with-param name="comment"> - not a class - jclass = 0x%x</xsl:with-param>874<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>875</xsl:apply-templates>876<xsl:text>877}878</xsl:text>879<xsl:if test="count(@method|@field)=1">880<xsl:text>881if (java_lang_Class::is_primitive(k_mirror)) {882</xsl:text>883<xsl:apply-templates select=".." mode="traceError">884<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>885<xsl:with-param name="comment"> - is a primitive class - jclass = 0x%x</xsl:with-param>886<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>887</xsl:apply-templates>888<xsl:text>889}890Klass* k_oop = java_lang_Class::as_Klass(k_mirror);891if (k_oop == NULL) {892</xsl:text>893<xsl:apply-templates select=".." mode="traceError">894<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>895<xsl:with-param name="comment"> - no Klass* - jclass = 0x%x</xsl:with-param>896<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>897</xsl:apply-templates>898<xsl:text>899}900</xsl:text>901</xsl:if>902</xsl:if>903</xsl:template>904905906<xsl:template match="jmethodID" mode="dochecks">907<xsl:param name="name"/>908<xsl:text> Method* method_oop = Method::checked_resolve_jmethod_id(</xsl:text>909<xsl:value-of select="$name"/>910<xsl:text>);
</xsl:text>911<xsl:text> if (method_oop == NULL) {
</xsl:text>912<xsl:apply-templates select=".." mode="traceError">913<xsl:with-param name="err">JVMTI_ERROR_INVALID_METHODID</xsl:with-param>914<xsl:with-param name="comment"></xsl:with-param>915<xsl:with-param name="extraValue"></xsl:with-param>916</xsl:apply-templates>917<xsl:text>
</xsl:text>918<xsl:text> }
</xsl:text>919<xsl:if test="count(@native)=1 and contains(@native,'error')">920<xsl:text> if (method_oop->is_native()) {
</xsl:text>921<xsl:text> return JVMTI_ERROR_NATIVE_METHOD;
</xsl:text>922<xsl:text> }
</xsl:text>923</xsl:if>924</xsl:template>925926927<xsl:template match="jfieldID" mode="dochecks">928<xsl:param name="name"/>929<xsl:text> ResourceMark rm_fdesc(current_thread);
</xsl:text>930<xsl:text> fieldDescriptor fdesc;
</xsl:text>931<xsl:text> if (!JvmtiEnv::get_field_descriptor(k_oop, </xsl:text>932<xsl:value-of select="$name"/>933<xsl:text>, &fdesc)) {
</xsl:text>934<xsl:apply-templates select=".." mode="traceError">935<xsl:with-param name="err">JVMTI_ERROR_INVALID_FIELDID</xsl:with-param>936</xsl:apply-templates>937<xsl:text>
</xsl:text>938<xsl:text> }
</xsl:text>939</xsl:template>940941942<xsl:template match="jint" mode="dochecks">943<xsl:param name="name"/>944<xsl:if test="count(@min)=1">945<xsl:text> if (</xsl:text>946<xsl:value-of select="$name"/>947<xsl:text> < </xsl:text>948<xsl:value-of select="@min"/>949<xsl:text>) {950</xsl:text>951<xsl:apply-templates select=".." mode="traceError">952<xsl:with-param name="err">JVMTI_ERROR_ILLEGAL_ARGUMENT</xsl:with-param>953</xsl:apply-templates>954<xsl:text>955}956</xsl:text>957</xsl:if>958</xsl:template>959960<xsl:template match="jobject|jvalue|jthreadGroup|enum|jchar|jlong|jfloat|jdouble|jlocation|jboolean|char|uchar|size_t|void|struct" mode="dochecks">961</xsl:template>962963<!-- iterate over parameters, stopping if specified is encountered -->964<xsl:template name="traceInValueParamsUpTo">965<xsl:param name="params"/>966<xsl:param name="endParam"></xsl:param>967<xsl:param name="index" select="1"/>968<xsl:variable name="cParam" select="$params[position()=$index]"/>969<xsl:if test="$cParam!=$endParam">970<xsl:apply-templates select="$cParam" mode="traceInValue"/>971<xsl:if test="count($params) > $index">972<xsl:call-template name="traceInValueParamsUpTo">973<xsl:with-param name="params" select="$params"/>974<xsl:with-param name="endParam" select="$endParam"/>975<xsl:with-param name="index" select="1+$index"/>976</xsl:call-template>977</xsl:if>978</xsl:if>979</xsl:template>980981<xsl:template name="traceInFormatParamsUpTo">982<xsl:param name="params"/>983<xsl:param name="endParam"></xsl:param>984<xsl:param name="index" select="1"/>985<xsl:variable name="cParam" select="$params[position()=$index]"/>986<xsl:if test="$cParam!=$endParam">987<xsl:apply-templates select="$cParam" mode="traceInFormat"/>988<xsl:if test="count($params) > $index">989<xsl:call-template name="traceInFormatParamsUpTo">990<xsl:with-param name="params" select="$params"/>991<xsl:with-param name="endParam" select="$endParam"/>992<xsl:with-param name="index" select="1+$index"/>993</xsl:call-template>994</xsl:if>995</xsl:if>996</xsl:template>997998<xsl:template match="parameters" mode="traceInFormat">999<xsl:param name="endParam"></xsl:param>1000<xsl:call-template name="traceInFormatParamsUpTo">1001<xsl:with-param name="params" select="param"/>1002<xsl:with-param name="endParam" select="$endParam"/>1003</xsl:call-template>1004</xsl:template>10051006<xsl:template match="parameters" mode="traceInValue">1007<xsl:param name="endParam"></xsl:param>1008<xsl:call-template name="traceInValueParamsUpTo">1009<xsl:with-param name="params" select="param"/>1010<xsl:with-param name="endParam" select="$endParam"/>1011</xsl:call-template>1012</xsl:template>10131014<xsl:template match="param" mode="traceInFormat">1015<xsl:apply-templates select="child::*[position()=1]" mode="traceInFormat">1016<xsl:with-param name="name" select="@id"/>1017</xsl:apply-templates>1018</xsl:template>10191020<xsl:template match="param" mode="traceInValue">1021<xsl:apply-templates select="child::*[position()=1]" mode="traceInValue">1022<xsl:with-param name="name" select="@id"/>1023</xsl:apply-templates>1024</xsl:template>10251026<xsl:template match="outptr|outbuf|allocfieldbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="traceInFormat">1027</xsl:template>10281029<xsl:template match="outptr|outbuf|allocfieldbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="traceInValue">1030</xsl:template>10311032<xsl:template match="inbuf" mode="traceInFormat">1033<xsl:param name="name"/>1034<xsl:text> </xsl:text>1035<xsl:value-of select="$name"/>1036<xsl:variable name="child" select="child::*[position()=1]"/>1037<xsl:choose>1038<xsl:when test="name($child)='char'">1039<xsl:text>='%s'</xsl:text>1040</xsl:when>1041<xsl:otherwise>1042<xsl:text>=0x%x</xsl:text>1043</xsl:otherwise>1044</xsl:choose>1045</xsl:template>10461047<xsl:template match="inbuf" mode="traceInValue">1048<xsl:param name="name"/>1049<xsl:text>, </xsl:text>1050<xsl:value-of select="$name"/>1051</xsl:template>10521053<xsl:template match="ptrtype" mode="traceInFormat">1054<xsl:param name="name"/>1055<xsl:variable name="child" select="child::*[position()=1]"/>1056<xsl:choose>1057<xsl:when test="name($child)='jclass'">1058<xsl:text> </xsl:text>1059<xsl:value-of select="$name"/>1060<xsl:text>=0x%x</xsl:text>1061</xsl:when>1062<xsl:otherwise>1063<xsl:apply-templates select="$child" mode="traceInFormat"/>1064</xsl:otherwise>1065</xsl:choose>1066</xsl:template>10671068<xsl:template match="ptrtype" mode="traceInValue">1069<xsl:param name="name"/>1070<xsl:variable name="child" select="child::*[position()=1]"/>1071<xsl:choose>1072<xsl:when test="name($child)='jclass'">1073<xsl:text>, </xsl:text>1074<xsl:value-of select="$name"/>1075</xsl:when>1076<xsl:otherwise>1077<xsl:apply-templates select="$child" mode="traceInValue"/>1078</xsl:otherwise>1079</xsl:choose>1080</xsl:template>10811082<xsl:template match="inptr" mode="traceInFormat">1083<xsl:param name="name"/>1084<xsl:text> </xsl:text>1085<xsl:value-of select="$name"/>1086<xsl:text>=0x%x</xsl:text>1087</xsl:template>10881089<xsl:template match="inptr" mode="traceInValue">1090<xsl:param name="name"/>1091<xsl:text>, </xsl:text>1092<xsl:value-of select="$name"/>1093</xsl:template>10941095<xsl:template match="jrawMonitorID|jfieldID" mode="traceInFormat">1096<xsl:param name="name"/>1097<xsl:text> </xsl:text>1098<xsl:value-of select="$name"/>1099<xsl:text>=%s</xsl:text>1100</xsl:template>11011102<xsl:template match="jclass" mode="traceInFormat">1103<xsl:param name="name"/>1104<!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->1105<xsl:if test="count(@method)=0">1106<xsl:text> </xsl:text>1107<xsl:value-of select="$name"/>1108<xsl:text>=%s</xsl:text>1109</xsl:if>1110</xsl:template>11111112<xsl:template match="jrawMonitorID" mode="traceInValue">1113<xsl:param name="name"/>1114<xsl:text>, rmonitor->get_name()</xsl:text>1115</xsl:template>11161117<xsl:template match="jthread" mode="traceInFormat">1118<xsl:param name="name"/>1119<!-- If we convert and test threads -->1120<xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">1121<xsl:text> </xsl:text>1122<xsl:value-of select="$name"/>1123<xsl:text>=%s</xsl:text>1124</xsl:if>1125</xsl:template>11261127<xsl:template match="jthread" mode="traceInValue">1128<xsl:param name="name"/>1129<!-- If we convert and test threads -->1130<xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">1131<xsl:text>,1132JvmtiTrace::safe_get_thread_name(java_thread)</xsl:text>1133</xsl:if>1134</xsl:template>11351136<xsl:template match="jframeID" mode="traceInFormat">1137<xsl:param name="name"/>1138<xsl:text>depth=%d</xsl:text>1139</xsl:template>11401141<xsl:template match="jframeID" mode="traceInValue">1142<xsl:param name="name"/>1143<xsl:text>, </xsl:text>1144<xsl:value-of select="$name"/>1145</xsl:template>11461147<xsl:template match="jclass" mode="traceInValue">1148<!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->1149<xsl:if test="count(@method)=0">1150<xsl:text>,1151JvmtiTrace::get_class_name(k_mirror)</xsl:text>1152</xsl:if>1153</xsl:template>11541155<xsl:template match="jmethodID" mode="traceInFormat">1156<xsl:param name="name"/>1157<xsl:text> </xsl:text>1158<xsl:value-of select="$name"/>1159<xsl:text>=%s.%s</xsl:text>1160</xsl:template>11611162<xsl:template match="jmethodID" mode="traceInValue">1163<xsl:param name="name"/>1164<xsl:text>,1165method_oop == NULL? "NULL" : method_oop->klass_name()->as_C_string(),1166method_oop == NULL? "NULL" : method_oop->name()->as_C_string()1167</xsl:text>1168</xsl:template>11691170<xsl:template match="jfieldID" mode="traceInValue">1171<xsl:param name="name"/>1172<xsl:text>, fdesc.name()->as_C_string()</xsl:text>1173</xsl:template>11741175<xsl:template match="enum" mode="traceInFormat">1176<xsl:param name="name"/>1177<xsl:text> </xsl:text>1178<xsl:value-of select="$name"/>1179<xsl:text>=%d:%s</xsl:text>1180</xsl:template>11811182<xsl:template match="enum" mode="traceInValue">1183<xsl:param name="name"/>1184<xsl:text>, </xsl:text>1185<xsl:value-of select="$name"/>1186<xsl:text>,1187</xsl:text>1188<xsl:choose>1189<xsl:when test=".='jvmtiError'">1190<xsl:text>JvmtiUtil::error_name(</xsl:text>1191<xsl:value-of select="$name"/>1192<xsl:text>)1193</xsl:text>1194</xsl:when>1195<xsl:otherwise>1196<xsl:choose>1197<xsl:when test=".='jvmtiEvent'">1198<xsl:text>JvmtiTrace::event_name(</xsl:text>1199<xsl:value-of select="$name"/>1200<xsl:text>)1201</xsl:text>1202</xsl:when>1203<xsl:otherwise>1204<xsl:text>JvmtiTrace::enum_name(</xsl:text>1205<xsl:value-of select="."/>1206<xsl:text>ConstantNames, </xsl:text>1207<xsl:value-of select="."/>1208<xsl:text>ConstantValues, </xsl:text>1209<xsl:value-of select="$name"/>1210<xsl:text>)</xsl:text>1211</xsl:otherwise>1212</xsl:choose>1213</xsl:otherwise>1214</xsl:choose>1215</xsl:template>12161217<xsl:template match="jint|jlocation" mode="traceInFormat">1218<xsl:param name="name"/>1219<xsl:text> </xsl:text>1220<xsl:value-of select="$name"/>1221<xsl:text>=%d</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>=%ld</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>=0x%zx</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