def dump(self, instance):
print ' if(%s) {' % instance
+ print ' Log::BeginReference("%s", %s);' % (self.type, instance)
try:
self.type.dump("*" + instance)
except NotImplementedError:
- print ' Log::TextF("%%p", %s);' % instance
+ pass
+ print ' Log::EndReference();'
print ' }'
print ' else'
print ' Log::Text("NULL");'
self.members = members
def _dump(self, instance):
- print ' Log::Text("{");'
- first = True
for type, name in self.members:
- if first:
- first = False
- else:
- print ' Log::Text(", ");'
+ print ' Log::BeginElement("%s", "%s");' % (type, name)
type.dump('(%s).%s' % (instance, name))
- print ' Log::Text("}");'
+ print ' Log::EndElement();'
class Alias(Type):
print ' %s result;' % method.type
result = 'result = '
print ' Log::BeginCall("%s");' % (self.name + '::' + method.name)
- print ' Log::BeginParam("this", "%s *");' % self.name
+ print ' Log::BeginArg("%s *", "this");' % self.name
print ' Log::TextF("%p", m_pInstance);'
- print ' Log::EndParam();'
+ print ' Log::EndArg();'
for type, name in method.args:
if not type.isoutput():
type.unwrap_instance(name)
- print ' Log::BeginParam("%s", "%s");' % (name, type)
+ print ' Log::BeginArg("%s", "%s");' % (type, name)
type.dump(name)
- print ' Log::EndParam();'
+ print ' Log::EndArg();'
print ' %sm_pInstance->%s(%s);' % (result, method.name, ', '.join([str(name) for type, name in method.args]))
for type, name in method.args:
if type.isoutput():
- print ' Log::BeginParam("%s", "%s");' % (name, type)
+ print ' Log::BeginArg("%s", "%s");' % (type, name)
type.dump(name)
- print ' Log::EndParam();'
+ print ' Log::EndArg();'
type.wrap_instance(name)
if method.type is not Void:
print ' Log::BeginReturn("%s");' % method.type
<xsl:template match="call">
<xsl:value-of select="@name"/>
<xsl:text>(</xsl:text>
- <xsl:apply-templates select="param"/>
+ <xsl:apply-templates select="arg"/>
<xsl:text>)</xsl:text>
- <xsl:apply-templates select="return"/>
+ <xsl:apply-templates select="ret"/>
<xsl:text> </xsl:text>
</xsl:template>
- <xsl:template match="param">
+ <xsl:template match="arg|elem">
<xsl:value-of select="@name"/>
<xsl:text> = </xsl:text>
- <xsl:value-of select="."/>
+ <xsl:call-template name="compound"/>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:template>
- <xsl:template match="return">
+ <xsl:template match="ret">
<xsl:text> = </xsl:text>
- <xsl:value-of select="."/>
+ <xsl:call-template name="compound"/>
</xsl:template>
+ <xsl:template match="ref">
+ <xsl:choose>
+ <xsl:when test="*">
+ <xsl:text>&</xsl:text>
+ <xsl:call-template name="compound"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@addr"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="compound">
+ <xsl:choose>
+ <xsl:when test="elem">
+ <xsl:text>{</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>}</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
</xsl:transform>
text-align : left;
}
-ul {
+ul.calls {
list-style: none;
margin-left: 0px;
padding-left: 0px;
}
+ul.args {
+ display:inline;
+ list-style: none;
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+ul.args li {
+ display:inline;
+}
+
+ul.elems {
+ list-style: none;
+ margin-left: 2em;
+ padding-left: 0px;
+}
+
+ul.elems li {
+ display:block;
+}
+
.fun {
font-weight: bold;
}
.lit {
color: #0000ff;
}
+
+.addr {
+ color: #008000;
+}
+
+.ref {
+ position: relative;
+}
+
+.def {
+ display: none;
+ position: absolute;
+ top: 1.5em;
+ left: 0;
+ width: 32em;
+ background: #f7f7f7;
+}
+
+.ref:hover .def {
+ display: block;
+}
+
<xsl:output method="html" />
+ <xsl:strip-space elements="*" />
+
<xsl:template match="/trace">
<html>
<head>
<link rel="stylesheet" type="text/css" href="d3dtrace.css"/>
</head>
<body>
- <ul>
+ <ul class="calls">
<xsl:apply-templates/>
</ul>
</body>
<xsl:value-of select="@name"/>
</span>
<xsl:text>(</xsl:text>
- <xsl:apply-templates select="param"/>
+ <ul class="args">
+ <xsl:apply-templates select="arg"/>
+ </ul>
<xsl:text>)</xsl:text>
- <xsl:apply-templates select="return"/>
+ <xsl:apply-templates select="ret"/>
</li>
</xsl:template>
- <xsl:template match="param">
- <span class="typ">
- <xsl:value-of select="@type"/>
- <xsl:text> </xsl:text>
- </span>
+ <xsl:template match="arg|elem">
+ <li>
+ <xsl:apply-templates select="@type"/>
+ <xsl:apply-templates select="@name"/>
+ <xsl:text> = </xsl:text>
+ <xsl:call-template name="compound"/>
+ <xsl:if test="position() != last()">
+ <xsl:text>, </xsl:text>
+ </xsl:if>
+ </li>
+ </xsl:template>
+
+ <xsl:template match="@type">
+ <xsl:attribute name="title">
+ <xsl:value-of select="."/>
+ </xsl:attribute>
+ </xsl:template>
+
+ <xsl:template match="@name">
<span class="var">
- <xsl:value-of select="@name"/>
+ <xsl:value-of select="."/>
</span>
+ </xsl:template>
+
+ <xsl:template match="ret">
<xsl:text> = </xsl:text>
- <span class="lit">
+ <xsl:call-template name="compound"/>
+ </xsl:template>
+
+ <xsl:template match="ref">
+ <xsl:choose>
+ <xsl:when test="elem">
+ <span class="ref">
+ <xsl:apply-templates select="@addr"/>
+ <span class="def">
+ <xsl:call-template name="compound"/>
+ </span>
+ </span>
+ </xsl:when>
+ <xsl:when test="*">
+ <xsl:text>&</xsl:text>
+ <xsl:apply-templates />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@addr"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="@addr">
+ <span class="addr">
<xsl:value-of select="."/>
</span>
- <xsl:if test="position() != last()">
- <xsl:text>, </xsl:text>
- </xsl:if>
</xsl:template>
- <xsl:template match="return">
- <xsl:text> = </xsl:text>
+ <xsl:template match="text()">
<span class="lit">
<xsl:value-of select="."/>
</span>
</xsl:template>
+ <xsl:template name="compound">
+ <xsl:choose>
+ <xsl:when test="elem">
+ <xsl:text>{</xsl:text>
+ <ul class="elems">
+ <xsl:apply-templates />
+ </ul>
+ <xsl:text>}</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
</xsl:transform>
Write(s);
}
+
+DWORD g_dwIndent = 0;
+
void NewLine(void) {
Write("\r\n");
+ for(unsigned i = 0; i < g_dwIndent; ++i)
+ Write("\t");
}
void Tag(const char *name) {
Write("<");
Write(name);
Write(">");
+ ++g_dwIndent;
}
void BeginTag(const char *name,
Write("=\"");
Escape(value1);
Write("\">");
+ ++g_dwIndent;
}
void BeginTag(const char *name,
Write("=\"");
Escape(value2);
Write("\">");
+ ++g_dwIndent;
+}
+
+void BeginTag(const char *name,
+ const char *attr1, const char *value1,
+ const char *attr2, const char *value2,
+ const char *attr3, const char *value3) {
+ Write("<");
+ Write(name);
+ Write(" ");
+ Write(attr1);
+ Write("=\"");
+ Escape(value1);
+ Write("\" ");
+ Write(attr2);
+ Write("=\"");
+ Escape(value2);
+ Write("\" ");
+ Write(attr3);
+ Write("=\"");
+ Escape(value3);
+ Write("\">");
+ ++g_dwIndent;
}
void EndTag(const char *name) {
+ --g_dwIndent;
Write("</");
Write(name);
Write(">");
}
void BeginCall(const char *function) {
- Write("\t");
BeginTag("call", "name", function);
NewLine();
}
void EndCall(void) {
- Write("\t");
EndTag("call");
NewLine();
}
-void BeginParam(const char *name, const char *type) {
- Write("\t\t");
- BeginTag("param", "name", name, "type", type);
+void BeginArg(const char *type, const char *name) {
+ BeginTag("arg", "type", type, "name", name);
}
-void EndParam(void) {
- EndTag("param");
+void EndArg(void) {
+ EndTag("arg");
NewLine();
}
void BeginReturn(const char *type) {
- Write("\t\t");
- BeginTag("return", "type", type);
+ BeginTag("ret", "type", type);
}
void EndReturn(void) {
- EndTag("return");
+ EndTag("ret");
NewLine();
}
+void BeginElement(const char *type, const char *name) {
+ BeginTag("elem", "type", type, "name", name);
+}
+
+void BeginElement(const char *type) {
+ BeginTag("elem", "type", type);
+}
+
+void EndElement(void) {
+ EndTag("elem");
+}
+
+void BeginReference(const char *type, const void *addr) {
+ char saddr[256];
+ _snprintf(saddr, sizeof(saddr), "%p", addr);
+ BeginTag("ref", "type", type, "addr", saddr);
+}
+
+void EndReference(void) {
+ EndTag("ref");
+}
+
void DumpString(const char *str) {
const unsigned char *p = (const unsigned char *)str;
Log::Text("\"");
void Close(void);
void NewLine(void);
+
void Tag(const char *name);
void BeginTag(const char *name);
void BeginTag(const char *name,
const char *attr1, const char *value1,
const char *attr2, const char *value2);
void EndTag(const char *name);
+
void Text(const char *text);
void TextF(const char *format, ...);
+
void BeginCall(const char *function);
void EndCall(void);
- void BeginParam(const char *name, const char *type);
- void EndParam(void);
+
+ void BeginArg(const char *type, const char *name);
+ void EndArg(void);
+
void BeginReturn(const char *type);
void EndReturn(void);
+ void BeginElement(const char *type);
+ void BeginElement(const char *type, const char *name);
+ void EndElement(void);
+
+ void BeginReference(const char *type, const void *addr);
+ void EndReference(void);
+
void DumpString(const char *str);
+
}
#endif /* _LOG_HPP_ */