src/share/vm/prims/jvmtiEnter.xsl

Wed, 08 Oct 2008 08:10:51 -0700

author
ksrini
date
Wed, 08 Oct 2008 08:10:51 -0700
changeset 823
f008d3631bd1
parent 435
a61af66fc99e
child 1577
4ce7240d622c
permissions
-rw-r--r--

6755845: JVM_FindClassFromBoot triggers assertions
Summary: Fixes assertions caused by one jvm_entry calling another, solved by refactoring code and modified gamma test.
Reviewed-by: dholmes, xlu

duke@435 1 <?xml version="1.0"?>
duke@435 2 <!--
duke@435 3 Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved.
duke@435 4 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 5
duke@435 6 This code is free software; you can redistribute it and/or modify it
duke@435 7 under the terms of the GNU General Public License version 2 only, as
duke@435 8 published by the Free Software Foundation.
duke@435 9
duke@435 10 This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 13 version 2 for more details (a copy is included in the LICENSE file that
duke@435 14 accompanied this code).
duke@435 15
duke@435 16 You should have received a copy of the GNU General Public License version
duke@435 17 2 along with this work; if not, write to the Free Software Foundation,
duke@435 18 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 19
duke@435 20 Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@435 21 CA 95054 USA or visit www.sun.com if you need additional information or
duke@435 22 have any questions.
duke@435 23
duke@435 24 -->
duke@435 25
duke@435 26 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
duke@435 27
duke@435 28 <xsl:import href="jvmtiLib.xsl"/>
duke@435 29
duke@435 30 <xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
duke@435 31
duke@435 32 <xsl:param name="trace"></xsl:param>
duke@435 33 <xsl:param name="interface"></xsl:param>
duke@435 34
duke@435 35
duke@435 36 <xsl:template match="specification">
duke@435 37 <xsl:call-template name="sourceHeader"/>
duke@435 38 <xsl:text>
duke@435 39 # include "incls/_precompiled.incl"
duke@435 40 # include "incls/_jvmtiEnter.cpp.incl"
duke@435 41
duke@435 42 </xsl:text>
duke@435 43
duke@435 44 <xsl:if test="$trace = 'Trace'">
duke@435 45 <xsl:text>
duke@435 46 #ifdef JVMTI_TRACE
duke@435 47 </xsl:text>
duke@435 48 </xsl:if>
duke@435 49
duke@435 50 <xsl:if test="$trace != 'Trace'">
duke@435 51 <xsl:text>
duke@435 52
duke@435 53 // Error names
duke@435 54 const char* JvmtiUtil::_error_names[] = {
duke@435 55 </xsl:text>
duke@435 56 <xsl:call-template name="fillEntityName">
duke@435 57 <xsl:with-param name="entities" select="errorsection/errorcategory/errorid"/>
duke@435 58 </xsl:call-template>
duke@435 59 <xsl:text>
duke@435 60 };
duke@435 61
duke@435 62
duke@435 63 // Event threaded
duke@435 64 const bool JvmtiUtil::_event_threaded[] = {
duke@435 65 </xsl:text>
duke@435 66 <xsl:call-template name="fillEventThreaded">
duke@435 67 <xsl:with-param name="entities" select="eventsection/event"/>
duke@435 68 </xsl:call-template>
duke@435 69 <xsl:text>
duke@435 70 };
duke@435 71
duke@435 72 </xsl:text>
duke@435 73 <xsl:call-template name="eventCapabilitiesTest"/>
duke@435 74 </xsl:if>
duke@435 75
duke@435 76 <xsl:if test="$trace = 'Trace'">
duke@435 77
duke@435 78 <!-- all this just to return the highest event number -->
duke@435 79 <xsl:variable name="maxEvent">
duke@435 80 <xsl:for-each select="eventsection/event">
duke@435 81 <xsl:variable name="mynum" select="@num"/>
duke@435 82 <xsl:if test="count(../../eventsection/event[@num &gt; $mynum]) = 0">
duke@435 83 <xsl:value-of select="@num"/>
duke@435 84 </xsl:if>
duke@435 85 </xsl:for-each>
duke@435 86 </xsl:variable>
duke@435 87
duke@435 88 <xsl:text>jbyte JvmtiTrace::_event_trace_flags[</xsl:text>
duke@435 89 <xsl:value-of select="1+$maxEvent"/>
duke@435 90 <xsl:text>];
duke@435 91
duke@435 92 jint JvmtiTrace::_max_event_index = </xsl:text>
duke@435 93 <xsl:value-of select="$maxEvent"/>
duke@435 94 <xsl:text>;
duke@435 95
duke@435 96 // Event names
duke@435 97 const char* JvmtiTrace::_event_names[] = {
duke@435 98 </xsl:text>
duke@435 99 <xsl:call-template name="fillEntityName">
duke@435 100 <xsl:with-param name="entities" select="eventsection/event"/>
duke@435 101 </xsl:call-template>
duke@435 102 <xsl:text>
duke@435 103 };
duke@435 104 </xsl:text>
duke@435 105 <xsl:apply-templates select="//constants[@kind='enum']"/>
duke@435 106 </xsl:if>
duke@435 107 <xsl:apply-templates select="functionsection"/>
duke@435 108
duke@435 109 <xsl:if test="$trace='Trace'">
duke@435 110 <xsl:text>
duke@435 111 #endif /*JVMTI_TRACE */
duke@435 112 </xsl:text>
duke@435 113 </xsl:if>
duke@435 114
duke@435 115 </xsl:template>
duke@435 116
duke@435 117 <xsl:template match="constants">
duke@435 118 <xsl:text>
duke@435 119
duke@435 120 // </xsl:text>
duke@435 121 <xsl:value-of select="@label"/>
duke@435 122 <xsl:text> names
duke@435 123 const char* </xsl:text>
duke@435 124 <xsl:value-of select="@id"/>
duke@435 125 <xsl:text>ConstantNames[] = {
duke@435 126 </xsl:text>
duke@435 127 <xsl:apply-templates select="constant" mode="constname"/>
duke@435 128 <xsl:text> NULL
duke@435 129 };
duke@435 130
duke@435 131 // </xsl:text>
duke@435 132 <xsl:value-of select="@label"/>
duke@435 133 <xsl:text> value
duke@435 134 jint </xsl:text>
duke@435 135 <xsl:value-of select="@id"/>
duke@435 136 <xsl:text>ConstantValues[] = {
duke@435 137 </xsl:text>
duke@435 138 <xsl:apply-templates select="constant" mode="constvalue"/>
duke@435 139 <xsl:text> 0
duke@435 140 };
duke@435 141
duke@435 142 </xsl:text>
duke@435 143 </xsl:template>
duke@435 144
duke@435 145 <xsl:template match="constant" mode="constname">
duke@435 146 <xsl:text> "</xsl:text>
duke@435 147 <xsl:value-of select="@id"/>
duke@435 148 <xsl:text>",
duke@435 149 </xsl:text>
duke@435 150 </xsl:template>
duke@435 151
duke@435 152 <xsl:template match="constant" mode="constvalue">
duke@435 153 <xsl:text> </xsl:text>
duke@435 154 <xsl:value-of select="@num"/>
duke@435 155 <xsl:text>,
duke@435 156 </xsl:text>
duke@435 157 </xsl:template>
duke@435 158
duke@435 159 <xsl:template name="eventCapabilitiesTest">
duke@435 160 <xsl:text>
duke@435 161
duke@435 162 // Check Event Capabilities
duke@435 163 const bool JvmtiUtil::has_event_capability(jvmtiEvent event_type, const jvmtiCapabilities* capabilities_ptr) {
duke@435 164 switch (event_type) {
duke@435 165 </xsl:text>
duke@435 166 <xsl:for-each select="//eventsection/event">
duke@435 167 <xsl:variable name="capa" select="capabilities/required"/>
duke@435 168 <xsl:if test="count($capa)">
duke@435 169 <xsl:text> case </xsl:text>
duke@435 170 <xsl:value-of select="@const"/>
duke@435 171 <xsl:text>:
duke@435 172 return capabilities_ptr-&gt;</xsl:text>
duke@435 173 <xsl:value-of select="$capa/@id"/>
duke@435 174 <xsl:text> != 0;
duke@435 175 </xsl:text>
duke@435 176 </xsl:if>
duke@435 177 </xsl:for-each>
duke@435 178 <xsl:text> }
duke@435 179 // if it does not have a capability it is required
duke@435 180 return JNI_TRUE;
duke@435 181 }
duke@435 182
duke@435 183 </xsl:text>
duke@435 184 </xsl:template>
duke@435 185
duke@435 186 <xsl:template match="functionsection">
duke@435 187 <xsl:if test="$trace='Trace'">
duke@435 188
duke@435 189 <!-- all this just to return the highest function number -->
duke@435 190 <xsl:variable name="maxFunction">
duke@435 191 <xsl:for-each select="category/function">
duke@435 192 <xsl:variable name="mynum" select="@num"/>
duke@435 193 <xsl:if test="count(../../category/function[@num &gt; $mynum]) = 0">
duke@435 194 <xsl:value-of select="@num"/>
duke@435 195 </xsl:if>
duke@435 196 </xsl:for-each>
duke@435 197 </xsl:variable>
duke@435 198
duke@435 199 <xsl:text>jbyte JvmtiTrace::_trace_flags[</xsl:text>
duke@435 200 <xsl:value-of select="1+$maxFunction"/>
duke@435 201 <xsl:text>];
duke@435 202
duke@435 203 jint JvmtiTrace::_max_function_index = </xsl:text>
duke@435 204 <xsl:value-of select="$maxFunction"/>
duke@435 205 <xsl:text>;
duke@435 206
duke@435 207 // Function names
duke@435 208 const char* JvmtiTrace::_function_names[] = {
duke@435 209 </xsl:text>
duke@435 210 <xsl:call-template name="fillEntityName">
duke@435 211 <xsl:with-param name="entities" select="category/function"/>
duke@435 212 </xsl:call-template>
duke@435 213 <xsl:text>
duke@435 214 };
duke@435 215
duke@435 216 // Exclude list
duke@435 217 short JvmtiTrace::_exclude_functions[] = {
duke@435 218 </xsl:text>
duke@435 219 <xsl:apply-templates select="category/function" mode="notrace">
duke@435 220 <xsl:sort select="@num"/>
duke@435 221 </xsl:apply-templates>
duke@435 222 <xsl:text>0
duke@435 223 };
duke@435 224
duke@435 225 </xsl:text>
duke@435 226 </xsl:if>
duke@435 227
duke@435 228 <xsl:text>
duke@435 229 extern "C" {
duke@435 230
duke@435 231 </xsl:text>
duke@435 232 <xsl:apply-templates select="category" mode="wrapper"/>
duke@435 233 <xsl:text>
duke@435 234 } /* end extern "C" */
duke@435 235
duke@435 236 // JVMTI API functions
duke@435 237 struct jvmtiInterface_1_ jvmti</xsl:text>
duke@435 238 <xsl:value-of select="$trace"/>
duke@435 239 <xsl:text>_Interface = {
duke@435 240 </xsl:text>
duke@435 241
duke@435 242 <xsl:call-template name="fillFuncStruct">
duke@435 243 <xsl:with-param name="funcs" select="category/function[count(@hide)=0]"/>
duke@435 244 </xsl:call-template>
duke@435 245
duke@435 246 <xsl:text>
duke@435 247 };
duke@435 248 </xsl:text>
duke@435 249 </xsl:template>
duke@435 250
duke@435 251 <xsl:template match="function" mode="functionid">
duke@435 252 <xsl:text>jvmti</xsl:text>
duke@435 253 <xsl:value-of select="$trace"/>
duke@435 254 <xsl:text>_</xsl:text>
duke@435 255 <xsl:value-of select="@id"/>
duke@435 256 </xsl:template>
duke@435 257
duke@435 258 <xsl:template name="fillFuncStructDoit">
duke@435 259 <xsl:param name="func"/>
duke@435 260 <xsl:param name="index"/>
duke@435 261 <xsl:text> /* </xsl:text>
duke@435 262 <xsl:number value="$index" format=" 1"/>
duke@435 263 <xsl:text> : </xsl:text>
duke@435 264 <xsl:choose>
duke@435 265 <xsl:when test="count($func)=1">
duke@435 266 <xsl:value-of select="$func/synopsis"/>
duke@435 267 <xsl:text> */
duke@435 268 </xsl:text>
duke@435 269 <xsl:apply-templates select="$func" mode="functionid"/>
duke@435 270 </xsl:when>
duke@435 271 <xsl:otherwise>
duke@435 272 <xsl:text> RESERVED */
duke@435 273 NULL</xsl:text>
duke@435 274 </xsl:otherwise>
duke@435 275 </xsl:choose>
duke@435 276 </xsl:template>
duke@435 277
duke@435 278 <!-- generic function iterator applied to the function structure -->
duke@435 279 <xsl:template name="fillFuncStruct">
duke@435 280 <xsl:param name="funcs"/>
duke@435 281 <xsl:param name="index" select="1"/>
duke@435 282 <xsl:call-template name="fillFuncStructDoit">
duke@435 283 <xsl:with-param name="func" select="$funcs[@num=$index]"/>
duke@435 284 <xsl:with-param name="index" select="$index"/>
duke@435 285 </xsl:call-template>
duke@435 286 <xsl:if test="count($funcs[@num &gt; $index]) &gt; 0">
duke@435 287 <xsl:text>,
duke@435 288 </xsl:text>
duke@435 289 <xsl:call-template name="fillFuncStruct">
duke@435 290 <xsl:with-param name="funcs" select="$funcs"/>
duke@435 291 <xsl:with-param name="index" select="1+$index"/>
duke@435 292 </xsl:call-template>
duke@435 293 </xsl:if>
duke@435 294 </xsl:template>
duke@435 295
duke@435 296 <xsl:template name="fillEntityNameDoit">
duke@435 297 <xsl:param name="entity"/>
duke@435 298 <xsl:param name="index"/>
duke@435 299 <xsl:choose>
duke@435 300 <xsl:when test="count($entity) &gt; 0">
duke@435 301 <xsl:text> "</xsl:text>
duke@435 302 <xsl:value-of select="$entity[position()=1]/@id"/>
duke@435 303 <xsl:text>"</xsl:text>
duke@435 304 </xsl:when>
duke@435 305 <xsl:otherwise>
duke@435 306 <xsl:text> NULL</xsl:text>
duke@435 307 </xsl:otherwise>
duke@435 308 </xsl:choose>
duke@435 309 </xsl:template>
duke@435 310
duke@435 311 <!-- generic entity (with id and num) iterator applied to entity names -->
duke@435 312 <xsl:template name="fillEntityName">
duke@435 313 <xsl:param name="entities"/>
duke@435 314 <xsl:param name="index" select="0"/>
duke@435 315 <xsl:call-template name="fillEntityNameDoit">
duke@435 316 <xsl:with-param name="entity" select="$entities[@num=$index]"/>
duke@435 317 <xsl:with-param name="index" select="$index"/>
duke@435 318 </xsl:call-template>
duke@435 319 <xsl:if test="count($entities[@num &gt; $index]) &gt; 0">
duke@435 320 <xsl:text>,
duke@435 321 </xsl:text>
duke@435 322 <xsl:call-template name="fillEntityName">
duke@435 323 <xsl:with-param name="entities" select="$entities"/>
duke@435 324 <xsl:with-param name="index" select="1+$index"/>
duke@435 325 </xsl:call-template>
duke@435 326 </xsl:if>
duke@435 327 </xsl:template>
duke@435 328
duke@435 329 <xsl:template name="fillEventThreadedDoit">
duke@435 330 <xsl:param name="entity"/>
duke@435 331 <xsl:param name="index"/>
duke@435 332 <xsl:choose>
duke@435 333 <xsl:when test="count($entity) &gt; 0">
duke@435 334 <xsl:choose>
duke@435 335 <xsl:when test="count($entity[position()=1]/@filtered)=0">
duke@435 336 <xsl:text> false</xsl:text>
duke@435 337 </xsl:when>
duke@435 338 <xsl:otherwise>
duke@435 339 <xsl:text> true</xsl:text>
duke@435 340 </xsl:otherwise>
duke@435 341 </xsl:choose>
duke@435 342 </xsl:when>
duke@435 343 <xsl:otherwise>
duke@435 344 <xsl:text> false</xsl:text>
duke@435 345 </xsl:otherwise>
duke@435 346 </xsl:choose>
duke@435 347 </xsl:template>
duke@435 348
duke@435 349
duke@435 350 <xsl:template name="fillEventThreaded">
duke@435 351 <xsl:param name="entities"/>
duke@435 352 <xsl:param name="index" select="0"/>
duke@435 353 <xsl:call-template name="fillEventThreadedDoit">
duke@435 354 <xsl:with-param name="entity" select="$entities[@num=$index]"/>
duke@435 355 <xsl:with-param name="index" select="$index"/>
duke@435 356 </xsl:call-template>
duke@435 357 <xsl:if test="count($entities[@num &gt; $index]) &gt; 0">
duke@435 358 <xsl:text>,
duke@435 359 </xsl:text>
duke@435 360 <xsl:call-template name="fillEventThreaded">
duke@435 361 <xsl:with-param name="entities" select="$entities"/>
duke@435 362 <xsl:with-param name="index" select="1+$index"/>
duke@435 363 </xsl:call-template>
duke@435 364 </xsl:if>
duke@435 365 </xsl:template>
duke@435 366
duke@435 367 <xsl:template match="function" mode="notrace">
duke@435 368 <xsl:if test="count(@impl)=1 and contains(@impl,'notrace')">
duke@435 369 <xsl:value-of select="@num"/>
duke@435 370 <xsl:text>,
duke@435 371 </xsl:text>
duke@435 372 </xsl:if>
duke@435 373 </xsl:template>
duke@435 374
duke@435 375 <xsl:template match="category" mode="wrapper">
duke@435 376 <xsl:text>
duke@435 377 //
duke@435 378 // </xsl:text><xsl:value-of select="@label"/><xsl:text> functions
duke@435 379 //
duke@435 380 </xsl:text>
duke@435 381 <xsl:apply-templates select="function[count(@hide)=0]"/>
duke@435 382 </xsl:template>
duke@435 383
duke@435 384 <xsl:template match="function" mode="transition">
duke@435 385 <xsl:param name="space">
duke@435 386 <xsl:text>
duke@435 387 </xsl:text>
duke@435 388 </xsl:param>
duke@435 389 <xsl:value-of select="$space"/>
duke@435 390
duke@435 391 <xsl:choose>
duke@435 392 <xsl:when test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">
duke@435 393 <xsl:text>if (this_thread == NULL || !this_thread->is_Java_thread()) {</xsl:text>
duke@435 394 </xsl:when>
duke@435 395 <xsl:otherwise>
duke@435 396 <xsl:choose>
duke@435 397 <xsl:when test="count(@phase)=0 or contains(@phase,'live') or contains(@phase,'start')">
duke@435 398 <xsl:text>if (this_thread == NULL || (!this_thread->is_Java_thread() &amp;&amp; !this_thread->is_VM_thread())) {</xsl:text>
duke@435 399 </xsl:when>
duke@435 400 <xsl:otherwise>
duke@435 401 <xsl:text>if (!this_thread->is_Java_thread()) {</xsl:text>
duke@435 402 </xsl:otherwise>
duke@435 403 </xsl:choose>
duke@435 404 </xsl:otherwise>
duke@435 405 </xsl:choose>
duke@435 406
duke@435 407 <xsl:if test="$trace='Trace'">
duke@435 408 <xsl:value-of select="$space"/>
duke@435 409 <xsl:text> if (trace_flags) {</xsl:text>
duke@435 410 <xsl:value-of select="$space"/>
duke@435 411 <xsl:text> tty->print_cr("JVMTI [non-attached thread] %s %s", func_name,</xsl:text>
duke@435 412 <xsl:value-of select="$space"/>
duke@435 413 <xsl:text> JvmtiUtil::error_name(JVMTI_ERROR_UNATTACHED_THREAD));</xsl:text>
duke@435 414 <xsl:value-of select="$space"/>
duke@435 415 <xsl:text> }</xsl:text>
duke@435 416 </xsl:if>
duke@435 417 <xsl:value-of select="$space"/>
duke@435 418 <xsl:text> return JVMTI_ERROR_UNATTACHED_THREAD;</xsl:text>
duke@435 419 <xsl:value-of select="$space"/>
duke@435 420 <xsl:text>}</xsl:text>
duke@435 421 <xsl:value-of select="$space"/>
duke@435 422 <xsl:if test="count(@impl)=0 or not(contains(@impl,'innative'))">
duke@435 423 <xsl:text>JavaThread* current_thread = (JavaThread*)this_thread;</xsl:text>
duke@435 424 <xsl:value-of select="$space"/>
duke@435 425 <xsl:text>ThreadInVMfromNative __tiv(current_thread);</xsl:text>
duke@435 426 <xsl:value-of select="$space"/>
duke@435 427 <xsl:text>__ENTRY(jvmtiError, </xsl:text>
duke@435 428 <xsl:apply-templates select="." mode="functionid"/>
duke@435 429 <xsl:text> , current_thread)</xsl:text>
duke@435 430 <xsl:value-of select="$space"/>
duke@435 431 <xsl:text>debug_only(VMNativeEntryWrapper __vew;)</xsl:text>
duke@435 432 <xsl:if test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">
duke@435 433 <xsl:value-of select="$space"/>
duke@435 434 <xsl:text>CautiouslyPreserveExceptionMark __em(this_thread);</xsl:text>
duke@435 435 </xsl:if>
duke@435 436 </xsl:if>
duke@435 437 </xsl:template>
duke@435 438
duke@435 439
duke@435 440 <xsl:template match="required">
duke@435 441 <xsl:text>
duke@435 442 if (jvmti_env-&gt;get_capabilities()-&gt;</xsl:text>
duke@435 443 <xsl:value-of select="@id"/>
duke@435 444 <xsl:text> == 0) {
duke@435 445 </xsl:text>
duke@435 446 <xsl:if test="$trace='Trace'">
duke@435 447 <xsl:text> if (trace_flags) {
duke@435 448 tty->print_cr("JVMTI [%s] %s %s", curr_thread_name, func_name,
duke@435 449 JvmtiUtil::error_name(JVMTI_ERROR_MUST_POSSESS_CAPABILITY));
duke@435 450 }
duke@435 451 </xsl:text>
duke@435 452 </xsl:if>
duke@435 453 <xsl:text> return JVMTI_ERROR_MUST_POSSESS_CAPABILITY;
duke@435 454 }
duke@435 455 </xsl:text>
duke@435 456 </xsl:template>
duke@435 457
duke@435 458
duke@435 459 <xsl:template match="function">
duke@435 460 <xsl:text>
duke@435 461 static jvmtiError JNICALL
duke@435 462 </xsl:text>
duke@435 463 <xsl:apply-templates select="." mode="functionid"/>
duke@435 464 <xsl:text>(jvmtiEnv* env</xsl:text>
duke@435 465 <xsl:apply-templates select="parameters" mode="signature"/>
duke@435 466 <xsl:text>) {
duke@435 467 </xsl:text>
duke@435 468
duke@435 469 <xsl:if test="not(contains(@jkernel,'yes'))">
duke@435 470 <xsl:text>&#xA;#ifdef JVMTI_KERNEL &#xA;</xsl:text>
duke@435 471 <xsl:text> return JVMTI_ERROR_NOT_AVAILABLE; &#xA;</xsl:text>
duke@435 472 <xsl:text>#else &#xA;</xsl:text>
duke@435 473 </xsl:if>
duke@435 474
duke@435 475 <xsl:apply-templates select="." mode="traceSetUp"/>
duke@435 476 <xsl:choose>
duke@435 477 <xsl:when test="count(@phase)=0 or contains(@phase,'live')">
duke@435 478 <xsl:text> if(!JvmtiEnv::is_vm_live()) {
duke@435 479 </xsl:text>
duke@435 480 <xsl:if test="$trace='Trace'">
duke@435 481 <xsl:text> if (trace_flags) {
duke@435 482 tty->print_cr("JVMTI [-] %s %s", func_name,
duke@435 483 JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));
duke@435 484 }
duke@435 485 </xsl:text>
duke@435 486 </xsl:if>
duke@435 487 <xsl:text> return JVMTI_ERROR_WRONG_PHASE;
duke@435 488 }</xsl:text>
duke@435 489
duke@435 490 <xsl:text>
duke@435 491 Thread* this_thread = (Thread*)ThreadLocalStorage::thread(); </xsl:text>
duke@435 492
duke@435 493 <xsl:apply-templates select="." mode="transition"/>
duke@435 494 </xsl:when>
duke@435 495 <xsl:otherwise>
duke@435 496 <xsl:if test="contains(@phase,'onload')">
duke@435 497 <xsl:text> if(JvmtiEnv::get_phase()!=JVMTI_PHASE_ONLOAD</xsl:text>
duke@435 498 <xsl:if test="not(contains(@phase,'onloadOnly'))">
duke@435 499 <xsl:text> &amp;&amp; JvmtiEnv::get_phase()!=JVMTI_PHASE_LIVE</xsl:text>
duke@435 500 </xsl:if>
duke@435 501 <xsl:text>) {
duke@435 502 </xsl:text>
duke@435 503 <xsl:if test="$trace='Trace'">
duke@435 504 <xsl:text> if (trace_flags) {
duke@435 505 tty->print_cr("JVMTI [-] %s %s", func_name,
duke@435 506 JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));
duke@435 507 }
duke@435 508 </xsl:text>
duke@435 509 </xsl:if>
duke@435 510 <xsl:text> return JVMTI_ERROR_WRONG_PHASE;
duke@435 511 }</xsl:text>
duke@435 512 </xsl:if>
duke@435 513 <xsl:if test="contains(@phase,'start')">
duke@435 514 <xsl:text> if(JvmtiEnv::get_phase()!=JVMTI_PHASE_START &amp;&amp; JvmtiEnv::get_phase()!=JVMTI_PHASE_LIVE) {
duke@435 515 </xsl:text>
duke@435 516 <xsl:if test="$trace='Trace'">
duke@435 517 <xsl:text> if (trace_flags) {
duke@435 518 tty->print_cr("JVMTI [-] %s %s", func_name,
duke@435 519 JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));
duke@435 520 }
duke@435 521 </xsl:text>
duke@435 522 </xsl:if>
duke@435 523 <xsl:text> return JVMTI_ERROR_WRONG_PHASE;
duke@435 524 }
duke@435 525 Thread* this_thread = (Thread*)ThreadLocalStorage::thread(); </xsl:text>
duke@435 526 <xsl:apply-templates select="." mode="transition"/>
duke@435 527 </xsl:if>
duke@435 528 </xsl:otherwise>
duke@435 529 </xsl:choose>
duke@435 530
duke@435 531 <xsl:text>
duke@435 532 JvmtiEnv* jvmti_env = JvmtiEnv::JvmtiEnv_from_jvmti_env(env);
duke@435 533 if (!jvmti_env->is_valid()) {
duke@435 534 </xsl:text>
duke@435 535 <xsl:if test="$trace='Trace'">
duke@435 536 <xsl:text> if (trace_flags) {
duke@435 537 tty->print_cr("JVMTI [%s] %s %s env=%d", curr_thread_name, func_name,
duke@435 538 JvmtiUtil::error_name(JVMTI_ERROR_INVALID_ENVIRONMENT), env);
duke@435 539 }
duke@435 540 </xsl:text>
duke@435 541 </xsl:if>
duke@435 542 <xsl:text> return JVMTI_ERROR_INVALID_ENVIRONMENT;
duke@435 543 }
duke@435 544 </xsl:text>
duke@435 545
duke@435 546 <xsl:apply-templates select="capabilities/required"/>
duke@435 547
duke@435 548 <xsl:text> jvmtiError err;
duke@435 549 </xsl:text>
duke@435 550 <xsl:choose>
duke@435 551 <xsl:when test="count(@phase)=1 and not(contains(@phase,'live')) and not(contains(@phase,'start'))">
duke@435 552 <xsl:choose>
duke@435 553 <xsl:when test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">
duke@435 554 <xsl:text> if (Threads::number_of_threads() != 0) {
duke@435 555 Thread* this_thread = (Thread*)ThreadLocalStorage::thread();</xsl:text>
duke@435 556 </xsl:when>
duke@435 557 <xsl:otherwise>
duke@435 558
duke@435 559 <xsl:text> Thread* this_thread = NULL;
duke@435 560 bool transition;
duke@435 561 if (Threads::number_of_threads() == 0) {
duke@435 562 transition = false;
duke@435 563 } else {
duke@435 564 this_thread = (Thread*)ThreadLocalStorage::thread();
duke@435 565 transition = ((this_thread != NULL) &amp;&amp; !this_thread->is_VM_thread() &amp;&amp; !this_thread->is_ConcurrentGC_thread());
duke@435 566 }
duke@435 567 if (transition) {</xsl:text>
duke@435 568 </xsl:otherwise>
duke@435 569
duke@435 570 </xsl:choose>
duke@435 571 <!-- we allow use in early phases but there are threads now, -->
duke@435 572 <!-- so do thread transition -->
duke@435 573 <xsl:apply-templates select="." mode="transition">
duke@435 574 <xsl:with-param name="space">
duke@435 575 <xsl:text>
duke@435 576 </xsl:text>
duke@435 577 </xsl:with-param>
duke@435 578 </xsl:apply-templates>
duke@435 579 <xsl:text>
duke@435 580 </xsl:text>
duke@435 581 <xsl:apply-templates select="." mode="doCall"/>
duke@435 582 <xsl:text> } else {
duke@435 583 </xsl:text>
duke@435 584 <!-- we are pre-thread - no thread transition code -->
duke@435 585 <xsl:apply-templates select="." mode="doCall"/>
duke@435 586 <xsl:text> }
duke@435 587 </xsl:text>
duke@435 588 </xsl:when>
duke@435 589 <xsl:otherwise>
duke@435 590 <xsl:apply-templates select="." mode="doCall"/>
duke@435 591 </xsl:otherwise>
duke@435 592 </xsl:choose>
duke@435 593 <xsl:text> return err;
duke@435 594 </xsl:text>
duke@435 595
duke@435 596 <xsl:if test="not(contains(@jkernel,'yes'))">
duke@435 597 <xsl:text>#endif // JVMTI_KERNEL&#xA;</xsl:text>
duke@435 598 </xsl:if>
duke@435 599
duke@435 600 <xsl:text>}&#xA;</xsl:text>
duke@435 601 </xsl:template>
duke@435 602
duke@435 603 <xsl:template match="function" mode="doCall">
duke@435 604 <xsl:apply-templates select="parameters" mode="dochecks"/>
duke@435 605 <xsl:apply-templates select="." mode="traceBefore"/>
duke@435 606 <xsl:apply-templates select="." mode="genCall"/>
duke@435 607 <xsl:apply-templates select="." mode="traceAfter"/>
duke@435 608 </xsl:template>
duke@435 609
duke@435 610 <xsl:template match="function" mode="genCall">
duke@435 611 <xsl:text> err = jvmti_env-&gt;</xsl:text>
duke@435 612 <xsl:value-of select="@id"/>
duke@435 613 <xsl:text>(</xsl:text>
duke@435 614 <xsl:apply-templates select="parameters" mode="HotSpotValue"/>
duke@435 615 <xsl:text>);
duke@435 616 </xsl:text>
duke@435 617 </xsl:template>
duke@435 618
duke@435 619
duke@435 620 <xsl:template match="function" mode="traceSetUp">
duke@435 621 <xsl:if test="$trace='Trace'">
duke@435 622 <xsl:text> SafeResourceMark rm;
duke@435 623 jint trace_flags = JvmtiTrace::trace_flags(</xsl:text>
duke@435 624 <xsl:value-of select="@num"/>
duke@435 625 <xsl:text>);
duke@435 626 const char *func_name;
duke@435 627 const char *curr_thread_name;
duke@435 628 if (trace_flags) {
duke@435 629 func_name = JvmtiTrace::function_name(</xsl:text>
duke@435 630 <xsl:value-of select="@num"/>
duke@435 631 <xsl:text>);
duke@435 632 curr_thread_name = JvmtiTrace::safe_get_current_thread_name();
duke@435 633 }
duke@435 634 </xsl:text>
duke@435 635 </xsl:if>
duke@435 636 </xsl:template>
duke@435 637
duke@435 638
duke@435 639 <xsl:template match="function" mode="traceBefore">
duke@435 640 <xsl:if test="$trace='Trace'">
duke@435 641 <xsl:text>
duke@435 642 if ((trace_flags &amp; JvmtiTrace::SHOW_IN) != 0) {
duke@435 643 </xsl:text>
duke@435 644 <xsl:apply-templates select="." mode="traceIn"/>
duke@435 645 <xsl:text> }
duke@435 646 </xsl:text>
duke@435 647 </xsl:if>
duke@435 648 </xsl:template>
duke@435 649
duke@435 650
duke@435 651 <xsl:template match="param" mode="traceError">
duke@435 652 <xsl:param name="err"/>
duke@435 653 <xsl:param name="comment"></xsl:param>
duke@435 654 <xsl:param name="extraValue"></xsl:param>
duke@435 655 <xsl:if test="$trace='Trace'">
duke@435 656 <xsl:text> if ((trace_flags &amp; JvmtiTrace::SHOW_ERROR) != 0) {
duke@435 657 if ((trace_flags &amp; JvmtiTrace::SHOW_IN) == 0) {
duke@435 658 </xsl:text>
duke@435 659 <xsl:apply-templates select="../.." mode="traceIn">
duke@435 660 <xsl:with-param name="endParam" select="."/>
duke@435 661 </xsl:apply-templates>
duke@435 662 <xsl:text> }
duke@435 663 tty->print_cr("JVMTI [%s] %s } %s - erroneous arg is </xsl:text>
duke@435 664 <xsl:value-of select="@id"/>
duke@435 665 <xsl:value-of select="$comment"/>
duke@435 666 <xsl:text>", curr_thread_name, func_name,
duke@435 667 JvmtiUtil::error_name(</xsl:text>
duke@435 668 <xsl:value-of select="$err"/>
duke@435 669 <xsl:text>)</xsl:text>
duke@435 670 <xsl:value-of select="$extraValue"/>
duke@435 671 <xsl:text>);
duke@435 672 }
duke@435 673 </xsl:text>
duke@435 674 </xsl:if>
duke@435 675 <xsl:text> return </xsl:text>
duke@435 676 <xsl:value-of select="$err"/>
duke@435 677 <xsl:text>;</xsl:text>
duke@435 678 </xsl:template>
duke@435 679
duke@435 680
duke@435 681 <xsl:template match="function" mode="traceAfter">
duke@435 682 <xsl:if test="$trace='Trace'">
duke@435 683 <xsl:text> if ( err != JVMTI_ERROR_NONE &amp;&amp; (trace_flags &amp; JvmtiTrace::SHOW_ERROR) != 0) {
duke@435 684 if ((trace_flags &amp; JvmtiTrace::SHOW_IN) == 0) {
duke@435 685 </xsl:text>
duke@435 686 <xsl:apply-templates select="." mode="traceIn"/>
duke@435 687 <xsl:text> }
duke@435 688 tty->print_cr("JVMTI [%s] %s } %s", curr_thread_name, func_name,
duke@435 689 JvmtiUtil::error_name(err));
duke@435 690 } else if ((trace_flags &amp; JvmtiTrace::SHOW_OUT) != 0) {
duke@435 691 tty->print_cr("JVMTI [%s] %s }", curr_thread_name, func_name);
duke@435 692 }
duke@435 693 </xsl:text>
duke@435 694 </xsl:if>
duke@435 695 </xsl:template>
duke@435 696
duke@435 697 <xsl:template match="function" mode="traceIn">
duke@435 698 <xsl:param name="endParam"></xsl:param>
duke@435 699 <xsl:text> tty->print_cr("JVMTI [%s] %s { </xsl:text>
duke@435 700 <xsl:apply-templates select="parameters" mode="traceInFormat">
duke@435 701 <xsl:with-param name="endParam" select="$endParam"/>
duke@435 702 </xsl:apply-templates>
duke@435 703 <xsl:text>", curr_thread_name, func_name</xsl:text>
duke@435 704 <xsl:apply-templates select="parameters" mode="traceInValue">
duke@435 705 <xsl:with-param name="endParam" select="$endParam"/>
duke@435 706 </xsl:apply-templates>
duke@435 707 <xsl:text>);
duke@435 708 </xsl:text>
duke@435 709 </xsl:template>
duke@435 710
duke@435 711 <xsl:template match="parameters" mode="dochecks">
duke@435 712 <xsl:apply-templates select="param" mode="dochecks"/>
duke@435 713 </xsl:template>
duke@435 714
duke@435 715 <xsl:template match="param" mode="dochecks">
duke@435 716 <xsl:apply-templates select="child::*[position()=1]" mode="dochecks">
duke@435 717 <xsl:with-param name="name" select="@id"/>
duke@435 718 </xsl:apply-templates>
duke@435 719 </xsl:template>
duke@435 720
duke@435 721 <xsl:template match="outptr|outbuf|allocfieldbuf|ptrtype|inptr|inbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="dochecks">
duke@435 722 <xsl:param name="name"/>
duke@435 723 <xsl:if test="count(nullok)=0">
duke@435 724 <xsl:text> if (</xsl:text>
duke@435 725 <xsl:value-of select="$name"/>
duke@435 726 <xsl:text> == NULL) {
duke@435 727 </xsl:text>
duke@435 728 <xsl:apply-templates select=".." mode="traceError">
duke@435 729 <xsl:with-param name="err">JVMTI_ERROR_NULL_POINTER</xsl:with-param>
duke@435 730 </xsl:apply-templates>
duke@435 731 <xsl:text>
duke@435 732 }
duke@435 733 </xsl:text>
duke@435 734 </xsl:if>
duke@435 735 </xsl:template>
duke@435 736
duke@435 737 <xsl:template match="jrawMonitorID" mode="dochecks">
duke@435 738 <xsl:param name="name"/>
duke@435 739 <xsl:text> JvmtiRawMonitor *rmonitor = (JvmtiRawMonitor *)</xsl:text>
duke@435 740 <xsl:value-of select="$name"/>
duke@435 741 <xsl:text>;
duke@435 742 if (rmonitor == NULL) {
duke@435 743 </xsl:text>
duke@435 744 <xsl:apply-templates select=".." mode="traceError">
duke@435 745 <xsl:with-param name="err">JVMTI_ERROR_INVALID_MONITOR</xsl:with-param>
duke@435 746 <xsl:with-param name="comment"> - raw monitor is NULL</xsl:with-param>
duke@435 747 </xsl:apply-templates>
duke@435 748 <xsl:text>
duke@435 749 }
duke@435 750 if (!rmonitor->is_valid()) {
duke@435 751 </xsl:text>
duke@435 752 <xsl:apply-templates select=".." mode="traceError">
duke@435 753 <xsl:with-param name="err">JVMTI_ERROR_INVALID_MONITOR</xsl:with-param>
duke@435 754 <xsl:with-param name="comment"> - not a raw monitor 0x%x</xsl:with-param>
duke@435 755 <xsl:with-param name="extraValue">, rmonitor</xsl:with-param>
duke@435 756 </xsl:apply-templates>
duke@435 757 <xsl:text>
duke@435 758 }
duke@435 759 </xsl:text>
duke@435 760 </xsl:template>
duke@435 761
duke@435 762 <xsl:template match="jthread" mode="dochecksbody">
duke@435 763 <xsl:param name="name"/>
duke@435 764 <xsl:text> oop thread_oop = JNIHandles::resolve_external_guard(</xsl:text>
duke@435 765 <xsl:value-of select="$name"/>
duke@435 766 <xsl:text>);
duke@435 767 if (thread_oop == NULL) {
duke@435 768 </xsl:text>
duke@435 769 <xsl:apply-templates select=".." mode="traceError">
duke@435 770 <xsl:with-param name="err">JVMTI_ERROR_INVALID_THREAD</xsl:with-param>
duke@435 771 <xsl:with-param name="comment"> - jthread resolved to NULL - jthread = %0x%x</xsl:with-param>
duke@435 772 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
duke@435 773 </xsl:apply-templates>
duke@435 774 <xsl:text>
duke@435 775 }
duke@435 776 if (!thread_oop-&gt;is_a(SystemDictionary::thread_klass())) {
duke@435 777 </xsl:text>
duke@435 778 <xsl:apply-templates select=".." mode="traceError">
duke@435 779 <xsl:with-param name="err">JVMTI_ERROR_INVALID_THREAD</xsl:with-param>
duke@435 780 <xsl:with-param name="comment"> - oop is not a thread - jthread = %0x%x</xsl:with-param>
duke@435 781 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
duke@435 782 </xsl:apply-templates>
duke@435 783 <xsl:text>
duke@435 784 }
duke@435 785 java_thread = java_lang_Thread::thread(thread_oop);
duke@435 786 if (java_thread == NULL) {
duke@435 787 </xsl:text>
duke@435 788 <xsl:apply-templates select=".." mode="traceError">
duke@435 789 <xsl:with-param name="err">
duke@435 790 <xsl:text>JVMTI_ERROR_THREAD_NOT_ALIVE</xsl:text>
duke@435 791 </xsl:with-param>
duke@435 792 <xsl:with-param name="comment"> - not a Java thread - jthread = %0x%x</xsl:with-param>
duke@435 793 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
duke@435 794 </xsl:apply-templates>
duke@435 795 <xsl:text>
duke@435 796 }
duke@435 797 </xsl:text>
duke@435 798 </xsl:template>
duke@435 799
duke@435 800 <xsl:template match="jthread" mode="dochecks">
duke@435 801 <xsl:param name="name"/>
duke@435 802 <!-- If we convert and test threads -->
duke@435 803 <xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">
duke@435 804 <xsl:text> JavaThread* java_thread;
duke@435 805 </xsl:text>
duke@435 806 <xsl:choose>
duke@435 807 <xsl:when test="count(@null)=0">
duke@435 808 <xsl:apply-templates select="." mode="dochecksbody">
duke@435 809 <xsl:with-param name="name" select="$name"/>
duke@435 810 </xsl:apply-templates>
duke@435 811 </xsl:when>
duke@435 812 <xsl:otherwise>
duke@435 813 <xsl:text> if (</xsl:text>
duke@435 814 <xsl:value-of select="$name"/>
duke@435 815 <xsl:text> == NULL) {
duke@435 816 java_thread = current_thread;
duke@435 817 } else {
duke@435 818 </xsl:text>
duke@435 819 <xsl:apply-templates select="." mode="dochecksbody">
duke@435 820 <xsl:with-param name="name" select="$name"/>
duke@435 821 </xsl:apply-templates>
duke@435 822 <xsl:text> }
duke@435 823 </xsl:text>
duke@435 824 </xsl:otherwise>
duke@435 825 </xsl:choose>
duke@435 826 </xsl:if>
duke@435 827 </xsl:template>
duke@435 828
duke@435 829 <xsl:template match="jframeID" mode="dochecks">
duke@435 830 <xsl:param name="name"/>
duke@435 831 <xsl:text>
duke@435 832 if (depth &lt; 0) {
duke@435 833 </xsl:text>
duke@435 834 <xsl:apply-templates select=".." mode="traceError">
duke@435 835 <xsl:with-param name="err">JVMTI_ERROR_ILLEGAL_ARGUMENT</xsl:with-param>
duke@435 836 <xsl:with-param name="comment"> - negative depth - jthread = %0x%x</xsl:with-param>
duke@435 837 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
duke@435 838 </xsl:apply-templates>
duke@435 839 <xsl:text>
duke@435 840 }
duke@435 841 </xsl:text>
duke@435 842 </xsl:template>
duke@435 843
duke@435 844 <xsl:template match="jclass" mode="dochecks">
duke@435 845 <xsl:param name="name"/>
duke@435 846 <!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->
duke@435 847 <xsl:if test="count(@method)=0">
duke@435 848 <xsl:text> oop k_mirror = JNIHandles::resolve_external_guard(</xsl:text>
duke@435 849 <xsl:value-of select="$name"/>
duke@435 850 <xsl:text>);
duke@435 851 if (k_mirror == NULL) {
duke@435 852 </xsl:text>
duke@435 853 <xsl:apply-templates select=".." mode="traceError">
duke@435 854 <xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>
duke@435 855 <xsl:with-param name="comment"> - resolved to NULL - jclass = 0x%x</xsl:with-param>
duke@435 856 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
duke@435 857 </xsl:apply-templates>
duke@435 858 <xsl:text>
duke@435 859 }
duke@435 860 if (!k_mirror->is_a(SystemDictionary::class_klass())) {
duke@435 861 </xsl:text>
duke@435 862 <xsl:apply-templates select=".." mode="traceError">
duke@435 863 <xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>
duke@435 864 <xsl:with-param name="comment"> - not a class - jclass = 0x%x</xsl:with-param>
duke@435 865 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
duke@435 866 </xsl:apply-templates>
duke@435 867 <xsl:text>
duke@435 868 }
duke@435 869 </xsl:text>
duke@435 870 <xsl:if test="count(@method|@field)=1">
duke@435 871 <xsl:text>
duke@435 872 if (java_lang_Class::is_primitive(k_mirror)) {
duke@435 873 </xsl:text>
duke@435 874 <xsl:apply-templates select=".." mode="traceError">
duke@435 875 <xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>
duke@435 876 <xsl:with-param name="comment"> - is a primitive class - jclass = 0x%x</xsl:with-param>
duke@435 877 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
duke@435 878 </xsl:apply-templates>
duke@435 879 <xsl:text>
duke@435 880 }
duke@435 881 klassOop k_oop = java_lang_Class::as_klassOop(k_mirror);
duke@435 882 if (k_oop == NULL) {
duke@435 883 </xsl:text>
duke@435 884 <xsl:apply-templates select=".." mode="traceError">
duke@435 885 <xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>
duke@435 886 <xsl:with-param name="comment"> - no klassOop - jclass = 0x%x</xsl:with-param>
duke@435 887 <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
duke@435 888 </xsl:apply-templates>
duke@435 889 <xsl:text>
duke@435 890 }
duke@435 891 </xsl:text>
duke@435 892 </xsl:if>
duke@435 893 </xsl:if>
duke@435 894 </xsl:template>
duke@435 895
duke@435 896
duke@435 897 <xsl:template match="jmethodID" mode="dochecks">
duke@435 898 <xsl:param name="name"/>
duke@435 899 <xsl:text> methodOop method_oop = JNIHandles::checked_resolve_jmethod_id(</xsl:text>
duke@435 900 <xsl:value-of select="$name"/>
duke@435 901 <xsl:text>);&#xA;</xsl:text>
duke@435 902 <xsl:text> if (method_oop == NULL) {&#xA;</xsl:text>
duke@435 903 <xsl:apply-templates select=".." mode="traceError">
duke@435 904 <xsl:with-param name="err">JVMTI_ERROR_INVALID_METHODID</xsl:with-param>
duke@435 905 <xsl:with-param name="comment"></xsl:with-param>
duke@435 906 <xsl:with-param name="extraValue"></xsl:with-param>
duke@435 907 </xsl:apply-templates>
duke@435 908 <xsl:text>&#xA;</xsl:text>
duke@435 909 <xsl:text> }&#xA;</xsl:text>
duke@435 910 <xsl:if test="count(@native)=1 and contains(@native,'error')">
duke@435 911 <xsl:text> if (method_oop->is_native()) {&#xA;</xsl:text>
duke@435 912 <xsl:text> return JVMTI_ERROR_NATIVE_METHOD;&#xA;</xsl:text>
duke@435 913 <xsl:text> }&#xA;</xsl:text>
duke@435 914 </xsl:if>
duke@435 915 </xsl:template>
duke@435 916
duke@435 917
duke@435 918 <xsl:template match="jfieldID" mode="dochecks">
duke@435 919 <xsl:param name="name"/>
duke@435 920 <xsl:text> ResourceMark rm_fdesc(current_thread);&#xA;</xsl:text>
duke@435 921 <xsl:text> fieldDescriptor fdesc;&#xA;</xsl:text>
duke@435 922 <xsl:text> if (!JvmtiEnv::get_field_descriptor(k_oop, </xsl:text>
duke@435 923 <xsl:value-of select="$name"/>
duke@435 924 <xsl:text>, &amp;fdesc)) {&#xA;</xsl:text>
duke@435 925 <xsl:apply-templates select=".." mode="traceError">
duke@435 926 <xsl:with-param name="err">JVMTI_ERROR_INVALID_FIELDID</xsl:with-param>
duke@435 927 </xsl:apply-templates>
duke@435 928 <xsl:text>&#xA;</xsl:text>
duke@435 929 <xsl:text> }&#xA;</xsl:text>
duke@435 930 </xsl:template>
duke@435 931
duke@435 932
duke@435 933 <xsl:template match="jint" mode="dochecks">
duke@435 934 <xsl:param name="name"/>
duke@435 935 <xsl:if test="count(@min)=1">
duke@435 936 <xsl:text> if (</xsl:text>
duke@435 937 <xsl:value-of select="$name"/>
duke@435 938 <xsl:text> &lt; </xsl:text>
duke@435 939 <xsl:value-of select="@min"/>
duke@435 940 <xsl:text>) {
duke@435 941 </xsl:text>
duke@435 942 <xsl:apply-templates select=".." mode="traceError">
duke@435 943 <xsl:with-param name="err">JVMTI_ERROR_ILLEGAL_ARGUMENT</xsl:with-param>
duke@435 944 </xsl:apply-templates>
duke@435 945 <xsl:text>
duke@435 946 }
duke@435 947 </xsl:text>
duke@435 948 </xsl:if>
duke@435 949 </xsl:template>
duke@435 950
duke@435 951 <xsl:template match="jobject|jvalue|jthreadGroup|enum|jchar|jlong|jfloat|jdouble|jlocation|jboolean|char|uchar|size_t|void|struct" mode="dochecks">
duke@435 952 </xsl:template>
duke@435 953
duke@435 954 <!-- iterate over parameters, stopping if specified is encountered -->
duke@435 955 <xsl:template name="traceInValueParamsUpTo">
duke@435 956 <xsl:param name="params"/>
duke@435 957 <xsl:param name="endParam"></xsl:param>
duke@435 958 <xsl:param name="index" select="1"/>
duke@435 959 <xsl:variable name="cParam" select="$params[position()=$index]"/>
duke@435 960 <xsl:if test="$cParam!=$endParam">
duke@435 961 <xsl:apply-templates select="$cParam" mode="traceInValue"/>
duke@435 962 <xsl:if test="count($params) &gt; $index">
duke@435 963 <xsl:call-template name="traceInValueParamsUpTo">
duke@435 964 <xsl:with-param name="params" select="$params"/>
duke@435 965 <xsl:with-param name="endParam" select="$endParam"/>
duke@435 966 <xsl:with-param name="index" select="1+$index"/>
duke@435 967 </xsl:call-template>
duke@435 968 </xsl:if>
duke@435 969 </xsl:if>
duke@435 970 </xsl:template>
duke@435 971
duke@435 972 <xsl:template name="traceInFormatParamsUpTo">
duke@435 973 <xsl:param name="params"/>
duke@435 974 <xsl:param name="endParam"></xsl:param>
duke@435 975 <xsl:param name="index" select="1"/>
duke@435 976 <xsl:variable name="cParam" select="$params[position()=$index]"/>
duke@435 977 <xsl:if test="$cParam!=$endParam">
duke@435 978 <xsl:apply-templates select="$cParam" mode="traceInFormat"/>
duke@435 979 <xsl:if test="count($params) &gt; $index">
duke@435 980 <xsl:call-template name="traceInFormatParamsUpTo">
duke@435 981 <xsl:with-param name="params" select="$params"/>
duke@435 982 <xsl:with-param name="endParam" select="$endParam"/>
duke@435 983 <xsl:with-param name="index" select="1+$index"/>
duke@435 984 </xsl:call-template>
duke@435 985 </xsl:if>
duke@435 986 </xsl:if>
duke@435 987 </xsl:template>
duke@435 988
duke@435 989 <xsl:template match="parameters" mode="traceInFormat">
duke@435 990 <xsl:param name="endParam"></xsl:param>
duke@435 991 <xsl:call-template name="traceInFormatParamsUpTo">
duke@435 992 <xsl:with-param name="params" select="param"/>
duke@435 993 <xsl:with-param name="endParam" select="$endParam"/>
duke@435 994 </xsl:call-template>
duke@435 995 </xsl:template>
duke@435 996
duke@435 997 <xsl:template match="parameters" mode="traceInValue">
duke@435 998 <xsl:param name="endParam"></xsl:param>
duke@435 999 <xsl:call-template name="traceInValueParamsUpTo">
duke@435 1000 <xsl:with-param name="params" select="param"/>
duke@435 1001 <xsl:with-param name="endParam" select="$endParam"/>
duke@435 1002 </xsl:call-template>
duke@435 1003 </xsl:template>
duke@435 1004
duke@435 1005 <xsl:template match="param" mode="traceInFormat">
duke@435 1006 <xsl:apply-templates select="child::*[position()=1]" mode="traceInFormat">
duke@435 1007 <xsl:with-param name="name" select="@id"/>
duke@435 1008 </xsl:apply-templates>
duke@435 1009 </xsl:template>
duke@435 1010
duke@435 1011 <xsl:template match="param" mode="traceInValue">
duke@435 1012 <xsl:apply-templates select="child::*[position()=1]" mode="traceInValue">
duke@435 1013 <xsl:with-param name="name" select="@id"/>
duke@435 1014 </xsl:apply-templates>
duke@435 1015 </xsl:template>
duke@435 1016
duke@435 1017 <xsl:template match="outptr|outbuf|allocfieldbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="traceInFormat">
duke@435 1018 </xsl:template>
duke@435 1019
duke@435 1020 <xsl:template match="outptr|outbuf|allocfieldbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="traceInValue">
duke@435 1021 </xsl:template>
duke@435 1022
duke@435 1023 <xsl:template match="inbuf" mode="traceInFormat">
duke@435 1024 <xsl:param name="name"/>
duke@435 1025 <xsl:text> </xsl:text>
duke@435 1026 <xsl:value-of select="$name"/>
duke@435 1027 <xsl:variable name="child" select="child::*[position()=1]"/>
duke@435 1028 <xsl:choose>
duke@435 1029 <xsl:when test="name($child)='char'">
duke@435 1030 <xsl:text>='%s'</xsl:text>
duke@435 1031 </xsl:when>
duke@435 1032 <xsl:otherwise>
duke@435 1033 <xsl:text>=0x%x</xsl:text>
duke@435 1034 </xsl:otherwise>
duke@435 1035 </xsl:choose>
duke@435 1036 </xsl:template>
duke@435 1037
duke@435 1038 <xsl:template match="inbuf" mode="traceInValue">
duke@435 1039 <xsl:param name="name"/>
duke@435 1040 <xsl:text>, </xsl:text>
duke@435 1041 <xsl:value-of select="$name"/>
duke@435 1042 </xsl:template>
duke@435 1043
duke@435 1044 <xsl:template match="ptrtype" mode="traceInFormat">
duke@435 1045 <xsl:param name="name"/>
duke@435 1046 <xsl:variable name="child" select="child::*[position()=1]"/>
duke@435 1047 <xsl:choose>
duke@435 1048 <xsl:when test="name($child)='jclass'">
duke@435 1049 <xsl:text> </xsl:text>
duke@435 1050 <xsl:value-of select="$name"/>
duke@435 1051 <xsl:text>=0x%x</xsl:text>
duke@435 1052 </xsl:when>
duke@435 1053 <xsl:otherwise>
duke@435 1054 <xsl:apply-templates select="$child" mode="traceInFormat"/>
duke@435 1055 </xsl:otherwise>
duke@435 1056 </xsl:choose>
duke@435 1057 </xsl:template>
duke@435 1058
duke@435 1059 <xsl:template match="ptrtype" mode="traceInValue">
duke@435 1060 <xsl:param name="name"/>
duke@435 1061 <xsl:variable name="child" select="child::*[position()=1]"/>
duke@435 1062 <xsl:choose>
duke@435 1063 <xsl:when test="name($child)='jclass'">
duke@435 1064 <xsl:text>, </xsl:text>
duke@435 1065 <xsl:value-of select="$name"/>
duke@435 1066 </xsl:when>
duke@435 1067 <xsl:otherwise>
duke@435 1068 <xsl:apply-templates select="$child" mode="traceInValue"/>
duke@435 1069 </xsl:otherwise>
duke@435 1070 </xsl:choose>
duke@435 1071 </xsl:template>
duke@435 1072
duke@435 1073 <xsl:template match="inptr" mode="traceInFormat">
duke@435 1074 <xsl:param name="name"/>
duke@435 1075 <xsl:text> </xsl:text>
duke@435 1076 <xsl:value-of select="$name"/>
duke@435 1077 <xsl:text>=0x%x</xsl:text>
duke@435 1078 </xsl:template>
duke@435 1079
duke@435 1080 <xsl:template match="inptr" mode="traceInValue">
duke@435 1081 <xsl:param name="name"/>
duke@435 1082 <xsl:text>, </xsl:text>
duke@435 1083 <xsl:value-of select="$name"/>
duke@435 1084 </xsl:template>
duke@435 1085
duke@435 1086 <xsl:template match="jrawMonitorID|jfieldID" mode="traceInFormat">
duke@435 1087 <xsl:param name="name"/>
duke@435 1088 <xsl:text> </xsl:text>
duke@435 1089 <xsl:value-of select="$name"/>
duke@435 1090 <xsl:text>=%s</xsl:text>
duke@435 1091 </xsl:template>
duke@435 1092
duke@435 1093 <xsl:template match="jclass" mode="traceInFormat">
duke@435 1094 <xsl:param name="name"/>
duke@435 1095 <!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->
duke@435 1096 <xsl:if test="count(@method)=0">
duke@435 1097 <xsl:text> </xsl:text>
duke@435 1098 <xsl:value-of select="$name"/>
duke@435 1099 <xsl:text>=%s</xsl:text>
duke@435 1100 </xsl:if>
duke@435 1101 </xsl:template>
duke@435 1102
duke@435 1103 <xsl:template match="jrawMonitorID" mode="traceInValue">
duke@435 1104 <xsl:param name="name"/>
duke@435 1105 <xsl:text>, rmonitor->get_name()</xsl:text>
duke@435 1106 </xsl:template>
duke@435 1107
duke@435 1108 <xsl:template match="jthread" mode="traceInFormat">
duke@435 1109 <xsl:param name="name"/>
duke@435 1110 <!-- If we convert and test threads -->
duke@435 1111 <xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">
duke@435 1112 <xsl:text> </xsl:text>
duke@435 1113 <xsl:value-of select="$name"/>
duke@435 1114 <xsl:text>=%s</xsl:text>
duke@435 1115 </xsl:if>
duke@435 1116 </xsl:template>
duke@435 1117
duke@435 1118 <xsl:template match="jthread" mode="traceInValue">
duke@435 1119 <xsl:param name="name"/>
duke@435 1120 <!-- If we convert and test threads -->
duke@435 1121 <xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">
duke@435 1122 <xsl:text>,
duke@435 1123 JvmtiTrace::safe_get_thread_name(java_thread)</xsl:text>
duke@435 1124 </xsl:if>
duke@435 1125 </xsl:template>
duke@435 1126
duke@435 1127 <xsl:template match="jframeID" mode="traceInFormat">
duke@435 1128 <xsl:param name="name"/>
duke@435 1129 <xsl:text>depth=%d</xsl:text>
duke@435 1130 </xsl:template>
duke@435 1131
duke@435 1132 <xsl:template match="jframeID" mode="traceInValue">
duke@435 1133 <xsl:param name="name"/>
duke@435 1134 <xsl:text>, </xsl:text>
duke@435 1135 <xsl:value-of select="$name"/>
duke@435 1136 </xsl:template>
duke@435 1137
duke@435 1138 <xsl:template match="jclass" mode="traceInValue">
duke@435 1139 <!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->
duke@435 1140 <xsl:if test="count(@method)=0">
duke@435 1141 <xsl:text>,
duke@435 1142 JvmtiTrace::get_class_name(k_mirror)</xsl:text>
duke@435 1143 </xsl:if>
duke@435 1144 </xsl:template>
duke@435 1145
duke@435 1146 <xsl:template match="jmethodID" mode="traceInFormat">
duke@435 1147 <xsl:param name="name"/>
duke@435 1148 <xsl:text> </xsl:text>
duke@435 1149 <xsl:value-of select="$name"/>
duke@435 1150 <xsl:text>=%s.%s</xsl:text>
duke@435 1151 </xsl:template>
duke@435 1152
duke@435 1153 <xsl:template match="jmethodID" mode="traceInValue">
duke@435 1154 <xsl:param name="name"/>
duke@435 1155 <xsl:text>,
duke@435 1156 method_oop == NULL? "NULL" : method_oop->klass_name()->as_C_string(),
duke@435 1157 method_oop == NULL? "NULL" : method_oop->name()->as_C_string()
duke@435 1158 </xsl:text>
duke@435 1159 </xsl:template>
duke@435 1160
duke@435 1161 <xsl:template match="jfieldID" mode="traceInValue">
duke@435 1162 <xsl:param name="name"/>
duke@435 1163 <xsl:text>, fdesc.name()->as_C_string()</xsl:text>
duke@435 1164 </xsl:template>
duke@435 1165
duke@435 1166 <xsl:template match="enum" mode="traceInFormat">
duke@435 1167 <xsl:param name="name"/>
duke@435 1168 <xsl:text> </xsl:text>
duke@435 1169 <xsl:value-of select="$name"/>
duke@435 1170 <xsl:text>=%d:%s</xsl:text>
duke@435 1171 </xsl:template>
duke@435 1172
duke@435 1173 <xsl:template match="enum" mode="traceInValue">
duke@435 1174 <xsl:param name="name"/>
duke@435 1175 <xsl:text>, </xsl:text>
duke@435 1176 <xsl:value-of select="$name"/>
duke@435 1177 <xsl:text>,
duke@435 1178 </xsl:text>
duke@435 1179 <xsl:choose>
duke@435 1180 <xsl:when test=".='jvmtiError'">
duke@435 1181 <xsl:text>JvmtiUtil::error_name(</xsl:text>
duke@435 1182 <xsl:value-of select="$name"/>
duke@435 1183 <xsl:text>)
duke@435 1184 </xsl:text>
duke@435 1185 </xsl:when>
duke@435 1186 <xsl:otherwise>
duke@435 1187 <xsl:choose>
duke@435 1188 <xsl:when test=".='jvmtiEvent'">
duke@435 1189 <xsl:text>JvmtiTrace::event_name(</xsl:text>
duke@435 1190 <xsl:value-of select="$name"/>
duke@435 1191 <xsl:text>)
duke@435 1192 </xsl:text>
duke@435 1193 </xsl:when>
duke@435 1194 <xsl:otherwise>
duke@435 1195 <xsl:text>JvmtiTrace::enum_name(</xsl:text>
duke@435 1196 <xsl:value-of select="."/>
duke@435 1197 <xsl:text>ConstantNames, </xsl:text>
duke@435 1198 <xsl:value-of select="."/>
duke@435 1199 <xsl:text>ConstantValues, </xsl:text>
duke@435 1200 <xsl:value-of select="$name"/>
duke@435 1201 <xsl:text>)</xsl:text>
duke@435 1202 </xsl:otherwise>
duke@435 1203 </xsl:choose>
duke@435 1204 </xsl:otherwise>
duke@435 1205 </xsl:choose>
duke@435 1206 </xsl:template>
duke@435 1207
duke@435 1208 <xsl:template match="jint|jlocation" mode="traceInFormat">
duke@435 1209 <xsl:param name="name"/>
duke@435 1210 <xsl:text> </xsl:text>
duke@435 1211 <xsl:value-of select="$name"/>
duke@435 1212 <xsl:text>=%d</xsl:text>
duke@435 1213 </xsl:template>
duke@435 1214
duke@435 1215 <xsl:template match="jlong" mode="traceInFormat">
duke@435 1216 <xsl:param name="name"/>
duke@435 1217 <xsl:text> </xsl:text>
duke@435 1218 <xsl:value-of select="$name"/>
duke@435 1219 <xsl:text>=%ld</xsl:text>
duke@435 1220 </xsl:template>
duke@435 1221
duke@435 1222 <xsl:template match="size_t" mode="traceInFormat">
duke@435 1223 <xsl:param name="name"/>
duke@435 1224 <xsl:text> </xsl:text>
duke@435 1225 <xsl:value-of select="$name"/>
duke@435 1226 <xsl:text>=0x%zx</xsl:text>
duke@435 1227 </xsl:template>
duke@435 1228
duke@435 1229 <xsl:template match="jfloat|jdouble" mode="traceInFormat">
duke@435 1230 <xsl:param name="name"/>
duke@435 1231 <xsl:text> </xsl:text>
duke@435 1232 <xsl:value-of select="$name"/>
duke@435 1233 <xsl:text>=%f</xsl:text>
duke@435 1234 </xsl:template>
duke@435 1235
duke@435 1236 <xsl:template match="char" mode="traceInFormat">
duke@435 1237 <xsl:param name="name"/>
duke@435 1238 <xsl:text> </xsl:text>
duke@435 1239 <xsl:value-of select="$name"/>
duke@435 1240 <xsl:text>=%c</xsl:text>
duke@435 1241 </xsl:template>
duke@435 1242
duke@435 1243 <xsl:template match="uchar|jchar" mode="traceInFormat">
duke@435 1244 <xsl:param name="name"/>
duke@435 1245 <xsl:text> </xsl:text>
duke@435 1246 <xsl:value-of select="$name"/>
duke@435 1247 <xsl:text>=0x%x</xsl:text>
duke@435 1248 </xsl:template>
duke@435 1249
duke@435 1250 <xsl:template match="jint|jlocation|jchar|jlong|jfloat|jdouble|char|uchar|size_t" mode="traceInValue">
duke@435 1251 <xsl:param name="name"/>
duke@435 1252 <xsl:text>, </xsl:text>
duke@435 1253 <xsl:value-of select="$name"/>
duke@435 1254 </xsl:template>
duke@435 1255
duke@435 1256
duke@435 1257 <xsl:template match="jboolean" mode="traceInFormat">
duke@435 1258 <xsl:param name="name"/>
duke@435 1259 <xsl:text> </xsl:text>
duke@435 1260 <xsl:value-of select="$name"/>
duke@435 1261 <xsl:text>=%s</xsl:text>
duke@435 1262 </xsl:template>
duke@435 1263
duke@435 1264 <xsl:template match="jboolean" mode="traceInValue">
duke@435 1265 <xsl:param name="name"/>
duke@435 1266 <xsl:text>, </xsl:text>
duke@435 1267 <xsl:value-of select="$name"/>
duke@435 1268 <xsl:text>? "true" : "false"</xsl:text>
duke@435 1269 </xsl:template>
duke@435 1270
duke@435 1271 <xsl:template match="jobject|jvalue|jthreadGroup|void|struct" mode="traceInFormat">
duke@435 1272 </xsl:template>
duke@435 1273
duke@435 1274 <xsl:template match="jobject|jvalue|jthreadGroup|void|struct" mode="traceInValue">
duke@435 1275 </xsl:template>
duke@435 1276
duke@435 1277
duke@435 1278
duke@435 1279 </xsl:stylesheet>

mercurial