evmc/example__vm_8c.html
Documentation Bot 9b3a656372 Update docs
2020-01-07 15:35:10 +00:00

208 lines
18 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>EVMC: examples/example_vm/example_vm.c File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">EVMC
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',false,false,'search.php','Search');
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('example__vm_8c.html','');});
</script>
<div id="doc-content">
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">example_vm.c File Reference</div> </div>
</div><!--header-->
<div class="contents">
<p>Example implementation of the EVMC VM interface.
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &quot;example_vm.h&quot;</code><br />
<code>#include &lt;limits.h&gt;</code><br />
<code>#include &lt;stdio.h&gt;</code><br />
<code>#include &lt;stdlib.h&gt;</code><br />
<code>#include &lt;string.h&gt;</code><br />
</div>
<p><a href="example__vm_8c_source.html">Go to the source code of this file.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structexample__vm.html">example_vm</a></td></tr>
<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">The example VM instance struct extending the <a class="el" href="structevmc__vm.html" title="The VM instance. ">evmc_vm</a>. <a href="structexample__vm.html#details">More...</a><br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:a07cb493fd4082e7b5024987eb09b2c2d"><td class="memItemLeft" align="right" valign="top"><a id="a07cb493fd4082e7b5024987eb09b2c2d"></a>
static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="example__vm_8c.html#a07cb493fd4082e7b5024987eb09b2c2d">destroy</a> (struct <a class="el" href="structevmc__vm.html">evmc_vm</a> *vm)</td></tr>
<tr class="memdesc:a07cb493fd4082e7b5024987eb09b2c2d"><td class="mdescLeft">&#160;</td><td class="mdescRight">The implementation of the <a class="el" href="structevmc__vm.html#ac78933134b4e14ca3dd4139ee061cc6b" title="Pointer to function destroying the VM instance. ">evmc_vm::destroy()</a> method. <br /></td></tr>
<tr class="separator:a07cb493fd4082e7b5024987eb09b2c2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a50f89a54757a1c5a5639b1a25dc36b24"><td class="memItemLeft" align="right" valign="top"><a id="a50f89a54757a1c5a5639b1a25dc36b24"></a>
static <a class="el" href="group__EVMC.html#ga714bc8ca946adc759403fe072bdd2aa0">evmc_capabilities_flagset</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="example__vm_8c.html#a50f89a54757a1c5a5639b1a25dc36b24">get_capabilities</a> (struct <a class="el" href="structevmc__vm.html">evmc_vm</a> *vm)</td></tr>
<tr class="memdesc:a50f89a54757a1c5a5639b1a25dc36b24"><td class="mdescLeft">&#160;</td><td class="mdescRight">The example implementation of the <a class="el" href="structevmc__vm.html#a505d4e584a858c2eea7a026f3a94188b" title="A method returning capabilities supported by the VM instance. ">evmc_vm::get_capabilities()</a> method. <br /></td></tr>
<tr class="separator:a50f89a54757a1c5a5639b1a25dc36b24"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af797672c8f7215833fb7958adae8bc87"><td class="memItemLeft" align="right" valign="top">static enum <a class="el" href="group__EVMC.html#ga28d9f527bda67277bccccc100e32260a">evmc_set_option_result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="example__vm_8c.html#af797672c8f7215833fb7958adae8bc87">set_option</a> (struct <a class="el" href="structevmc__vm.html">evmc_vm</a> *instance, const char *name, const char *value)</td></tr>
<tr class="memdesc:af797672c8f7215833fb7958adae8bc87"><td class="mdescLeft">&#160;</td><td class="mdescRight">Example VM options. <a href="#af797672c8f7215833fb7958adae8bc87">More...</a><br /></td></tr>
<tr class="separator:af797672c8f7215833fb7958adae8bc87"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a556f3e9da8ef4b48511b293736455325"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="example__vm_8c.html#a556f3e9da8ef4b48511b293736455325">free_result_output_data</a> (const struct <a class="el" href="structevmc__result.html">evmc_result</a> *result)</td></tr>
<tr class="memdesc:a556f3e9da8ef4b48511b293736455325"><td class="mdescLeft">&#160;</td><td class="mdescRight">The implementation of the <a class="el" href="structevmc__result.html#a8727ff83d372ab0067bcf6656d30b0ed" title="The method releasing all resources associated with the result object. ">evmc_result::release()</a> method that frees the output buffer attached to the result object. <a href="#a556f3e9da8ef4b48511b293736455325">More...</a><br /></td></tr>
<tr class="separator:a556f3e9da8ef4b48511b293736455325"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a0cbe68a4a210c8227ceeb03789786b9c"><td class="memItemLeft" align="right" valign="top"><a id="a0cbe68a4a210c8227ceeb03789786b9c"></a>
static struct <a class="el" href="structevmc__result.html">evmc_result</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="example__vm_8c.html#a0cbe68a4a210c8227ceeb03789786b9c">execute</a> (struct <a class="el" href="structevmc__vm.html">evmc_vm</a> *instance, const struct <a class="el" href="structevmc__host__interface.html">evmc_host_interface</a> *host, struct <a class="el" href="structevmc__host__context.html">evmc_host_context</a> *context, enum <a class="el" href="group__EVMC.html#gae5759b1590071966ccf6a505b52a0ef7">evmc_revision</a> rev, const struct <a class="el" href="structevmc__message.html">evmc_message</a> *msg, const uint8_t *code, size_t code_size)</td></tr>
<tr class="memdesc:a0cbe68a4a210c8227ceeb03789786b9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">The example implementation of the <a class="el" href="structevmc__vm.html#a8384d28338f2287a9f9e1508699c53f0" title="Pointer to function executing a code by the VM instance. ">evmc_vm::execute()</a> method. <br /></td></tr>
<tr class="separator:a0cbe68a4a210c8227ceeb03789786b9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad7290bda71455f4a7175589b05945adf"><td class="memItemLeft" align="right" valign="top">struct <a class="el" href="structevmc__vm.html">evmc_vm</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__EVMC.html#gad7290bda71455f4a7175589b05945adf">evmc_create_example_vm</a> ()</td></tr>
<tr class="memdesc:gad7290bda71455f4a7175589b05945adf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Example of a function creating an instance of an example EVM implementation. <a href="group__EVMC.html#gad7290bda71455f4a7175589b05945adf">More...</a><br /></td></tr>
<tr class="separator:gad7290bda71455f4a7175589b05945adf"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<div class="textblock"><p>Example implementation of the EVMC VM interface. </p>
<p>This VM does not do anything useful except for showing how EVMC VM API should be implemented. The implementation is done in C only, but could be done in C++ in very similar way. </p>
<p class="definition">Definition in file <a class="el" href="example__vm_8c_source.html">example_vm.c</a>.</p>
</div><h2 class="groupheader">Function Documentation</h2>
<a id="a556f3e9da8ef4b48511b293736455325"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a556f3e9da8ef4b48511b293736455325">&#9670;&nbsp;</a></span>free_result_output_data()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">static void free_result_output_data </td>
<td>(</td>
<td class="paramtype">const struct <a class="el" href="structevmc__result.html">evmc_result</a> *&#160;</td>
<td class="paramname"><em>result</em></td><td>)</td>
<td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>The implementation of the <a class="el" href="structevmc__result.html#a8727ff83d372ab0067bcf6656d30b0ed" title="The method releasing all resources associated with the result object. ">evmc_result::release()</a> method that frees the output buffer attached to the result object. </p>
<p class="definition">Definition at line <a class="el" href="example__vm_8c_source.html#l00071">71</a> of file <a class="el" href="example__vm_8c_source.html">example_vm.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160;{</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; free((uint8_t*)result-&gt;<a class="code" href="structevmc__result.html#a61978e85f9d795a7b9695b9cbf1748d6">output_data</a>);</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160;}</div><div class="ttc" id="structevmc__result_html_a61978e85f9d795a7b9695b9cbf1748d6"><div class="ttname"><a href="structevmc__result.html#a61978e85f9d795a7b9695b9cbf1748d6">evmc_result::output_data</a></div><div class="ttdeci">const uint8_t * output_data</div><div class="ttdoc">The reference to output data. </div><div class="ttdef"><b>Definition:</b> <a href="evmc_8h_source.html#l00364">evmc.h:364</a></div></div>
</div><!-- fragment -->
</div>
</div>
<a id="af797672c8f7215833fb7958adae8bc87"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af797672c8f7215833fb7958adae8bc87">&#9670;&nbsp;</a></span>set_option()</h2>
<div class="memitem">
<div class="memproto">
<table class="mlabels">
<tr>
<td class="mlabels-left">
<table class="memname">
<tr>
<td class="memname">static enum <a class="el" href="group__EVMC.html#ga28d9f527bda67277bccccc100e32260a">evmc_set_option_result</a> set_option </td>
<td>(</td>
<td class="paramtype">struct <a class="el" href="structevmc__vm.html">evmc_vm</a> *&#160;</td>
<td class="paramname"><em>instance</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>name</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const char *&#160;</td>
<td class="paramname"><em>value</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</td>
<td class="mlabels-right">
<span class="mlabels"><span class="mlabel">static</span></span> </td>
</tr>
</table>
</div><div class="memdoc">
<p>Example VM options. </p>
<p>The implementation of the <a class="el" href="structevmc__vm.html#a20fd85c822ba5f3296206fc8fe3e90b2" title="Optional pointer to function modifying VM&#39;s options. ">evmc_vm::set_option()</a> method. VMs are allowed to omit this method implementation. </p>
<p class="definition">Definition at line <a class="el" href="example__vm_8c_source.html#l00046">46</a> of file <a class="el" href="example__vm_8c_source.html">example_vm.c</a>.</p>
<div class="fragment"><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160;{</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <span class="keyword">struct </span><a class="code" href="structexample__vm.html">example_vm</a>* vm = (<span class="keyword">struct </span><a class="code" href="structexample__vm.html">example_vm</a>*)instance;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; <span class="keywordflow">if</span> (strcmp(name, <span class="stringliteral">&quot;verbose&quot;</span>) == 0)</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160; {</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <span class="keywordflow">if</span> (!value)</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <span class="keywordflow">return</span> EVMC_SET_OPTION_INVALID_VALUE;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160; <span class="keywordtype">char</span>* end = NULL;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <span class="keywordtype">long</span> <span class="keywordtype">int</span> v = strtol(value, &amp;end, 0);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <span class="keywordflow">if</span> (end == value) <span class="comment">// Parsing the value failed.</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; <span class="keywordflow">return</span> EVMC_SET_OPTION_INVALID_VALUE;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160; <span class="keywordflow">if</span> (v &gt; 9 || v &lt; -1) <span class="comment">// Not in the valid range.</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <span class="keywordflow">return</span> EVMC_SET_OPTION_INVALID_VALUE;</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>&#160; vm-&gt;<a class="code" href="structexample__vm.html#a6c3e1b440e68f4cc81ca0b50040dbf74">verbose</a> = (int)v;</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>&#160; <span class="keywordflow">return</span> EVMC_SET_OPTION_SUCCESS;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>&#160; }</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160; <span class="keywordflow">return</span> EVMC_SET_OPTION_INVALID_NAME;</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;}</div><div class="ttc" id="structexample__vm_html"><div class="ttname"><a href="structexample__vm.html">example_vm</a></div><div class="ttdoc">The example VM instance struct extending the evmc_vm. </div><div class="ttdef"><b>Definition:</b> <a href="example__vm_8c_source.html#l00023">example_vm.c:23</a></div></div>
<div class="ttc" id="structexample__vm_html_a6c3e1b440e68f4cc81ca0b50040dbf74"><div class="ttname"><a href="structexample__vm.html#a6c3e1b440e68f4cc81ca0b50040dbf74">example_vm::verbose</a></div><div class="ttdeci">int verbose</div><div class="ttdoc">The verbosity level. </div><div class="ttdef"><b>Definition:</b> <a href="example__vm_8c_source.html#l00026">example_vm.c:26</a></div></div>
</div><!-- fragment -->
</div>
</div>
</div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_d28a4824dc47e487b107a5db32ef43c4.html">examples</a></li><li class="navelem"><a class="el" href="dir_a4c70ffacb2f8014d25282b0828660d1.html">example_vm</a></li><li class="navelem"><a class="el" href="example__vm_8c.html">example_vm.c</a></li>
<li class="footer">Generated on Tue Jan 7 2020 15:35:10 for EVMC by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
</ul>
</div>
</body>
</html>