Path: blob/jdk8u272-b10-aarch32-20201026/hotspot/src/share/vm/prims/jvmtiEnter.xsl
48773 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>ThreadInVMfromNative __tiv(current_thread);</xsl:text>433<xsl:value-of select="$space"/>434<xsl:text>VM_ENTRY_BASE(jvmtiError, </xsl:text>435<xsl:apply-templates select="." mode="functionid"/>436<xsl:text> , current_thread)</xsl:text>437<xsl:value-of select="$space"/>438<xsl:text>debug_only(VMNativeEntryWrapper __vew;)</xsl:text>439<xsl:if test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">440<xsl:value-of select="$space"/>441<xsl:text>CautiouslyPreserveExceptionMark __em(this_thread);</xsl:text>442</xsl:if>443</xsl:if>444</xsl:template>445446447<xsl:template match="required">448<xsl:text>449if (jvmti_env->get_capabilities()-></xsl:text>450<xsl:value-of select="@id"/>451<xsl:text> == 0) {452</xsl:text>453<xsl:if test="$trace='Trace'">454<xsl:text> if (trace_flags) {455tty->print_cr("JVMTI [%s] %s %s", curr_thread_name, func_name,456JvmtiUtil::error_name(JVMTI_ERROR_MUST_POSSESS_CAPABILITY));457}458</xsl:text>459</xsl:if>460<xsl:text> return JVMTI_ERROR_MUST_POSSESS_CAPABILITY;461}462</xsl:text>463</xsl:template>464465466<xsl:template match="function">467<xsl:text>468static jvmtiError JNICALL469</xsl:text>470<xsl:apply-templates select="." mode="functionid"/>471<xsl:text>(jvmtiEnv* env</xsl:text>472<xsl:apply-templates select="parameters" mode="signature"/>473<xsl:text>) {474</xsl:text>475476<xsl:if test="not(contains(@jkernel,'yes'))">477<xsl:text>
#if !INCLUDE_JVMTI 
</xsl:text>478<xsl:text> return JVMTI_ERROR_NOT_AVAILABLE; 
</xsl:text>479<xsl:text>#else 
</xsl:text>480</xsl:if>481482<xsl:apply-templates select="." mode="traceSetUp"/>483<xsl:choose>484<xsl:when test="count(@phase)=0 or contains(@phase,'live')">485<xsl:text> if(!JvmtiEnv::is_vm_live()) {486</xsl:text>487<xsl:if test="$trace='Trace'">488<xsl:text> if (trace_flags) {489tty->print_cr("JVMTI [-] %s %s", func_name,490JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));491}492</xsl:text>493</xsl:if>494<xsl:text> return JVMTI_ERROR_WRONG_PHASE;495}</xsl:text>496497<xsl:text>498Thread* this_thread = (Thread*)ThreadLocalStorage::thread(); </xsl:text>499500<xsl:apply-templates select="." mode="transition"/>501</xsl:when>502<xsl:otherwise>503<xsl:if test="contains(@phase,'onload')">504<xsl:text> if(JvmtiEnv::get_phase()!=JVMTI_PHASE_ONLOAD</xsl:text>505<xsl:if test="not(contains(@phase,'onloadOnly'))">506<xsl:text> && JvmtiEnv::get_phase()!=JVMTI_PHASE_LIVE</xsl:text>507</xsl:if>508<xsl:text>) {509</xsl:text>510<xsl:if test="$trace='Trace'">511<xsl:text> if (trace_flags) {512tty->print_cr("JVMTI [-] %s %s", func_name,513JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));514}515</xsl:text>516</xsl:if>517<xsl:text> return JVMTI_ERROR_WRONG_PHASE;518}</xsl:text>519</xsl:if>520<xsl:if test="contains(@phase,'start')">521<xsl:text> if(JvmtiEnv::get_phase()!=JVMTI_PHASE_START && JvmtiEnv::get_phase()!=JVMTI_PHASE_LIVE) {522</xsl:text>523<xsl:if test="$trace='Trace'">524<xsl:text> if (trace_flags) {525tty->print_cr("JVMTI [-] %s %s", func_name,526JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));527}528</xsl:text>529</xsl:if>530<xsl:text> return JVMTI_ERROR_WRONG_PHASE;531}532Thread* this_thread = (Thread*)ThreadLocalStorage::thread(); </xsl:text>533<xsl:apply-templates select="." mode="transition"/>534</xsl:if>535</xsl:otherwise>536</xsl:choose>537538<xsl:text>539JvmtiEnv* jvmti_env = JvmtiEnv::JvmtiEnv_from_jvmti_env(env);540if (!jvmti_env->is_valid()) {541</xsl:text>542<xsl:if test="$trace='Trace'">543<xsl:text> if (trace_flags) {544tty->print_cr("JVMTI [%s] %s %s env=%d", curr_thread_name, func_name,545JvmtiUtil::error_name(JVMTI_ERROR_INVALID_ENVIRONMENT), env);546}547</xsl:text>548</xsl:if>549<xsl:text> return JVMTI_ERROR_INVALID_ENVIRONMENT;550}551</xsl:text>552553<xsl:apply-templates select="capabilities/required"/>554555<xsl:text> jvmtiError err;556</xsl:text>557<xsl:choose>558<xsl:when test="count(@phase)=1 and not(contains(@phase,'live')) and not(contains(@phase,'start'))">559<xsl:choose>560<xsl:when test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">561<xsl:text> if (Threads::number_of_threads() != 0) {562Thread* this_thread = (Thread*)ThreadLocalStorage::thread();</xsl:text>563</xsl:when>564<xsl:otherwise>565566<xsl:text> Thread* this_thread = NULL;567bool transition;568if (Threads::number_of_threads() == 0) {569transition = false;570} else {571this_thread = (Thread*)ThreadLocalStorage::thread();572transition = ((this_thread != NULL) && !this_thread->is_VM_thread() && !this_thread->is_ConcurrentGC_thread());573}574if (transition) {</xsl:text>575</xsl:otherwise>576577</xsl:choose>578<!-- we allow use in early phases but there are threads now, -->579<!-- so do thread transition -->580<xsl:apply-templates select="." mode="transition">581<xsl:with-param name="space">582<xsl:text>583</xsl:text>584</xsl:with-param>585</xsl:apply-templates>586<xsl:text>587</xsl:text>588<xsl:apply-templates select="." mode="doCall"/>589<xsl:text> } else {590</xsl:text>591<!-- we are pre-thread - no thread transition code -->592<xsl:apply-templates select="." mode="doCall"/>593<xsl:text> }594</xsl:text>595</xsl:when>596<xsl:otherwise>597<xsl:apply-templates select="." mode="doCall"/>598</xsl:otherwise>599</xsl:choose>600<xsl:text> return err;601</xsl:text>602603<xsl:if test="not(contains(@jkernel,'yes'))">604<xsl:text>#endif // INCLUDE_JVMTI
</xsl:text>605</xsl:if>606607<xsl:text>}
</xsl:text>608</xsl:template>609610<xsl:template match="function" mode="doCall">611<xsl:apply-templates select="parameters" mode="dochecks"/>612<xsl:apply-templates select="." mode="traceBefore"/>613<xsl:apply-templates select="." mode="genCall"/>614<xsl:apply-templates select="." mode="traceAfter"/>615</xsl:template>616617<xsl:template match="function" mode="genCall">618<xsl:text> err = jvmti_env-></xsl:text>619<xsl:value-of select="@id"/>620<xsl:text>(</xsl:text>621<xsl:apply-templates select="parameters" mode="HotSpotValue"/>622<xsl:text>);623</xsl:text>624</xsl:template>625626627<xsl:template match="function" mode="traceSetUp">628<xsl:if test="$trace='Trace'">629<xsl:text> SafeResourceMark rm;630jint trace_flags = JvmtiTrace::trace_flags(</xsl:text>631<xsl:value-of select="@num"/>632<xsl:text>);633const char *func_name = NULL;634const char *curr_thread_name = NULL;635if (trace_flags) {636func_name = JvmtiTrace::function_name(</xsl:text>637<xsl:value-of select="@num"/>638<xsl:text>);639curr_thread_name = JvmtiTrace::safe_get_current_thread_name();640}641</xsl:text>642</xsl:if>643</xsl:template>644645646<xsl:template match="function" mode="traceBefore">647<xsl:if test="$trace='Trace'">648<xsl:text>649if ((trace_flags & JvmtiTrace::SHOW_IN) != 0) {650</xsl:text>651<xsl:apply-templates select="." mode="traceIn"/>652<xsl:text> }653</xsl:text>654</xsl:if>655</xsl:template>656657658<xsl:template match="param" mode="traceError">659<xsl:param name="err"/>660<xsl:param name="comment"></xsl:param>661<xsl:param name="extraValue"></xsl:param>662<xsl:if test="$trace='Trace'">663<xsl:text> if ((trace_flags & JvmtiTrace::SHOW_ERROR) != 0) {664if ((trace_flags & JvmtiTrace::SHOW_IN) == 0) {665</xsl:text>666<xsl:apply-templates select="../.." mode="traceIn">667<xsl:with-param name="endParam" select="."/>668</xsl:apply-templates>669<xsl:text> }670tty->print_cr("JVMTI [%s] %s } %s - erroneous arg is </xsl:text>671<xsl:value-of select="@id"/>672<xsl:value-of select="$comment"/>673<xsl:text>", curr_thread_name, func_name,674JvmtiUtil::error_name(</xsl:text>675<xsl:value-of select="$err"/>676<xsl:text>)</xsl:text>677<xsl:value-of select="$extraValue"/>678<xsl:text>);679}680</xsl:text>681</xsl:if>682<xsl:text> return </xsl:text>683<xsl:value-of select="$err"/>684<xsl:text>;</xsl:text>685</xsl:template>686687688<xsl:template match="function" mode="traceAfter">689<xsl:if test="$trace='Trace'">690<xsl:text> if ( err != JVMTI_ERROR_NONE && (trace_flags & JvmtiTrace::SHOW_ERROR) != 0) {691if ((trace_flags & JvmtiTrace::SHOW_IN) == 0) {692</xsl:text>693<xsl:apply-templates select="." mode="traceIn"/>694<xsl:text> }695tty->print_cr("JVMTI [%s] %s } %s", curr_thread_name, func_name,696JvmtiUtil::error_name(err));697} else if ((trace_flags & JvmtiTrace::SHOW_OUT) != 0) {698tty->print_cr("JVMTI [%s] %s }", curr_thread_name, func_name);699}700</xsl:text>701</xsl:if>702</xsl:template>703704<xsl:template match="function" mode="traceIn">705<xsl:param name="endParam"></xsl:param>706<xsl:text> tty->print_cr("JVMTI [%s] %s { </xsl:text>707<xsl:apply-templates select="parameters" mode="traceInFormat">708<xsl:with-param name="endParam" select="$endParam"/>709</xsl:apply-templates>710<xsl:text>", curr_thread_name, func_name</xsl:text>711<xsl:apply-templates select="parameters" mode="traceInValue">712<xsl:with-param name="endParam" select="$endParam"/>713</xsl:apply-templates>714<xsl:text>);715</xsl:text>716</xsl:template>717718<xsl:template match="parameters" mode="dochecks">719<xsl:apply-templates select="param" mode="dochecks"/>720</xsl:template>721722<xsl:template match="param" mode="dochecks">723<xsl:apply-templates select="child::*[position()=1]" mode="dochecks">724<xsl:with-param name="name" select="@id"/>725</xsl:apply-templates>726</xsl:template>727728<xsl:template match="outptr|outbuf|allocfieldbuf|ptrtype|inptr|inbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="dochecks">729<xsl:param name="name"/>730<xsl:if test="count(nullok)=0">731<xsl:text> if (</xsl:text>732<xsl:value-of select="$name"/>733<xsl:text> == NULL) {734</xsl:text>735<xsl:apply-templates select=".." mode="traceError">736<xsl:with-param name="err">JVMTI_ERROR_NULL_POINTER</xsl:with-param>737</xsl:apply-templates>738<xsl:text>739}740</xsl:text>741</xsl:if>742</xsl:template>743744<xsl:template match="jrawMonitorID" mode="dochecks">745<xsl:param name="name"/>746<xsl:text> JvmtiRawMonitor *rmonitor = (JvmtiRawMonitor *)</xsl:text>747<xsl:value-of select="$name"/>748<xsl:text>;749if (rmonitor == NULL) {750</xsl:text>751<xsl:apply-templates select=".." mode="traceError">752<xsl:with-param name="err">JVMTI_ERROR_INVALID_MONITOR</xsl:with-param>753<xsl:with-param name="comment"> - raw monitor is NULL</xsl:with-param>754</xsl:apply-templates>755<xsl:text>756}757if (!rmonitor->is_valid()) {758</xsl:text>759<xsl:apply-templates select=".." mode="traceError">760<xsl:with-param name="err">JVMTI_ERROR_INVALID_MONITOR</xsl:with-param>761<xsl:with-param name="comment"> - not a raw monitor 0x%x</xsl:with-param>762<xsl:with-param name="extraValue">, rmonitor</xsl:with-param>763</xsl:apply-templates>764<xsl:text>765}766</xsl:text>767</xsl:template>768769<xsl:template match="jthread" mode="dochecksbody">770<xsl:param name="name"/>771<xsl:text> oop thread_oop = JNIHandles::resolve_external_guard(</xsl:text>772<xsl:value-of select="$name"/>773<xsl:text>);774if (thread_oop == NULL) {775</xsl:text>776<xsl:apply-templates select=".." mode="traceError">777<xsl:with-param name="err">JVMTI_ERROR_INVALID_THREAD</xsl:with-param>778<xsl:with-param name="comment"> - jthread resolved to NULL - jthread = 0x%x</xsl:with-param>779<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>780</xsl:apply-templates>781<xsl:text>782}783if (!thread_oop->is_a(SystemDictionary::Thread_klass())) {784</xsl:text>785<xsl:apply-templates select=".." mode="traceError">786<xsl:with-param name="err">JVMTI_ERROR_INVALID_THREAD</xsl:with-param>787<xsl:with-param name="comment"> - oop is not a thread - jthread = 0x%x</xsl:with-param>788<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>789</xsl:apply-templates>790<xsl:text>791}792java_thread = java_lang_Thread::thread(thread_oop);793if (java_thread == NULL) {794</xsl:text>795<xsl:apply-templates select=".." mode="traceError">796<xsl:with-param name="err">797<xsl:text>JVMTI_ERROR_THREAD_NOT_ALIVE</xsl:text>798</xsl:with-param>799<xsl:with-param name="comment"> - not a Java thread - jthread = 0x%x</xsl:with-param>800<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>801</xsl:apply-templates>802<xsl:text>803}804</xsl:text>805</xsl:template>806807<xsl:template match="jthread" mode="dochecks">808<xsl:param name="name"/>809<!-- If we convert and test threads -->810<xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">811<xsl:text> JavaThread* java_thread;812</xsl:text>813<xsl:choose>814<xsl:when test="count(@null)=0">815<xsl:apply-templates select="." mode="dochecksbody">816<xsl:with-param name="name" select="$name"/>817</xsl:apply-templates>818</xsl:when>819<xsl:otherwise>820<xsl:text> if (</xsl:text>821<xsl:value-of select="$name"/>822<xsl:text> == NULL) {823java_thread = current_thread;824} else {825</xsl:text>826<xsl:apply-templates select="." mode="dochecksbody">827<xsl:with-param name="name" select="$name"/>828</xsl:apply-templates>829<xsl:text> }830</xsl:text>831</xsl:otherwise>832</xsl:choose>833</xsl:if>834</xsl:template>835836<xsl:template match="jframeID" mode="dochecks">837<xsl:param name="name"/>838<xsl:text>839if (depth < 0) {840</xsl:text>841<xsl:apply-templates select=".." mode="traceError">842<xsl:with-param name="err">JVMTI_ERROR_ILLEGAL_ARGUMENT</xsl:with-param>843<xsl:with-param name="comment"> - negative depth - jthread = 0x%x</xsl:with-param>844<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>845</xsl:apply-templates>846<xsl:text>847}848</xsl:text>849</xsl:template>850851<xsl:template match="jclass" mode="dochecks">852<xsl:param name="name"/>853<!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->854<xsl:if test="count(@method)=0">855<xsl:text> oop k_mirror = JNIHandles::resolve_external_guard(</xsl:text>856<xsl:value-of select="$name"/>857<xsl:text>);858if (k_mirror == NULL) {859</xsl:text>860<xsl:apply-templates select=".." mode="traceError">861<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>862<xsl:with-param name="comment"> - resolved to NULL - jclass = 0x%x</xsl:with-param>863<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>864</xsl:apply-templates>865<xsl:text>866}867if (!k_mirror->is_a(SystemDictionary::Class_klass())) {868</xsl:text>869<xsl:apply-templates select=".." mode="traceError">870<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>871<xsl:with-param name="comment"> - not a class - jclass = 0x%x</xsl:with-param>872<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>873</xsl:apply-templates>874<xsl:text>875}876</xsl:text>877<xsl:if test="count(@method|@field)=1">878<xsl:text>879if (java_lang_Class::is_primitive(k_mirror)) {880</xsl:text>881<xsl:apply-templates select=".." mode="traceError">882<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>883<xsl:with-param name="comment"> - is a primitive class - jclass = 0x%x</xsl:with-param>884<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>885</xsl:apply-templates>886<xsl:text>887}888Klass* k_oop = java_lang_Class::as_Klass(k_mirror);889if (k_oop == NULL) {890</xsl:text>891<xsl:apply-templates select=".." mode="traceError">892<xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>893<xsl:with-param name="comment"> - no Klass* - jclass = 0x%x</xsl:with-param>894<xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>895</xsl:apply-templates>896<xsl:text>897}898</xsl:text>899</xsl:if>900</xsl:if>901</xsl:template>902903904<xsl:template match="jmethodID" mode="dochecks">905<xsl:param name="name"/>906<xsl:text> Method* method_oop = Method::checked_resolve_jmethod_id(</xsl:text>907<xsl:value-of select="$name"/>908<xsl:text>);
</xsl:text>909<xsl:text> if (method_oop == NULL) {
</xsl:text>910<xsl:apply-templates select=".." mode="traceError">911<xsl:with-param name="err">JVMTI_ERROR_INVALID_METHODID</xsl:with-param>912<xsl:with-param name="comment"></xsl:with-param>913<xsl:with-param name="extraValue"></xsl:with-param>914</xsl:apply-templates>915<xsl:text>
</xsl:text>916<xsl:text> }
</xsl:text>917<xsl:if test="count(@native)=1 and contains(@native,'error')">918<xsl:text> if (method_oop->is_native()) {
</xsl:text>919<xsl:text> return JVMTI_ERROR_NATIVE_METHOD;
</xsl:text>920<xsl:text> }
</xsl:text>921</xsl:if>922</xsl:template>923924925<xsl:template match="jfieldID" mode="dochecks">926<xsl:param name="name"/>927<xsl:text> ResourceMark rm_fdesc(current_thread);
</xsl:text>928<xsl:text> fieldDescriptor fdesc;
</xsl:text>929<xsl:text> if (!JvmtiEnv::get_field_descriptor(k_oop, </xsl:text>930<xsl:value-of select="$name"/>931<xsl:text>, &fdesc)) {
</xsl:text>932<xsl:apply-templates select=".." mode="traceError">933<xsl:with-param name="err">JVMTI_ERROR_INVALID_FIELDID</xsl:with-param>934</xsl:apply-templates>935<xsl:text>
</xsl:text>936<xsl:text> }
</xsl:text>937</xsl:template>938939940<xsl:template match="jint" mode="dochecks">941<xsl:param name="name"/>942<xsl:if test="count(@min)=1">943<xsl:text> if (</xsl:text>944<xsl:value-of select="$name"/>945<xsl:text> < </xsl:text>946<xsl:value-of select="@min"/>947<xsl:text>) {948</xsl:text>949<xsl:apply-templates select=".." mode="traceError">950<xsl:with-param name="err">JVMTI_ERROR_ILLEGAL_ARGUMENT</xsl:with-param>951</xsl:apply-templates>952<xsl:text>953}954</xsl:text>955</xsl:if>956</xsl:template>957958<xsl:template match="jobject|jvalue|jthreadGroup|enum|jchar|jlong|jfloat|jdouble|jlocation|jboolean|char|uchar|size_t|void|struct" mode="dochecks">959</xsl:template>960961<!-- iterate over parameters, stopping if specified is encountered -->962<xsl:template name="traceInValueParamsUpTo">963<xsl:param name="params"/>964<xsl:param name="endParam"></xsl:param>965<xsl:param name="index" select="1"/>966<xsl:variable name="cParam" select="$params[position()=$index]"/>967<xsl:if test="$cParam!=$endParam">968<xsl:apply-templates select="$cParam" mode="traceInValue"/>969<xsl:if test="count($params) > $index">970<xsl:call-template name="traceInValueParamsUpTo">971<xsl:with-param name="params" select="$params"/>972<xsl:with-param name="endParam" select="$endParam"/>973<xsl:with-param name="index" select="1+$index"/>974</xsl:call-template>975</xsl:if>976</xsl:if>977</xsl:template>978979<xsl:template name="traceInFormatParamsUpTo">980<xsl:param name="params"/>981<xsl:param name="endParam"></xsl:param>982<xsl:param name="index" select="1"/>983<xsl:variable name="cParam" select="$params[position()=$index]"/>984<xsl:if test="$cParam!=$endParam">985<xsl:apply-templates select="$cParam" mode="traceInFormat"/>986<xsl:if test="count($params) > $index">987<xsl:call-template name="traceInFormatParamsUpTo">988<xsl:with-param name="params" select="$params"/>989<xsl:with-param name="endParam" select="$endParam"/>990<xsl:with-param name="index" select="1+$index"/>991</xsl:call-template>992</xsl:if>993</xsl:if>994</xsl:template>995996<xsl:template match="parameters" mode="traceInFormat">997<xsl:param name="endParam"></xsl:param>998<xsl:call-template name="traceInFormatParamsUpTo">999<xsl:with-param name="params" select="param"/>1000<xsl:with-param name="endParam" select="$endParam"/>1001</xsl:call-template>1002</xsl:template>10031004<xsl:template match="parameters" mode="traceInValue">1005<xsl:param name="endParam"></xsl:param>1006<xsl:call-template name="traceInValueParamsUpTo">1007<xsl:with-param name="params" select="param"/>1008<xsl:with-param name="endParam" select="$endParam"/>1009</xsl:call-template>1010</xsl:template>10111012<xsl:template match="param" mode="traceInFormat">1013<xsl:apply-templates select="child::*[position()=1]" mode="traceInFormat">1014<xsl:with-param name="name" select="@id"/>1015</xsl:apply-templates>1016</xsl:template>10171018<xsl:template match="param" mode="traceInValue">1019<xsl:apply-templates select="child::*[position()=1]" mode="traceInValue">1020<xsl:with-param name="name" select="@id"/>1021</xsl:apply-templates>1022</xsl:template>10231024<xsl:template match="outptr|outbuf|allocfieldbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="traceInFormat">1025</xsl:template>10261027<xsl:template match="outptr|outbuf|allocfieldbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="traceInValue">1028</xsl:template>10291030<xsl:template match="inbuf" mode="traceInFormat">1031<xsl:param name="name"/>1032<xsl:text> </xsl:text>1033<xsl:value-of select="$name"/>1034<xsl:variable name="child" select="child::*[position()=1]"/>1035<xsl:choose>1036<xsl:when test="name($child)='char'">1037<xsl:text>='%s'</xsl:text>1038</xsl:when>1039<xsl:otherwise>1040<xsl:text>=0x%x</xsl:text>1041</xsl:otherwise>1042</xsl:choose>1043</xsl:template>10441045<xsl:template match="inbuf" mode="traceInValue">1046<xsl:param name="name"/>1047<xsl:text>, </xsl:text>1048<xsl:value-of select="$name"/>1049</xsl:template>10501051<xsl:template match="ptrtype" mode="traceInFormat">1052<xsl:param name="name"/>1053<xsl:variable name="child" select="child::*[position()=1]"/>1054<xsl:choose>1055<xsl:when test="name($child)='jclass'">1056<xsl:text> </xsl:text>1057<xsl:value-of select="$name"/>1058<xsl:text>=0x%x</xsl:text>1059</xsl:when>1060<xsl:otherwise>1061<xsl:apply-templates select="$child" mode="traceInFormat"/>1062</xsl:otherwise>1063</xsl:choose>1064</xsl:template>10651066<xsl:template match="ptrtype" mode="traceInValue">1067<xsl:param name="name"/>1068<xsl:variable name="child" select="child::*[position()=1]"/>1069<xsl:choose>1070<xsl:when test="name($child)='jclass'">1071<xsl:text>, </xsl:text>1072<xsl:value-of select="$name"/>1073</xsl:when>1074<xsl:otherwise>1075<xsl:apply-templates select="$child" mode="traceInValue"/>1076</xsl:otherwise>1077</xsl:choose>1078</xsl:template>10791080<xsl:template match="inptr" mode="traceInFormat">1081<xsl:param name="name"/>1082<xsl:text> </xsl:text>1083<xsl:value-of select="$name"/>1084<xsl:text>=0x%x</xsl:text>1085</xsl:template>10861087<xsl:template match="inptr" mode="traceInValue">1088<xsl:param name="name"/>1089<xsl:text>, </xsl:text>1090<xsl:value-of select="$name"/>1091</xsl:template>10921093<xsl:template match="jrawMonitorID|jfieldID" mode="traceInFormat">1094<xsl:param name="name"/>1095<xsl:text> </xsl:text>1096<xsl:value-of select="$name"/>1097<xsl:text>=%s</xsl:text>1098</xsl:template>10991100<xsl:template match="jclass" mode="traceInFormat">1101<xsl:param name="name"/>1102<!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->1103<xsl:if test="count(@method)=0">1104<xsl:text> </xsl:text>1105<xsl:value-of select="$name"/>1106<xsl:text>=%s</xsl:text>1107</xsl:if>1108</xsl:template>11091110<xsl:template match="jrawMonitorID" mode="traceInValue">1111<xsl:param name="name"/>1112<xsl:text>, rmonitor->get_name()</xsl:text>1113</xsl:template>11141115<xsl:template match="jthread" mode="traceInFormat">1116<xsl:param name="name"/>1117<!-- If we convert and test threads -->1118<xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">1119<xsl:text> </xsl:text>1120<xsl:value-of select="$name"/>1121<xsl:text>=%s</xsl:text>1122</xsl:if>1123</xsl:template>11241125<xsl:template match="jthread" mode="traceInValue">1126<xsl:param name="name"/>1127<!-- If we convert and test threads -->1128<xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">1129<xsl:text>,1130JvmtiTrace::safe_get_thread_name(java_thread)</xsl:text>1131</xsl:if>1132</xsl:template>11331134<xsl:template match="jframeID" mode="traceInFormat">1135<xsl:param name="name"/>1136<xsl:text>depth=%d</xsl:text>1137</xsl:template>11381139<xsl:template match="jframeID" mode="traceInValue">1140<xsl:param name="name"/>1141<xsl:text>, </xsl:text>1142<xsl:value-of select="$name"/>1143</xsl:template>11441145<xsl:template match="jclass" mode="traceInValue">1146<!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->1147<xsl:if test="count(@method)=0">1148<xsl:text>,1149JvmtiTrace::get_class_name(k_mirror)</xsl:text>1150</xsl:if>1151</xsl:template>11521153<xsl:template match="jmethodID" mode="traceInFormat">1154<xsl:param name="name"/>1155<xsl:text> </xsl:text>1156<xsl:value-of select="$name"/>1157<xsl:text>=%s.%s</xsl:text>1158</xsl:template>11591160<xsl:template match="jmethodID" mode="traceInValue">1161<xsl:param name="name"/>1162<xsl:text>,1163method_oop == NULL? "NULL" : method_oop->klass_name()->as_C_string(),1164method_oop == NULL? "NULL" : method_oop->name()->as_C_string()1165</xsl:text>1166</xsl:template>11671168<xsl:template match="jfieldID" mode="traceInValue">1169<xsl:param name="name"/>1170<xsl:text>, fdesc.name()->as_C_string()</xsl:text>1171</xsl:template>11721173<xsl:template match="enum" mode="traceInFormat">1174<xsl:param name="name"/>1175<xsl:text> </xsl:text>1176<xsl:value-of select="$name"/>1177<xsl:text>=%d:%s</xsl:text>1178</xsl:template>11791180<xsl:template match="enum" mode="traceInValue">1181<xsl:param name="name"/>1182<xsl:text>, </xsl:text>1183<xsl:value-of select="$name"/>1184<xsl:text>,1185</xsl:text>1186<xsl:choose>1187<xsl:when test=".='jvmtiError'">1188<xsl:text>JvmtiUtil::error_name(</xsl:text>1189<xsl:value-of select="$name"/>1190<xsl:text>)1191</xsl:text>1192</xsl:when>1193<xsl:otherwise>1194<xsl:choose>1195<xsl:when test=".='jvmtiEvent'">1196<xsl:text>JvmtiTrace::event_name(</xsl:text>1197<xsl:value-of select="$name"/>1198<xsl:text>)1199</xsl:text>1200</xsl:when>1201<xsl:otherwise>1202<xsl:text>JvmtiTrace::enum_name(</xsl:text>1203<xsl:value-of select="."/>1204<xsl:text>ConstantNames, </xsl:text>1205<xsl:value-of select="."/>1206<xsl:text>ConstantValues, </xsl:text>1207<xsl:value-of select="$name"/>1208<xsl:text>)</xsl:text>1209</xsl:otherwise>1210</xsl:choose>1211</xsl:otherwise>1212</xsl:choose>1213</xsl:template>12141215<xsl:template match="jint|jlocation" mode="traceInFormat">1216<xsl:param name="name"/>1217<xsl:text> </xsl:text>1218<xsl:value-of select="$name"/>1219<xsl:text>=%d</xsl:text>1220</xsl:template>12211222<xsl:template match="jlong" mode="traceInFormat">1223<xsl:param name="name"/>1224<xsl:text> </xsl:text>1225<xsl:value-of select="$name"/>1226<xsl:text>=%ld</xsl:text>1227</xsl:template>12281229<xsl:template match="size_t" mode="traceInFormat">1230<xsl:param name="name"/>1231<xsl:text> </xsl:text>1232<xsl:value-of select="$name"/>1233<xsl:text>=0x%zx</xsl:text>1234</xsl:template>12351236<xsl:template match="jfloat|jdouble" mode="traceInFormat">1237<xsl:param name="name"/>1238<xsl:text> </xsl:text>1239<xsl:value-of select="$name"/>1240<xsl:text>=%f</xsl:text>1241</xsl:template>12421243<xsl:template match="char" mode="traceInFormat">1244<xsl:param name="name"/>1245<xsl:text> </xsl:text>1246<xsl:value-of select="$name"/>1247<xsl:text>=%c</xsl:text>1248</xsl:template>12491250<xsl:template match="uchar|jchar" mode="traceInFormat">1251<xsl:param name="name"/>1252<xsl:text> </xsl:text>1253<xsl:value-of select="$name"/>1254<xsl:text>=0x%x</xsl:text>1255</xsl:template>12561257<xsl:template match="jint|jlocation|jchar|jlong|jfloat|jdouble|char|uchar|size_t" mode="traceInValue">1258<xsl:param name="name"/>1259<xsl:text>, </xsl:text>1260<xsl:value-of select="$name"/>1261</xsl:template>126212631264<xsl:template match="jboolean" mode="traceInFormat">1265<xsl:param name="name"/>1266<xsl:text> </xsl:text>1267<xsl:value-of select="$name"/>1268<xsl:text>=%s</xsl:text>1269</xsl:template>12701271<xsl:template match="jboolean" mode="traceInValue">1272<xsl:param name="name"/>1273<xsl:text>, </xsl:text>1274<xsl:value-of select="$name"/>1275<xsl:text>? "true" : "false"</xsl:text>1276</xsl:template>12771278<xsl:template match="jobject|jvalue|jthreadGroup|void|struct" mode="traceInFormat">1279</xsl:template>12801281<xsl:template match="jobject|jvalue|jthreadGroup|void|struct" mode="traceInValue">1282</xsl:template>1283128412851286</xsl:stylesheet>128712881289