jvmtiEnter.xsl revision 3730:fb19af007ffc
1206917Smarius<?xml version="1.0"?> 
2206917Smarius<!--
3206917Smarius Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
4206917Smarius DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5206917Smarius
6206917Smarius This code is free software; you can redistribute it and/or modify it
7206917Smarius under the terms of the GNU General Public License version 2 only, as
8206917Smarius published by the Free Software Foundation.
9206917Smarius
10206917Smarius This code is distributed in the hope that it will be useful, but WITHOUT
11206917Smarius ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12206917Smarius FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13206917Smarius version 2 for more details (a copy is included in the LICENSE file that
14206917Smarius accompanied this code).
15206917Smarius
16206917Smarius You should have received a copy of the GNU General Public License version
17206917Smarius 2 along with this work; if not, write to the Free Software Foundation,
18206917Smarius Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19206917Smarius
20206917Smarius Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21206917Smarius or visit www.oracle.com if you need additional information or have any
22206917Smarius questions.
23206917Smarius  
24206917Smarius-->
25206917Smarius
26206917Smarius<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
27206917Smarius
28206917Smarius<xsl:import href="jvmtiLib.xsl"/>
29206917Smarius
30206917Smarius<xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
31206917Smarius
32206917Smarius<xsl:param name="trace"></xsl:param>
33206917Smarius<xsl:param name="interface"></xsl:param>
34206917Smarius
35206917Smarius
36206917Smarius<xsl:template match="specification">
37206917Smarius  <xsl:call-template name="sourceHeader"/>
38206917Smarius  <xsl:text>
39206917Smarius# include "precompiled.hpp"
40206917Smarius# include "utilities/macros.hpp"
41206917Smarius#if INCLUDE_JVMTI
42206917Smarius# include "prims/jvmtiEnter.hpp"
43206917Smarius# include "prims/jvmtiRawMonitor.hpp"
44206917Smarius# include "prims/jvmtiUtil.hpp"
45206917Smarius
46206917Smarius</xsl:text>
47206917Smarius
48206917Smarius  <xsl:if test="$trace = 'Trace'">
49206917Smarius   <xsl:text>
50206917Smarius#ifdef JVMTI_TRACE
51206917Smarius</xsl:text>
52206917Smarius  </xsl:if>
53206917Smarius
54206917Smarius <xsl:if test="$trace != 'Trace'">
55206917Smarius    <xsl:text>
56206917Smarius
57206917Smarius// Error names
58206917Smariusconst char* JvmtiUtil::_error_names[] = {
59206917Smarius</xsl:text>
60206917Smarius    <xsl:call-template name="fillEntityName"> 
61206917Smarius      <xsl:with-param name="entities" select="errorsection/errorcategory/errorid"/>
62206917Smarius    </xsl:call-template>
63206917Smarius    <xsl:text>
64206917Smarius};
65206917Smarius
66206917Smarius
67206917Smarius// Event threaded
68206917Smariusconst bool JvmtiUtil::_event_threaded[] = {
69206917Smarius</xsl:text>
70206917Smarius    <xsl:call-template name="fillEventThreaded"> 
71206917Smarius      <xsl:with-param name="entities" select="eventsection/event"/>
72206917Smarius    </xsl:call-template>
73206917Smarius    <xsl:text>
74206917Smarius};
75206917Smarius
76206917Smarius</xsl:text>
77206917Smarius    <xsl:call-template name="eventCapabilitiesTest"/>
78206917Smarius </xsl:if>
79206917Smarius
80206917Smarius <xsl:if test="$trace = 'Trace'">
81206917Smarius
82206917Smarius<!--  all this just to return the highest event number -->
83206917Smarius  <xsl:variable name="maxEvent">
84206917Smarius    <xsl:for-each select="eventsection/event">
85206917Smarius      <xsl:variable name="mynum" select="@num"/>
86206917Smarius      <xsl:if test="count(../../eventsection/event[@num &gt; $mynum]) = 0">
87206917Smarius        <xsl:value-of select="@num"/>
88206917Smarius      </xsl:if>
89206917Smarius    </xsl:for-each>    
90206917Smarius  </xsl:variable>
91206917Smarius
92206917Smarius  <xsl:text>jbyte JvmtiTrace::_event_trace_flags[</xsl:text>
93206917Smarius  <xsl:value-of select="1+$maxEvent"/>
94206917Smarius  <xsl:text>];
95206917Smarius
96206917Smariusjint JvmtiTrace::_max_event_index = </xsl:text>
97206917Smarius  <xsl:value-of select="$maxEvent"/>
98206917Smarius  <xsl:text>;
99206917Smarius
100206917Smarius// Event names
101206917Smariusconst char* JvmtiTrace::_event_names[] = {
102206917Smarius</xsl:text>
103206917Smarius    <xsl:call-template name="fillEntityName"> 
104206917Smarius      <xsl:with-param name="entities" select="eventsection/event"/>
105206917Smarius    </xsl:call-template>
106206917Smarius    <xsl:text>
107206917Smarius};
108206917Smarius</xsl:text>
109206917Smarius    <xsl:apply-templates select="//constants[@kind='enum']"/>
110206917Smarius  </xsl:if>
111206917Smarius  <xsl:apply-templates select="functionsection"/>
112206917Smarius
113206917Smarius  <xsl:if test="$trace='Trace'">
114206917Smarius   <xsl:text>
115206917Smarius#endif /*JVMTI_TRACE */
116206917Smarius</xsl:text>
117206917Smarius  </xsl:if>
118206917Smarius
119206917Smarius</xsl:template>
120206917Smarius
121206917Smarius<xsl:template match="constants">
122206917Smarius  <xsl:text>
123206917Smarius
124206917Smarius// </xsl:text>
125206917Smarius  <xsl:value-of select="@label"/>
126206917Smarius  <xsl:text> names
127206917Smariusconst char* </xsl:text>
128206917Smarius  <xsl:value-of select="@id"/>
129206917Smarius  <xsl:text>ConstantNames[] = {
130206917Smarius</xsl:text>
131206917Smarius  <xsl:apply-templates select="constant" mode="constname"/>
132206917Smarius  <xsl:text>  NULL
133206917Smarius};
134206917Smarius
135206917Smarius// </xsl:text>
136206917Smarius  <xsl:value-of select="@label"/>
137206917Smarius  <xsl:text> value
138206917Smariusjint </xsl:text>
139206917Smarius  <xsl:value-of select="@id"/>
140206917Smarius  <xsl:text>ConstantValues[] = {
141206917Smarius</xsl:text>
142206917Smarius  <xsl:apply-templates select="constant" mode="constvalue"/>
143206917Smarius  <xsl:text>  0
144206917Smarius};
145206917Smarius
146206917Smarius</xsl:text>
147206917Smarius</xsl:template>
148206917Smarius
149206917Smarius<xsl:template match="constant" mode="constname">
150206917Smarius  <xsl:text>  "</xsl:text>
151206917Smarius  <xsl:value-of select="@id"/>
152206917Smarius  <xsl:text>",
153206917Smarius</xsl:text>
154206917Smarius</xsl:template>
155206917Smarius
156206917Smarius<xsl:template match="constant" mode="constvalue">
157206917Smarius  <xsl:text>  </xsl:text>
158206917Smarius  <xsl:value-of select="@num"/>
159206917Smarius  <xsl:text>,
160206917Smarius</xsl:text>
161206917Smarius</xsl:template>
162206917Smarius
163206917Smarius<xsl:template name="eventCapabilitiesTest">
164206917Smarius  <xsl:text>
165206917Smarius
166206917Smarius// Check Event Capabilities
167206917Smariusconst bool JvmtiUtil::has_event_capability(jvmtiEvent event_type, const jvmtiCapabilities* capabilities_ptr) {
168206917Smarius  switch (event_type) {
169206917Smarius</xsl:text>
170206917Smarius  <xsl:for-each select="//eventsection/event">
171206917Smarius    <xsl:variable name="capa" select="capabilities/required"/>
172206917Smarius    <xsl:if test="count($capa)">
173206917Smarius        <xsl:text>    case </xsl:text>
174206917Smarius        <xsl:value-of select="@const"/>
175206917Smarius        <xsl:text>:
176206917Smarius      return capabilities_ptr-&gt;</xsl:text>
177206917Smarius        <xsl:value-of select="$capa/@id"/>
178206917Smarius        <xsl:text> != 0;
179206917Smarius</xsl:text>
180206917Smarius    </xsl:if>
181206917Smarius  </xsl:for-each>
182206917Smarius  <xsl:text>  }
183206917Smarius  // if it does not have a capability it is required
184206917Smarius  return JNI_TRUE;
185206917Smarius}
186206917Smarius
187206917Smarius</xsl:text>
188206917Smarius</xsl:template>
189206917Smarius
190206917Smarius<xsl:template match="functionsection">
191206917Smarius  <xsl:if test="$trace='Trace'">
192206917Smarius
193206917Smarius<!--  all this just to return the highest function number -->
194206917Smarius  <xsl:variable name="maxFunction">
195206917Smarius    <xsl:for-each select="category/function">
196206917Smarius      <xsl:variable name="mynum" select="@num"/>
197206917Smarius      <xsl:if test="count(../../category/function[@num &gt; $mynum]) = 0">
198206917Smarius        <xsl:value-of select="@num"/>
199206917Smarius      </xsl:if>
200206917Smarius    </xsl:for-each>    
201206917Smarius  </xsl:variable>
202206917Smarius
203206917Smarius  <xsl:text>jbyte JvmtiTrace::_trace_flags[</xsl:text>
204206917Smarius  <xsl:value-of select="1+$maxFunction"/>
205206917Smarius  <xsl:text>];
206206917Smarius
207206917Smariusjint JvmtiTrace::_max_function_index = </xsl:text>
208206917Smarius  <xsl:value-of select="$maxFunction"/>
209206917Smarius  <xsl:text>;
210206917Smarius
211206917Smarius// Function names
212206917Smariusconst char* JvmtiTrace::_function_names[] = {
213206917Smarius</xsl:text>
214206917Smarius  <xsl:call-template name="fillEntityName">
215206917Smarius    <xsl:with-param name="entities" select="category/function"/>
216206917Smarius  </xsl:call-template>
217206917Smarius  <xsl:text>
218206917Smarius};
219206917Smarius
220206917Smarius// Exclude list
221206917Smariusshort JvmtiTrace::_exclude_functions[] = {
222206917Smarius  </xsl:text>
223206917Smarius  <xsl:apply-templates select="category/function" mode="notrace">
224206917Smarius    <xsl:sort select="@num"/>
225206917Smarius  </xsl:apply-templates>
226206917Smarius  <xsl:text>0
227206917Smarius};
228206917Smarius
229206917Smarius</xsl:text>
230206917Smarius  </xsl:if>
231206917Smarius
232206917Smarius  <xsl:text>
233206917Smariusextern "C" {
234206917Smarius
235206917Smarius</xsl:text>
236206917Smarius  <xsl:apply-templates select="category" mode="wrapper"/>
237206917Smarius  <xsl:text>
238206917Smarius} /* end extern "C" */
239206917Smarius
240206917Smarius// JVMTI API functions
241206917Smariusstruct jvmtiInterface_1_ jvmti</xsl:text>
242206917Smarius  <xsl:value-of select="$trace"/>
243206917Smarius  <xsl:text>_Interface = {
244206917Smarius</xsl:text>
245206917Smarius 
246206917Smarius  <xsl:call-template name="fillFuncStruct">
247206917Smarius    <xsl:with-param name="funcs" select="category/function[count(@hide)=0]"/>
248206917Smarius  </xsl:call-template>
249206917Smarius
250206917Smarius  <xsl:text>
251206917Smarius};
252206917Smarius#endif // INCLUDE_JVMTI
253206917Smarius</xsl:text>
254206917Smarius</xsl:template>
255206917Smarius
256206917Smarius<xsl:template match="function" mode="functionid">
257206917Smarius  <xsl:text>jvmti</xsl:text>
258206917Smarius  <xsl:value-of select="$trace"/>
259206917Smarius  <xsl:text>_</xsl:text>
260206917Smarius  <xsl:value-of select="@id"/>
261206917Smarius</xsl:template>
262206917Smarius
263206917Smarius<xsl:template name="fillFuncStructDoit">
264206917Smarius  <xsl:param name="func"/>
265206917Smarius  <xsl:param name="index"/>
266206917Smarius  <xsl:text>                              /* </xsl:text>
267206917Smarius  <xsl:number value="$index" format="  1"/>
268206917Smarius  <xsl:text> : </xsl:text>
269206917Smarius  <xsl:choose>
270206917Smarius    <xsl:when test="count($func)=1">
271206917Smarius      <xsl:value-of select="$func/synopsis"/>
272206917Smarius      <xsl:text> */
273206917Smarius      </xsl:text>
274206917Smarius      <xsl:apply-templates select="$func" mode="functionid"/>
275206917Smarius    </xsl:when>
276206917Smarius    <xsl:otherwise>
277206917Smarius      <xsl:text> RESERVED */
278206917Smarius      NULL</xsl:text>        
279206917Smarius    </xsl:otherwise>
280206917Smarius  </xsl:choose>
281206917Smarius</xsl:template>
282206917Smarius
283206917Smarius<!-- generic function iterator applied to the function structure -->
284206917Smarius<xsl:template name="fillFuncStruct">
285206917Smarius  <xsl:param name="funcs"/>
286206917Smarius  <xsl:param name="index" select="1"/>
287206917Smarius  <xsl:call-template name="fillFuncStructDoit">
288206917Smarius    <xsl:with-param name="func" select="$funcs[@num=$index]"/>
289206917Smarius    <xsl:with-param name="index" select="$index"/>
290206917Smarius  </xsl:call-template>
291206917Smarius  <xsl:if test="count($funcs[@num &gt; $index]) &gt; 0">
292206917Smarius    <xsl:text>,
293206917Smarius</xsl:text>
294206917Smarius    <xsl:call-template name="fillFuncStruct">
295206917Smarius      <xsl:with-param name="funcs" select="$funcs"/>
296206917Smarius      <xsl:with-param name="index" select="1+$index"/>
297206917Smarius    </xsl:call-template>
298206917Smarius  </xsl:if>
299206917Smarius</xsl:template>
300206917Smarius
301206917Smarius<xsl:template name="fillEntityNameDoit">
302206917Smarius  <xsl:param name="entity"/>
303206917Smarius  <xsl:param name="index"/>
304206917Smarius  <xsl:choose>
305206917Smarius    <xsl:when test="count($entity) &gt; 0">
306206917Smarius      <xsl:text>  "</xsl:text>
307206917Smarius      <xsl:value-of select="$entity[position()=1]/@id"/>
308206917Smarius      <xsl:text>"</xsl:text>
309206917Smarius    </xsl:when>
310206917Smarius    <xsl:otherwise>
311206917Smarius      <xsl:text>  NULL</xsl:text>        
312206917Smarius    </xsl:otherwise>
313206917Smarius  </xsl:choose>
314206917Smarius</xsl:template>
315206917Smarius
316206917Smarius<!-- generic entity (with id and num) iterator applied to entity names -->
317206917Smarius<xsl:template name="fillEntityName">
318206917Smarius  <xsl:param name="entities"/>
319206917Smarius  <xsl:param name="index" select="0"/>
320206917Smarius  <xsl:call-template name="fillEntityNameDoit">
321206917Smarius    <xsl:with-param name="entity" select="$entities[@num=$index]"/>
322206917Smarius    <xsl:with-param name="index" select="$index"/>
323206917Smarius  </xsl:call-template>
324206917Smarius  <xsl:if test="count($entities[@num &gt; $index]) &gt; 0">
325206917Smarius    <xsl:text>,
326206917Smarius</xsl:text>
327206917Smarius    <xsl:call-template name="fillEntityName">
328206917Smarius      <xsl:with-param name="entities" select="$entities"/>
329206917Smarius      <xsl:with-param name="index" select="1+$index"/>
330206917Smarius    </xsl:call-template>
331206917Smarius  </xsl:if>
332206917Smarius</xsl:template>
333206917Smarius
334206917Smarius<xsl:template name="fillEventThreadedDoit">
335206917Smarius  <xsl:param name="entity"/>
336206917Smarius  <xsl:param name="index"/>
337206917Smarius  <xsl:choose>
338206917Smarius    <xsl:when test="count($entity) &gt; 0">
339206917Smarius      <xsl:choose>
340206917Smarius        <xsl:when test="count($entity[position()=1]/@filtered)=0">
341206917Smarius          <xsl:text>  false</xsl:text>
342206917Smarius        </xsl:when>
343206917Smarius        <xsl:otherwise>
344206917Smarius          <xsl:text>  true</xsl:text>        
345206917Smarius        </xsl:otherwise>
346206917Smarius      </xsl:choose>
347206917Smarius    </xsl:when>
348206917Smarius    <xsl:otherwise>
349206917Smarius      <xsl:text>  false</xsl:text>        
350206917Smarius    </xsl:otherwise>
351206917Smarius  </xsl:choose>
352206917Smarius</xsl:template>
353206917Smarius
354206917Smarius
355206917Smarius<xsl:template name="fillEventThreaded">
356206917Smarius  <xsl:param name="entities"/>
357206917Smarius  <xsl:param name="index" select="0"/>
358206917Smarius  <xsl:call-template name="fillEventThreadedDoit">
359206917Smarius    <xsl:with-param name="entity" select="$entities[@num=$index]"/>
360206917Smarius    <xsl:with-param name="index" select="$index"/>
361206917Smarius  </xsl:call-template>
362206917Smarius  <xsl:if test="count($entities[@num &gt; $index]) &gt; 0">
363206917Smarius    <xsl:text>,
364206917Smarius</xsl:text>
365206917Smarius    <xsl:call-template name="fillEventThreaded">
366206917Smarius      <xsl:with-param name="entities" select="$entities"/>
367206917Smarius      <xsl:with-param name="index" select="1+$index"/>
368206917Smarius    </xsl:call-template>
369206917Smarius  </xsl:if>
370206917Smarius</xsl:template>
371206917Smarius
372206917Smarius<xsl:template match="function" mode="notrace">
373206917Smarius  <xsl:if test="count(@impl)=1 and contains(@impl,'notrace')">
374206917Smarius    <xsl:value-of select="@num"/>
375206917Smarius    <xsl:text>,
376206917Smarius  </xsl:text>
377206917Smarius  </xsl:if>
378206917Smarius</xsl:template>
379206917Smarius
380206917Smarius<xsl:template match="category" mode="wrapper">
381206917Smarius  <xsl:text>
382206917Smarius  //
383206917Smarius  // </xsl:text><xsl:value-of select="@label"/><xsl:text> functions
384206917Smarius  // 
385206917Smarius</xsl:text>
386206917Smarius  <xsl:apply-templates select="function[count(@hide)=0]"/>
387206917Smarius</xsl:template>
388206917Smarius
389206917Smarius<xsl:template match="function" mode="transition">
390206917Smarius  <xsl:param name="space">
391206917Smarius    <xsl:text>
392206917Smarius  </xsl:text>
393206917Smarius  </xsl:param>
394206917Smarius  <xsl:value-of select="$space"/>
395206917Smarius  
396206917Smarius  <xsl:choose> 
397206917Smarius    <xsl:when test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">
398206917Smarius      <xsl:text>if (this_thread == NULL || !this_thread->is_Java_thread()) {</xsl:text> 
399206917Smarius    </xsl:when> 
400206917Smarius    <xsl:otherwise> 
401206917Smarius      <xsl:choose>
402206917Smarius        <xsl:when test="count(@phase)=0 or contains(@phase,'live') or contains(@phase,'start')">
403206917Smarius	  <xsl:text>if (this_thread == NULL || (!this_thread->is_Java_thread() &amp;&amp; !this_thread->is_VM_thread())) {</xsl:text>
404206917Smarius        </xsl:when>
405206917Smarius        <xsl:otherwise>
406206917Smarius          <xsl:text>if (!this_thread->is_Java_thread()) {</xsl:text> 
407206917Smarius        </xsl:otherwise>
408206917Smarius      </xsl:choose>
409206917Smarius     </xsl:otherwise> 
410206917Smarius  </xsl:choose> 
411206917Smarius  
412206917Smarius  <xsl:if test="$trace='Trace'">
413206917Smarius    <xsl:value-of select="$space"/>
414206917Smarius    <xsl:text>  if (trace_flags) {</xsl:text>
415206917Smarius    <xsl:value-of select="$space"/>
416206917Smarius    <xsl:text>    tty->print_cr("JVMTI [non-attached thread] %s %s",  func_name,</xsl:text>
417206917Smarius    <xsl:value-of select="$space"/>
418206917Smarius    <xsl:text>    JvmtiUtil::error_name(JVMTI_ERROR_UNATTACHED_THREAD));</xsl:text>
419206917Smarius    <xsl:value-of select="$space"/>
420206917Smarius    <xsl:text>  }</xsl:text>
421206917Smarius  </xsl:if>
422206917Smarius  <xsl:value-of select="$space"/>
423206917Smarius  <xsl:text>  return JVMTI_ERROR_UNATTACHED_THREAD;</xsl:text>
424206917Smarius  <xsl:value-of select="$space"/>
425206917Smarius  <xsl:text>}</xsl:text>  
426206917Smarius  <xsl:value-of select="$space"/>  
427206917Smarius  <xsl:if test="count(@impl)=0 or not(contains(@impl,'innative'))">
428206917Smarius    <xsl:text>JavaThread* current_thread = (JavaThread*)this_thread;</xsl:text>   
429206917Smarius    <xsl:value-of select="$space"/>
430206917Smarius    <xsl:text>ThreadInVMfromNative __tiv(current_thread);</xsl:text>
431206917Smarius    <xsl:value-of select="$space"/>
432206917Smarius    <xsl:text>VM_ENTRY_BASE(jvmtiError, </xsl:text>
433206917Smarius    <xsl:apply-templates select="." mode="functionid"/>
434206917Smarius    <xsl:text> , current_thread)</xsl:text>
435206917Smarius    <xsl:value-of select="$space"/>
436206917Smarius    <xsl:text>debug_only(VMNativeEntryWrapper __vew;)</xsl:text>
437206917Smarius    <xsl:if test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">
438206917Smarius      <xsl:value-of select="$space"/>
439206917Smarius      <xsl:text>CautiouslyPreserveExceptionMark __em(this_thread);</xsl:text>
440206917Smarius    </xsl:if>
441206917Smarius  </xsl:if>
442206917Smarius</xsl:template>
443206917Smarius
444206917Smarius
445206917Smarius<xsl:template match="required">
446206917Smarius  <xsl:text>
447206917Smarius  if (jvmti_env-&gt;get_capabilities()-&gt;</xsl:text>
448206917Smarius    <xsl:value-of select="@id"/>
449206917Smarius    <xsl:text> == 0) {
450206917Smarius</xsl:text>
451206917Smarius    <xsl:if test="$trace='Trace'">
452206917Smarius      <xsl:text>    if (trace_flags) {
453206917Smarius          tty->print_cr("JVMTI [%s] %s %s",  curr_thread_name, func_name, 
454206917Smarius                    JvmtiUtil::error_name(JVMTI_ERROR_MUST_POSSESS_CAPABILITY));
455206917Smarius    }
456206917Smarius</xsl:text>
457206917Smarius    </xsl:if>
458206917Smarius    <xsl:text>    return JVMTI_ERROR_MUST_POSSESS_CAPABILITY;
459206917Smarius  }
460206917Smarius</xsl:text>
461206917Smarius</xsl:template>
462206917Smarius
463206917Smarius
464206917Smarius<xsl:template match="function">
465206917Smarius  <xsl:text>
466206917Smariusstatic jvmtiError JNICALL
467206917Smarius</xsl:text>
468206917Smarius  <xsl:apply-templates select="." mode="functionid"/>
469206917Smarius  <xsl:text>(jvmtiEnv* env</xsl:text>
470206917Smarius  <xsl:apply-templates select="parameters" mode="signature"/>
471206917Smarius  <xsl:text>) {
472206917Smarius</xsl:text>
473206917Smarius
474206917Smarius  <xsl:if test="not(contains(@jkernel,'yes'))">
475206917Smarius  <xsl:text>&#xA;#if !INCLUDE_JVMTI &#xA;</xsl:text>
476206917Smarius  <xsl:text>  return JVMTI_ERROR_NOT_AVAILABLE; &#xA;</xsl:text>
477206917Smarius  <xsl:text>#else &#xA;</xsl:text>
478206917Smarius  </xsl:if>
479206917Smarius
480206917Smarius  <xsl:apply-templates select="." mode="traceSetUp"/>
481206917Smarius  <xsl:choose>
482206917Smarius    <xsl:when test="count(@phase)=0 or contains(@phase,'live')">
483206917Smarius      <xsl:text>  if(!JvmtiEnv::is_vm_live()) {
484206917Smarius</xsl:text>
485206917Smarius    <xsl:if test="$trace='Trace'">
486206917Smarius      <xsl:text>    if (trace_flags) {
487206917Smarius          tty->print_cr("JVMTI [-] %s %s",  func_name, 
488206917Smarius                    JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));
489206917Smarius    }
490206917Smarius</xsl:text>
491206917Smarius    </xsl:if>
492206917Smarius    <xsl:text>    return JVMTI_ERROR_WRONG_PHASE;
493206917Smarius  }</xsl:text>  
494206917Smarius
495206917Smarius      <xsl:text>  
496206917Smarius  Thread* this_thread = (Thread*)ThreadLocalStorage::thread(); </xsl:text>
497206917Smarius
498206917Smarius      <xsl:apply-templates select="." mode="transition"/>
499206917Smarius    </xsl:when>
500206917Smarius    <xsl:otherwise>
501206917Smarius      <xsl:if test="contains(@phase,'onload')">
502206917Smarius        <xsl:text>  if(JvmtiEnv::get_phase()!=JVMTI_PHASE_ONLOAD</xsl:text>
503206917Smarius        <xsl:if test="not(contains(@phase,'onloadOnly'))">
504206917Smarius          <xsl:text> &amp;&amp; JvmtiEnv::get_phase()!=JVMTI_PHASE_LIVE</xsl:text>
505206917Smarius        </xsl:if>
506206917Smarius        <xsl:text>) {
507206917Smarius</xsl:text>
508206917Smarius    <xsl:if test="$trace='Trace'">
509206917Smarius      <xsl:text>    if (trace_flags) {
510206917Smarius          tty->print_cr("JVMTI [-] %s %s",  func_name, 
511206917Smarius                    JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));
512206917Smarius    }
513206917Smarius</xsl:text>
514206917Smarius    </xsl:if>
515206917Smarius    <xsl:text>    return JVMTI_ERROR_WRONG_PHASE;
516206917Smarius  }</xsl:text>
517206917Smarius      </xsl:if>
518206917Smarius      <xsl:if test="contains(@phase,'start')">
519206917Smarius        <xsl:text>  if(JvmtiEnv::get_phase()!=JVMTI_PHASE_START &amp;&amp; JvmtiEnv::get_phase()!=JVMTI_PHASE_LIVE) {
520206917Smarius</xsl:text>
521206917Smarius    <xsl:if test="$trace='Trace'">
522206917Smarius      <xsl:text>    if (trace_flags) {
523206917Smarius          tty->print_cr("JVMTI [-] %s %s",  func_name, 
524206917Smarius                    JvmtiUtil::error_name(JVMTI_ERROR_WRONG_PHASE));
525206917Smarius    }
526206917Smarius</xsl:text>
527206917Smarius    </xsl:if>
528206917Smarius    <xsl:text>    return JVMTI_ERROR_WRONG_PHASE;
529206917Smarius  }
530206917Smarius  Thread* this_thread = (Thread*)ThreadLocalStorage::thread(); </xsl:text>
531206917Smarius      <xsl:apply-templates select="." mode="transition"/>
532206917Smarius      </xsl:if>
533206917Smarius    </xsl:otherwise>
534206917Smarius  </xsl:choose>
535206917Smarius
536206917Smarius  <xsl:text>
537206917Smarius  JvmtiEnv* jvmti_env = JvmtiEnv::JvmtiEnv_from_jvmti_env(env);
538206917Smarius  if (!jvmti_env->is_valid()) {
539206917Smarius</xsl:text>
540206917Smarius    <xsl:if test="$trace='Trace'">
541206917Smarius      <xsl:text>    if (trace_flags) {
542206917Smarius          tty->print_cr("JVMTI [%s] %s %s  env=%d",  curr_thread_name, func_name, 
543206917Smarius                    JvmtiUtil::error_name(JVMTI_ERROR_INVALID_ENVIRONMENT), env);
544206917Smarius    }
545206917Smarius</xsl:text>
546206917Smarius    </xsl:if>
547206917Smarius    <xsl:text>    return JVMTI_ERROR_INVALID_ENVIRONMENT;
548206917Smarius  }
549206917Smarius</xsl:text>
550206917Smarius
551206917Smarius  <xsl:apply-templates select="capabilities/required"/>
552206917Smarius  
553206917Smarius  <xsl:text>  jvmtiError err;
554206917Smarius</xsl:text>
555206917Smarius  <xsl:choose>
556206917Smarius    <xsl:when test="count(@phase)=1 and not(contains(@phase,'live')) and not(contains(@phase,'start'))">    
557206917Smarius      <xsl:choose>
558206917Smarius        <xsl:when test="count(@callbacksafe)=0 or not(contains(@callbacksafe,'safe'))">
559206917Smarius          <xsl:text>  if (Threads::number_of_threads() != 0) {
560206917Smarius    Thread* this_thread = (Thread*)ThreadLocalStorage::thread();</xsl:text>
561206917Smarius        </xsl:when>
562206917Smarius        <xsl:otherwise>
563206917Smarius
564206917Smarius	  <xsl:text>  Thread* this_thread = NULL;
565206917Smarius  bool transition;
566206917Smarius  if (Threads::number_of_threads() == 0) {
567206917Smarius    transition = false;
568206917Smarius  } else {
569206917Smarius    this_thread = (Thread*)ThreadLocalStorage::thread();
570206917Smarius    transition = ((this_thread != NULL) &amp;&amp; !this_thread->is_VM_thread() &amp;&amp; !this_thread->is_ConcurrentGC_thread());
571206917Smarius  }
572206917Smarius  if (transition) {</xsl:text>
573206917Smarius	</xsl:otherwise>
574206917Smarius
575206917Smarius      </xsl:choose>
576206917Smarius      <!-- we allow use in early phases but there are threads now, -->
577206917Smarius      <!-- so do thread transition -->
578206917Smarius      <xsl:apply-templates select="." mode="transition">
579206917Smarius          <xsl:with-param name="space">
580206917Smarius            <xsl:text>
581206917Smarius    </xsl:text>
582206917Smarius          </xsl:with-param>
583206917Smarius      </xsl:apply-templates>
584206917Smarius      <xsl:text>
585206917Smarius  </xsl:text>
586206917Smarius      <xsl:apply-templates select="." mode="doCall"/>     
587206917Smarius      <xsl:text>  } else {
588206917Smarius  </xsl:text>
589206917Smarius      <!-- we are pre-thread - no thread transition code -->
590206917Smarius      <xsl:apply-templates select="." mode="doCall"/>     
591206917Smarius      <xsl:text>  }
592206917Smarius</xsl:text>
593206917Smarius    </xsl:when>
594206917Smarius    <xsl:otherwise>
595206917Smarius      <xsl:apply-templates select="." mode="doCall"/>      
596206917Smarius    </xsl:otherwise>
597206917Smarius  </xsl:choose>
598206917Smarius  <xsl:text>  return err;
599206917Smarius</xsl:text>
600206917Smarius
601206917Smarius  <xsl:if test="not(contains(@jkernel,'yes'))">
602206917Smarius  <xsl:text>#endif // INCLUDE_JVMTI&#xA;</xsl:text>
603206917Smarius  </xsl:if>
604206917Smarius
605206917Smarius  <xsl:text>}&#xA;</xsl:text>
606206917Smarius</xsl:template>
607206917Smarius
608206917Smarius<xsl:template match="function" mode="doCall">
609206917Smarius  <xsl:apply-templates select="parameters" mode="dochecks"/>
610206917Smarius  <xsl:apply-templates select="." mode="traceBefore"/>  
611206917Smarius  <xsl:apply-templates select="." mode="genCall"/>
612206917Smarius  <xsl:apply-templates select="." mode="traceAfter"/>
613206917Smarius</xsl:template>
614206917Smarius
615206917Smarius<xsl:template match="function" mode="genCall">
616206917Smarius  <xsl:text>  err = jvmti_env-&gt;</xsl:text>
617206917Smarius  <xsl:value-of select="@id"/>
618206917Smarius  <xsl:text>(</xsl:text>
619206917Smarius  <xsl:apply-templates select="parameters" mode="HotSpotValue"/>
620206917Smarius  <xsl:text>);
621206917Smarius</xsl:text>
622206917Smarius</xsl:template>
623206917Smarius
624206917Smarius
625206917Smarius<xsl:template match="function" mode="traceSetUp">
626206917Smarius  <xsl:if test="$trace='Trace'">
627206917Smarius    <xsl:text>  SafeResourceMark rm;
628206917Smarius  jint trace_flags = JvmtiTrace::trace_flags(</xsl:text>
629206917Smarius      <xsl:value-of select="@num"/>
630206917Smarius      <xsl:text>);
631206917Smarius  const char *func_name;
632206917Smarius  const char *curr_thread_name;
633206917Smarius  if (trace_flags) {
634206917Smarius    func_name = JvmtiTrace::function_name(</xsl:text>
635206917Smarius      <xsl:value-of select="@num"/>
636206917Smarius      <xsl:text>);
637206917Smarius    curr_thread_name = JvmtiTrace::safe_get_current_thread_name();
638206917Smarius  }
639206917Smarius</xsl:text>
640206917Smarius  </xsl:if>
641206917Smarius</xsl:template>
642206917Smarius
643206917Smarius
644206917Smarius<xsl:template match="function" mode="traceBefore">
645206917Smarius  <xsl:if test="$trace='Trace'">
646206917Smarius    <xsl:text>
647206917Smarius  if ((trace_flags &amp; JvmtiTrace::SHOW_IN) != 0) {
648206917Smarius    </xsl:text>
649206917Smarius    <xsl:apply-templates select="." mode="traceIn"/>
650206917Smarius    <xsl:text>  }
651206917Smarius</xsl:text>
652206917Smarius  </xsl:if>
653206917Smarius</xsl:template>
654206917Smarius
655206917Smarius
656206917Smarius<xsl:template match="param" mode="traceError">
657206917Smarius  <xsl:param name="err"/>
658206917Smarius  <xsl:param name="comment"></xsl:param>
659206917Smarius  <xsl:param name="extraValue"></xsl:param>
660206917Smarius  <xsl:if test="$trace='Trace'">
661206917Smarius  <xsl:text>      if ((trace_flags &amp; JvmtiTrace::SHOW_ERROR) != 0) {
662206917Smarius        if ((trace_flags &amp; JvmtiTrace::SHOW_IN) == 0) {
663206917Smarius</xsl:text>
664206917Smarius  <xsl:apply-templates select="../.." mode="traceIn">
665206917Smarius    <xsl:with-param name="endParam" select="."/>
666206917Smarius  </xsl:apply-templates>
667206917Smarius  <xsl:text>      }
668206917Smarius        tty->print_cr("JVMTI [%s] %s } %s - erroneous arg is </xsl:text>
669206917Smarius    <xsl:value-of select="@id"/>
670206917Smarius    <xsl:value-of select="$comment"/>
671206917Smarius    <xsl:text>",  curr_thread_name, func_name, 
672206917Smarius                  JvmtiUtil::error_name(</xsl:text>
673206917Smarius    <xsl:value-of select="$err"/>
674206917Smarius    <xsl:text>)</xsl:text>
675206917Smarius    <xsl:value-of select="$extraValue"/>
676206917Smarius    <xsl:text>);
677206917Smarius      }
678206917Smarius</xsl:text>
679206917Smarius  </xsl:if>
680206917Smarius    <xsl:text>      return </xsl:text>
681206917Smarius    <xsl:value-of select="$err"/>
682206917Smarius    <xsl:text>;</xsl:text>
683206917Smarius</xsl:template>
684206917Smarius
685206917Smarius
686206917Smarius<xsl:template match="function" mode="traceAfter">
687206917Smarius  <xsl:if test="$trace='Trace'">
688206917Smarius    <xsl:text>  if ( err != JVMTI_ERROR_NONE &amp;&amp; (trace_flags &amp; JvmtiTrace::SHOW_ERROR) != 0) {
689206917Smarius      if ((trace_flags &amp; JvmtiTrace::SHOW_IN) == 0) {
690206917Smarius</xsl:text>
691206917Smarius    <xsl:apply-templates select="." mode="traceIn"/>
692206917Smarius    <xsl:text>    }
693206917Smarius    tty->print_cr("JVMTI [%s] %s } %s",  curr_thread_name, func_name, 
694206917Smarius                  JvmtiUtil::error_name(err));
695206917Smarius  } else if ((trace_flags &amp; JvmtiTrace::SHOW_OUT) != 0) {
696206917Smarius    tty->print_cr("JVMTI [%s] %s }",  curr_thread_name, func_name);
697206917Smarius  }
698206917Smarius</xsl:text>
699206917Smarius  </xsl:if>
700206917Smarius</xsl:template>
701206917Smarius
702206917Smarius<xsl:template match="function" mode="traceIn">
703206917Smarius  <xsl:param name="endParam"></xsl:param>
704206917Smarius  <xsl:text>          tty->print_cr("JVMTI [%s] %s { </xsl:text>
705206917Smarius  <xsl:apply-templates select="parameters" mode="traceInFormat">
706206917Smarius    <xsl:with-param name="endParam" select="$endParam"/>    
707206917Smarius  </xsl:apply-templates>
708206917Smarius  <xsl:text>", curr_thread_name, func_name</xsl:text>
709206917Smarius  <xsl:apply-templates select="parameters" mode="traceInValue">
710206917Smarius    <xsl:with-param name="endParam" select="$endParam"/>    
711206917Smarius  </xsl:apply-templates>
712206917Smarius  <xsl:text>);
713206917Smarius</xsl:text>
714206917Smarius</xsl:template>
715206917Smarius
716206917Smarius<xsl:template match="parameters" mode="dochecks">
717206917Smarius  <xsl:apply-templates select="param" mode="dochecks"/>
718206917Smarius</xsl:template>
719206917Smarius
720206917Smarius<xsl:template match="param" mode="dochecks">
721206917Smarius  <xsl:apply-templates select="child::*[position()=1]" mode="dochecks">
722206917Smarius    <xsl:with-param name="name" select="@id"/>
723206917Smarius  </xsl:apply-templates>
724206917Smarius</xsl:template>
725206917Smarius
726206917Smarius<xsl:template match="outptr|outbuf|allocfieldbuf|ptrtype|inptr|inbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="dochecks">
727206917Smarius  <xsl:param name="name"/>
728206917Smarius  <xsl:if test="count(nullok)=0">
729206917Smarius    <xsl:text>  if (</xsl:text>
730206917Smarius    <xsl:value-of select="$name"/>
731206917Smarius    <xsl:text> == NULL) {
732206917Smarius</xsl:text>
733206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
734206917Smarius      <xsl:with-param name="err">JVMTI_ERROR_NULL_POINTER</xsl:with-param>
735206917Smarius    </xsl:apply-templates>
736206917Smarius    <xsl:text>
737206917Smarius  }
738206917Smarius</xsl:text>
739206917Smarius  </xsl:if>
740206917Smarius</xsl:template>
741206917Smarius
742206917Smarius<xsl:template match="jrawMonitorID" mode="dochecks">
743206917Smarius  <xsl:param name="name"/>
744206917Smarius  <xsl:text>  JvmtiRawMonitor *rmonitor = (JvmtiRawMonitor *)</xsl:text>
745206917Smarius  <xsl:value-of select="$name"/>
746206917Smarius  <xsl:text>;
747206917Smarius  if (rmonitor == NULL) {
748206917Smarius</xsl:text>
749206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
750206917Smarius      <xsl:with-param name="err">JVMTI_ERROR_INVALID_MONITOR</xsl:with-param>
751206917Smarius      <xsl:with-param name="comment"> - raw monitor is NULL</xsl:with-param>
752206917Smarius    </xsl:apply-templates>
753206917Smarius    <xsl:text>
754206917Smarius  }
755206917Smarius  if (!rmonitor->is_valid()) {
756206917Smarius</xsl:text>
757206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
758206917Smarius      <xsl:with-param name="err">JVMTI_ERROR_INVALID_MONITOR</xsl:with-param>
759206917Smarius      <xsl:with-param name="comment"> - not a raw monitor 0x%x</xsl:with-param>
760206917Smarius      <xsl:with-param name="extraValue">, rmonitor</xsl:with-param>
761206917Smarius    </xsl:apply-templates>
762206917Smarius    <xsl:text>
763206917Smarius  }
764206917Smarius</xsl:text>
765206917Smarius</xsl:template>
766206917Smarius
767206917Smarius<xsl:template match="jthread" mode="dochecksbody">
768206917Smarius  <xsl:param name="name"/>
769206917Smarius    <xsl:text>    oop thread_oop = JNIHandles::resolve_external_guard(</xsl:text>
770206917Smarius    <xsl:value-of select="$name"/>
771206917Smarius    <xsl:text>);
772206917Smarius    if (thread_oop == NULL) {
773206917Smarius</xsl:text>
774206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
775206917Smarius      <xsl:with-param name="err">JVMTI_ERROR_INVALID_THREAD</xsl:with-param>
776206917Smarius      <xsl:with-param name="comment"> - jthread resolved to NULL - jthread = %0x%x</xsl:with-param>
777206917Smarius      <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
778206917Smarius    </xsl:apply-templates>
779206917Smarius    <xsl:text>
780206917Smarius    }
781206917Smarius    if (!thread_oop-&gt;is_a(SystemDictionary::Thread_klass())) {
782206917Smarius</xsl:text>
783206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
784206917Smarius      <xsl:with-param name="err">JVMTI_ERROR_INVALID_THREAD</xsl:with-param>
785206917Smarius      <xsl:with-param name="comment"> - oop is not a thread - jthread = %0x%x</xsl:with-param>
786206917Smarius      <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
787206917Smarius    </xsl:apply-templates>
788206917Smarius    <xsl:text>
789206917Smarius    }
790206917Smarius    java_thread = java_lang_Thread::thread(thread_oop); 
791206917Smarius    if (java_thread == NULL) {
792206917Smarius</xsl:text>
793206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
794206917Smarius      <xsl:with-param name="err">
795206917Smarius        <xsl:text>JVMTI_ERROR_THREAD_NOT_ALIVE</xsl:text>
796206917Smarius      </xsl:with-param>
797206917Smarius      <xsl:with-param name="comment"> - not a Java thread - jthread = %0x%x</xsl:with-param>
798206917Smarius      <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
799206917Smarius    </xsl:apply-templates>
800206917Smarius    <xsl:text>
801206917Smarius    }
802206917Smarius</xsl:text>  
803206917Smarius</xsl:template>
804206917Smarius
805206917Smarius<xsl:template match="jthread" mode="dochecks">
806206917Smarius  <xsl:param name="name"/>
807206917Smarius  <!-- If we convert and test threads -->
808206917Smarius  <xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">
809206917Smarius    <xsl:text>  JavaThread* java_thread;
810206917Smarius</xsl:text>
811206917Smarius    <xsl:choose>
812206917Smarius      <xsl:when test="count(@null)=0">
813206917Smarius        <xsl:apply-templates select="." mode="dochecksbody">
814206917Smarius          <xsl:with-param name="name" select="$name"/>
815206917Smarius        </xsl:apply-templates>
816206917Smarius      </xsl:when>
817206917Smarius      <xsl:otherwise>
818206917Smarius        <xsl:text>  if (</xsl:text>
819206917Smarius        <xsl:value-of select="$name"/>
820206917Smarius        <xsl:text> == NULL) {
821206917Smarius    java_thread = current_thread;
822206917Smarius  } else {
823206917Smarius</xsl:text>
824206917Smarius        <xsl:apply-templates select="." mode="dochecksbody">
825206917Smarius          <xsl:with-param name="name" select="$name"/>
826206917Smarius        </xsl:apply-templates>
827206917Smarius        <xsl:text>  }
828206917Smarius</xsl:text>
829206917Smarius      </xsl:otherwise>
830206917Smarius    </xsl:choose>
831206917Smarius  </xsl:if>
832206917Smarius</xsl:template>
833206917Smarius
834206917Smarius<xsl:template match="jframeID" mode="dochecks">
835206917Smarius  <xsl:param name="name"/>
836206917Smarius  <xsl:text>
837206917Smarius  if (depth &lt; 0) {
838206917Smarius</xsl:text>
839206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
840206917Smarius      <xsl:with-param name="err">JVMTI_ERROR_ILLEGAL_ARGUMENT</xsl:with-param>
841206917Smarius      <xsl:with-param name="comment"> - negative depth - jthread = %0x%x</xsl:with-param>
842206917Smarius      <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
843206917Smarius    </xsl:apply-templates>
844206917Smarius    <xsl:text>
845206917Smarius  }
846206917Smarius</xsl:text>
847206917Smarius</xsl:template>
848206917Smarius
849206917Smarius<xsl:template match="jclass" mode="dochecks">
850206917Smarius <xsl:param name="name"/>
851206917Smarius <!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->
852206917Smarius <xsl:if test="count(@method)=0">
853206917Smarius  <xsl:text>  oop k_mirror = JNIHandles::resolve_external_guard(</xsl:text>  
854206917Smarius  <xsl:value-of select="$name"/>
855206917Smarius  <xsl:text>);
856206917Smarius  if (k_mirror == NULL) {
857206917Smarius</xsl:text>
858206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
859206917Smarius      <xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>
860206917Smarius      <xsl:with-param name="comment"> - resolved to NULL - jclass = 0x%x</xsl:with-param>
861206917Smarius      <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
862206917Smarius    </xsl:apply-templates>
863206917Smarius    <xsl:text>
864206917Smarius  }
865206917Smarius  if (!k_mirror->is_a(SystemDictionary::Class_klass())) {
866206917Smarius</xsl:text>
867206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
868206917Smarius      <xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>
869206917Smarius      <xsl:with-param name="comment"> - not a class - jclass = 0x%x</xsl:with-param>
870206917Smarius      <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
871206917Smarius    </xsl:apply-templates>
872206917Smarius    <xsl:text>
873206917Smarius  }
874206917Smarius</xsl:text>
875206917Smarius  <xsl:if test="count(@method|@field)=1">
876206917Smarius    <xsl:text>
877206917Smarius  if (java_lang_Class::is_primitive(k_mirror)) {
878206917Smarius</xsl:text>
879206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
880206917Smarius      <xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>
881206917Smarius      <xsl:with-param name="comment"> - is a primitive class - jclass = 0x%x</xsl:with-param>
882206917Smarius      <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
883206917Smarius    </xsl:apply-templates>
884206917Smarius    <xsl:text>
885206917Smarius  }
886206917Smarius  Klass* k_oop = java_lang_Class::as_Klass(k_mirror);
887206917Smarius  if (k_oop == NULL) {
888206917Smarius</xsl:text>
889206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
890206917Smarius      <xsl:with-param name="err">JVMTI_ERROR_INVALID_CLASS</xsl:with-param>
891206917Smarius      <xsl:with-param name="comment"> - no Klass* - jclass = 0x%x</xsl:with-param>
892206917Smarius      <xsl:with-param name="extraValue">, <xsl:value-of select="$name"/></xsl:with-param>
893206917Smarius    </xsl:apply-templates>
894206917Smarius    <xsl:text>
895206917Smarius  }
896206917Smarius</xsl:text>
897206917Smarius  </xsl:if>
898206917Smarius </xsl:if>
899206917Smarius</xsl:template>
900206917Smarius
901206917Smarius
902206917Smarius<xsl:template match="jmethodID" mode="dochecks">
903206917Smarius  <xsl:param name="name"/>
904206917Smarius  <xsl:text>  Method* method_oop = Method::checked_resolve_jmethod_id(</xsl:text>
905206917Smarius  <xsl:value-of select="$name"/>
906206917Smarius  <xsl:text>);&#xA;</xsl:text>
907206917Smarius  <xsl:text>  if (method_oop == NULL) {&#xA;</xsl:text>
908206917Smarius  <xsl:apply-templates select=".." mode="traceError">     
909206917Smarius    <xsl:with-param name="err">JVMTI_ERROR_INVALID_METHODID</xsl:with-param>
910206917Smarius    <xsl:with-param name="comment"></xsl:with-param>
911206917Smarius    <xsl:with-param name="extraValue"></xsl:with-param>
912206917Smarius  </xsl:apply-templates>
913206917Smarius  <xsl:text>&#xA;</xsl:text>
914206917Smarius  <xsl:text>  }&#xA;</xsl:text>
915206917Smarius  <xsl:if test="count(@native)=1 and contains(@native,'error')">
916206917Smarius    <xsl:text>  if (method_oop->is_native()) {&#xA;</xsl:text>   
917206917Smarius    <xsl:text>    return JVMTI_ERROR_NATIVE_METHOD;&#xA;</xsl:text>   
918206917Smarius    <xsl:text>  }&#xA;</xsl:text>   
919206917Smarius  </xsl:if>
920206917Smarius</xsl:template>
921206917Smarius
922206917Smarius
923206917Smarius<xsl:template match="jfieldID" mode="dochecks">
924206917Smarius  <xsl:param name="name"/>
925206917Smarius  <xsl:text>  ResourceMark rm_fdesc(current_thread);&#xA;</xsl:text>
926206917Smarius  <xsl:text>  fieldDescriptor fdesc;&#xA;</xsl:text>
927206917Smarius  <xsl:text>  if (!JvmtiEnv::get_field_descriptor(k_oop, </xsl:text>
928206917Smarius  <xsl:value-of select="$name"/>
929206917Smarius  <xsl:text>, &amp;fdesc)) {&#xA;</xsl:text>
930206917Smarius  <xsl:apply-templates select=".." mode="traceError">     
931206917Smarius    <xsl:with-param name="err">JVMTI_ERROR_INVALID_FIELDID</xsl:with-param>
932206917Smarius  </xsl:apply-templates>
933206917Smarius  <xsl:text>&#xA;</xsl:text>
934206917Smarius  <xsl:text>  }&#xA;</xsl:text>
935206917Smarius</xsl:template>
936206917Smarius
937206917Smarius
938206917Smarius<xsl:template match="jint" mode="dochecks">
939206917Smarius  <xsl:param name="name"/>
940206917Smarius  <xsl:if test="count(@min)=1">
941206917Smarius    <xsl:text>  if (</xsl:text>
942206917Smarius    <xsl:value-of select="$name"/>
943206917Smarius    <xsl:text> &lt; </xsl:text>
944206917Smarius    <xsl:value-of select="@min"/>
945206917Smarius    <xsl:text>) {
946206917Smarius</xsl:text>
947206917Smarius    <xsl:apply-templates select=".." mode="traceError">     
948206917Smarius      <xsl:with-param name="err">JVMTI_ERROR_ILLEGAL_ARGUMENT</xsl:with-param>
949206917Smarius    </xsl:apply-templates>
950206917Smarius    <xsl:text>
951206917Smarius  }
952206917Smarius</xsl:text>
953206917Smarius  </xsl:if>
954206917Smarius</xsl:template>
955206917Smarius
956206917Smarius<xsl:template match="jobject|jvalue|jthreadGroup|enum|jchar|jlong|jfloat|jdouble|jlocation|jboolean|char|uchar|size_t|void|struct" mode="dochecks">
957206917Smarius</xsl:template>
958206917Smarius
959206917Smarius<!-- iterate over parameters, stopping if specified is encountered -->
960206917Smarius<xsl:template name="traceInValueParamsUpTo">
961206917Smarius  <xsl:param name="params"/>
962206917Smarius  <xsl:param name="endParam"></xsl:param>
963206917Smarius  <xsl:param name="index" select="1"/>
964206917Smarius  <xsl:variable name="cParam" select="$params[position()=$index]"/>
965206917Smarius  <xsl:if test="$cParam!=$endParam">
966206917Smarius    <xsl:apply-templates select="$cParam" mode="traceInValue"/>
967206917Smarius    <xsl:if test="count($params) &gt; $index">
968206917Smarius      <xsl:call-template name="traceInValueParamsUpTo">
969206917Smarius        <xsl:with-param name="params" select="$params"/>
970206917Smarius        <xsl:with-param name="endParam" select="$endParam"/>
971206917Smarius        <xsl:with-param name="index" select="1+$index"/>
972206917Smarius      </xsl:call-template>
973206917Smarius    </xsl:if>
974206917Smarius  </xsl:if>
975206917Smarius</xsl:template>
976206917Smarius
977206917Smarius<xsl:template name="traceInFormatParamsUpTo">
978206917Smarius  <xsl:param name="params"/>
979206917Smarius  <xsl:param name="endParam"></xsl:param>
980206917Smarius  <xsl:param name="index" select="1"/>
981206917Smarius  <xsl:variable name="cParam" select="$params[position()=$index]"/>
982206917Smarius  <xsl:if test="$cParam!=$endParam">
983206917Smarius    <xsl:apply-templates select="$cParam" mode="traceInFormat"/>
984206917Smarius    <xsl:if test="count($params) &gt; $index">
985206917Smarius      <xsl:call-template name="traceInFormatParamsUpTo">
986206917Smarius        <xsl:with-param name="params" select="$params"/>
987206917Smarius        <xsl:with-param name="endParam" select="$endParam"/>
988206917Smarius        <xsl:with-param name="index" select="1+$index"/>
989206917Smarius      </xsl:call-template>
990206917Smarius    </xsl:if>
991206917Smarius  </xsl:if>
992206917Smarius</xsl:template>
993206917Smarius
994206917Smarius<xsl:template match="parameters" mode="traceInFormat">
995206917Smarius  <xsl:param name="endParam"></xsl:param>
996206917Smarius  <xsl:call-template name="traceInFormatParamsUpTo">
997206917Smarius    <xsl:with-param name="params" select="param"/>
998206917Smarius    <xsl:with-param name="endParam" select="$endParam"/>
999206917Smarius  </xsl:call-template>
1000206917Smarius</xsl:template>
1001206917Smarius
1002206917Smarius<xsl:template match="parameters" mode="traceInValue">
1003206917Smarius  <xsl:param name="endParam"></xsl:param>
1004206917Smarius  <xsl:call-template name="traceInValueParamsUpTo">
1005206917Smarius    <xsl:with-param name="params" select="param"/>
1006206917Smarius    <xsl:with-param name="endParam" select="$endParam"/>
1007206917Smarius  </xsl:call-template>
1008206917Smarius</xsl:template>
1009206917Smarius
1010206917Smarius<xsl:template match="param" mode="traceInFormat">
1011206917Smarius  <xsl:apply-templates select="child::*[position()=1]" mode="traceInFormat">
1012206917Smarius    <xsl:with-param name="name" select="@id"/>
1013206917Smarius  </xsl:apply-templates>
1014206917Smarius</xsl:template>
1015206917Smarius
1016206917Smarius<xsl:template match="param" mode="traceInValue">
1017206917Smarius  <xsl:apply-templates select="child::*[position()=1]" mode="traceInValue">
1018206917Smarius    <xsl:with-param name="name" select="@id"/>
1019206917Smarius  </xsl:apply-templates>
1020206917Smarius</xsl:template>
1021206917Smarius
1022206917Smarius<xsl:template match="outptr|outbuf|allocfieldbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="traceInFormat">
1023206917Smarius</xsl:template>
1024206917Smarius
1025206917Smarius<xsl:template match="outptr|outbuf|allocfieldbuf|vmbuf|allocbuf|agentbuf|allocallocbuf" mode="traceInValue">
1026206917Smarius</xsl:template>
1027206917Smarius
1028206917Smarius<xsl:template match="inbuf" mode="traceInFormat">
1029206917Smarius  <xsl:param name="name"/>
1030206917Smarius  <xsl:text> </xsl:text>
1031206917Smarius  <xsl:value-of select="$name"/>
1032206917Smarius  <xsl:variable name="child" select="child::*[position()=1]"/>
1033206917Smarius  <xsl:choose>
1034206917Smarius    <xsl:when test="name($child)='char'">
1035206917Smarius      <xsl:text>='%s'</xsl:text>
1036206917Smarius    </xsl:when>
1037206917Smarius    <xsl:otherwise>
1038206917Smarius      <xsl:text>=0x%x</xsl:text>
1039206917Smarius    </xsl:otherwise>
1040206917Smarius  </xsl:choose>
1041206917Smarius</xsl:template>
1042206917Smarius
1043206917Smarius<xsl:template match="inbuf" mode="traceInValue">
1044206917Smarius  <xsl:param name="name"/>
1045206917Smarius  <xsl:text>, </xsl:text>
1046206917Smarius  <xsl:value-of select="$name"/>
1047206917Smarius</xsl:template>
1048206917Smarius
1049206917Smarius<xsl:template match="ptrtype" mode="traceInFormat">
1050206917Smarius  <xsl:param name="name"/>
1051206917Smarius  <xsl:variable name="child" select="child::*[position()=1]"/>
1052206917Smarius  <xsl:choose>
1053206917Smarius    <xsl:when test="name($child)='jclass'">
1054206917Smarius      <xsl:text> </xsl:text>
1055206917Smarius      <xsl:value-of select="$name"/>
1056206917Smarius      <xsl:text>=0x%x</xsl:text>
1057206917Smarius    </xsl:when>
1058206917Smarius    <xsl:otherwise>
1059206917Smarius      <xsl:apply-templates select="$child" mode="traceInFormat"/> 
1060206917Smarius    </xsl:otherwise>
1061206917Smarius  </xsl:choose>
1062206917Smarius</xsl:template>
1063206917Smarius
1064206917Smarius<xsl:template match="ptrtype" mode="traceInValue">
1065206917Smarius  <xsl:param name="name"/>
1066206917Smarius  <xsl:variable name="child" select="child::*[position()=1]"/>
1067206917Smarius  <xsl:choose>
1068206917Smarius    <xsl:when test="name($child)='jclass'">
1069206917Smarius      <xsl:text>, </xsl:text>
1070206917Smarius      <xsl:value-of select="$name"/>
1071206917Smarius    </xsl:when>
1072206917Smarius    <xsl:otherwise>
1073206917Smarius      <xsl:apply-templates select="$child" mode="traceInValue"/>
1074206917Smarius    </xsl:otherwise>
1075206917Smarius  </xsl:choose> 
1076206917Smarius</xsl:template>
1077206917Smarius
1078206917Smarius<xsl:template match="inptr" mode="traceInFormat">
1079206917Smarius  <xsl:param name="name"/>
1080206917Smarius  <xsl:text> </xsl:text>
1081206917Smarius  <xsl:value-of select="$name"/>
1082206917Smarius  <xsl:text>=0x%x</xsl:text>
1083206917Smarius</xsl:template>
1084206917Smarius
1085206917Smarius<xsl:template match="inptr" mode="traceInValue">
1086206917Smarius  <xsl:param name="name"/>
1087206917Smarius  <xsl:text>, </xsl:text>
1088206917Smarius  <xsl:value-of select="$name"/>
1089206917Smarius</xsl:template>
1090206917Smarius
1091206917Smarius<xsl:template match="jrawMonitorID|jfieldID" mode="traceInFormat">
1092206917Smarius  <xsl:param name="name"/>
1093206917Smarius  <xsl:text> </xsl:text>
1094206917Smarius  <xsl:value-of select="$name"/>
1095206917Smarius  <xsl:text>=%s</xsl:text>
1096206917Smarius</xsl:template>
1097206917Smarius
1098206917Smarius<xsl:template match="jclass" mode="traceInFormat">
1099206917Smarius  <xsl:param name="name"/>
1100206917Smarius  <!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->
1101206917Smarius  <xsl:if test="count(@method)=0">
1102206917Smarius    <xsl:text> </xsl:text>
1103206917Smarius    <xsl:value-of select="$name"/>
1104206917Smarius    <xsl:text>=%s</xsl:text>
1105206917Smarius  </xsl:if>
1106206917Smarius</xsl:template>
1107206917Smarius
1108206917Smarius<xsl:template match="jrawMonitorID" mode="traceInValue">
1109206917Smarius  <xsl:param name="name"/>
1110206917Smarius  <xsl:text>, rmonitor->get_name()</xsl:text>
1111206917Smarius</xsl:template>
1112206917Smarius
1113206917Smarius<xsl:template match="jthread" mode="traceInFormat">
1114206917Smarius  <xsl:param name="name"/>
1115206917Smarius  <!-- If we convert and test threads -->
1116206917Smarius  <xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">
1117206917Smarius    <xsl:text> </xsl:text>
1118206917Smarius    <xsl:value-of select="$name"/>
1119206917Smarius    <xsl:text>=%s</xsl:text>
1120206917Smarius  </xsl:if>
1121206917Smarius</xsl:template>
1122206917Smarius
1123206917Smarius<xsl:template match="jthread" mode="traceInValue">
1124206917Smarius  <xsl:param name="name"/>
1125206917Smarius  <!-- If we convert and test threads -->
1126206917Smarius  <xsl:if test="count(@impl)=0 or not(contains(@impl,'noconvert'))">
1127206917Smarius    <xsl:text>, 
1128206917Smarius                    JvmtiTrace::safe_get_thread_name(java_thread)</xsl:text>  
1129206917Smarius  </xsl:if>
1130206917Smarius</xsl:template>
1131206917Smarius
1132206917Smarius<xsl:template match="jframeID" mode="traceInFormat">
1133206917Smarius  <xsl:param name="name"/>
1134206917Smarius  <xsl:text>depth=%d</xsl:text>
1135206917Smarius</xsl:template>
1136206917Smarius
1137206917Smarius<xsl:template match="jframeID" mode="traceInValue">
1138206917Smarius  <xsl:param name="name"/>
1139206917Smarius  <xsl:text>, </xsl:text>
1140206917Smarius  <xsl:value-of select="$name"/>
1141206917Smarius</xsl:template>
1142206917Smarius
1143206917Smarius<xsl:template match="jclass" mode="traceInValue">
1144206917Smarius  <!-- for JVMTI a jclass/jmethodID becomes just jmethodID -->
1145206917Smarius  <xsl:if test="count(@method)=0">
1146206917Smarius    <xsl:text>, 
1147206917Smarius                    JvmtiTrace::get_class_name(k_mirror)</xsl:text>
1148206917Smarius  </xsl:if>
1149206917Smarius</xsl:template>
1150206917Smarius
1151206917Smarius<xsl:template match="jmethodID" mode="traceInFormat">
1152206917Smarius  <xsl:param name="name"/>
1153206917Smarius  <xsl:text> </xsl:text>
1154206917Smarius  <xsl:value-of select="$name"/>
1155206917Smarius  <xsl:text>=%s.%s</xsl:text>
1156206917Smarius</xsl:template>
1157206917Smarius
1158206917Smarius<xsl:template match="jmethodID" mode="traceInValue">
1159206917Smarius  <xsl:param name="name"/>
1160206917Smarius  <xsl:text>, 
1161206917Smarius                    method_oop == NULL? "NULL" : method_oop->klass_name()->as_C_string(),
1162206917Smarius                    method_oop == NULL? "NULL" : method_oop->name()->as_C_string()
1163206917Smarius             </xsl:text>
1164206917Smarius</xsl:template>
1165206917Smarius
1166206917Smarius<xsl:template match="jfieldID" mode="traceInValue">
1167206917Smarius  <xsl:param name="name"/>
1168206917Smarius  <xsl:text>, fdesc.name()->as_C_string()</xsl:text>
1169206917Smarius</xsl:template>
1170206917Smarius
1171206917Smarius<xsl:template match="enum" mode="traceInFormat">
1172206917Smarius  <xsl:param name="name"/>
1173206917Smarius  <xsl:text> </xsl:text>
1174206917Smarius  <xsl:value-of select="$name"/>
1175206917Smarius  <xsl:text>=%d:%s</xsl:text>
1176206917Smarius</xsl:template>
1177206917Smarius
1178206917Smarius<xsl:template match="enum" mode="traceInValue">
1179206917Smarius  <xsl:param name="name"/>
1180206917Smarius  <xsl:text>, </xsl:text>
1181206917Smarius  <xsl:value-of select="$name"/>
1182206917Smarius  <xsl:text>, 
1183206917Smarius                    </xsl:text>
1184206917Smarius  <xsl:choose>
1185206917Smarius    <xsl:when test=".='jvmtiError'">
1186206917Smarius      <xsl:text>JvmtiUtil::error_name(</xsl:text>
1187206917Smarius      <xsl:value-of select="$name"/>
1188206917Smarius      <xsl:text>)
1189206917Smarius</xsl:text>
1190206917Smarius    </xsl:when>
1191206917Smarius    <xsl:otherwise>
1192206917Smarius      <xsl:choose>
1193206917Smarius        <xsl:when test=".='jvmtiEvent'">
1194206917Smarius          <xsl:text>JvmtiTrace::event_name(</xsl:text>
1195206917Smarius          <xsl:value-of select="$name"/>
1196206917Smarius          <xsl:text>)
1197206917Smarius        </xsl:text>
1198206917Smarius      </xsl:when>
1199206917Smarius      <xsl:otherwise>
1200206917Smarius        <xsl:text>JvmtiTrace::enum_name(</xsl:text>
1201206917Smarius        <xsl:value-of select="."/>
1202206917Smarius        <xsl:text>ConstantNames, </xsl:text>
1203206917Smarius        <xsl:value-of select="."/>
1204206917Smarius        <xsl:text>ConstantValues, </xsl:text>
1205206917Smarius        <xsl:value-of select="$name"/>
1206206917Smarius        <xsl:text>)</xsl:text>
1207206917Smarius      </xsl:otherwise>
1208206917Smarius    </xsl:choose>
1209206917Smarius    </xsl:otherwise>
1210206917Smarius  </xsl:choose>
1211206917Smarius</xsl:template>
1212206917Smarius
1213206917Smarius<xsl:template match="jint|jlocation" mode="traceInFormat">
1214206917Smarius  <xsl:param name="name"/>
1215206917Smarius  <xsl:text> </xsl:text>
1216206917Smarius  <xsl:value-of select="$name"/>
1217206917Smarius  <xsl:text>=%d</xsl:text>
1218206917Smarius</xsl:template>
1219206917Smarius
1220206917Smarius<xsl:template match="jlong" mode="traceInFormat">
1221206917Smarius  <xsl:param name="name"/>
1222206917Smarius  <xsl:text> </xsl:text>
1223206917Smarius  <xsl:value-of select="$name"/>
1224206917Smarius  <xsl:text>=%ld</xsl:text>
1225206917Smarius</xsl:template>
1226206917Smarius
1227206917Smarius<xsl:template match="size_t" mode="traceInFormat">
1228206917Smarius  <xsl:param name="name"/>
1229206917Smarius  <xsl:text> </xsl:text>
1230206917Smarius  <xsl:value-of select="$name"/>
1231206917Smarius  <xsl:text>=0x%zx</xsl:text>
1232206917Smarius</xsl:template>
1233206917Smarius
1234206917Smarius<xsl:template match="jfloat|jdouble" mode="traceInFormat">
1235206917Smarius  <xsl:param name="name"/>
1236206917Smarius  <xsl:text> </xsl:text>
1237206917Smarius  <xsl:value-of select="$name"/>
1238206917Smarius  <xsl:text>=%f</xsl:text>
1239206917Smarius</xsl:template>
1240206917Smarius
1241206917Smarius<xsl:template match="char" mode="traceInFormat">
1242206917Smarius  <xsl:param name="name"/>
1243206917Smarius  <xsl:text> </xsl:text>
1244206917Smarius  <xsl:value-of select="$name"/>
1245206917Smarius  <xsl:text>=%c</xsl:text>
1246206917Smarius</xsl:template>
1247206917Smarius
1248206917Smarius<xsl:template match="uchar|jchar" mode="traceInFormat">
1249206917Smarius  <xsl:param name="name"/>
1250206917Smarius  <xsl:text> </xsl:text>
1251206917Smarius  <xsl:value-of select="$name"/>
1252206917Smarius  <xsl:text>=0x%x</xsl:text>
1253206917Smarius</xsl:template>
1254206917Smarius
1255206917Smarius<xsl:template match="jint|jlocation|jchar|jlong|jfloat|jdouble|char|uchar|size_t" mode="traceInValue">
1256206917Smarius  <xsl:param name="name"/>
1257206917Smarius  <xsl:text>, </xsl:text>
1258206917Smarius  <xsl:value-of select="$name"/>
1259206917Smarius</xsl:template>
1260206917Smarius
1261206917Smarius
1262206917Smarius<xsl:template match="jboolean" mode="traceInFormat">
1263206917Smarius  <xsl:param name="name"/>
1264206917Smarius  <xsl:text> </xsl:text>
1265206917Smarius  <xsl:value-of select="$name"/>
1266206917Smarius  <xsl:text>=%s</xsl:text>
1267206917Smarius</xsl:template>
1268206917Smarius
1269206917Smarius<xsl:template match="jboolean" mode="traceInValue">
1270206917Smarius  <xsl:param name="name"/>
1271206917Smarius  <xsl:text>, </xsl:text>
1272206917Smarius  <xsl:value-of select="$name"/>
1273206917Smarius  <xsl:text>? "true" : "false"</xsl:text>
1274206917Smarius</xsl:template>
1275206917Smarius
1276206917Smarius<xsl:template match="jobject|jvalue|jthreadGroup|void|struct" mode="traceInFormat">
1277206917Smarius</xsl:template>
1278206917Smarius
1279206917Smarius<xsl:template match="jobject|jvalue|jthreadGroup|void|struct" mode="traceInValue">
1280206917Smarius</xsl:template>
1281206917Smarius
1282206917Smarius
1283206917Smarius
1284206917Smarius</xsl:stylesheet>
1285206917Smarius