fix crash when encoding Error object

This commit is contained in:
ekibun
2022-03-13 13:51:17 +08:00
parent 8b279c2926
commit 819186399e
62 changed files with 1117 additions and 4929 deletions

View File

@@ -6,6 +6,11 @@
* @LastEditTime: 2020-12-02 11:36:40 * @LastEditTime: 2020-12-02 11:36:40
--> -->
## 0.3.7
* fixed crash when encoding Error object
* updated to latest quickjs
## 0.3.6 ## 0.3.6
* upgrade ffi to 1.0.0. * upgrade ffi to 1.0.0.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 B

View File

@@ -1,519 +0,0 @@
/* All views: initial background and text color */
body
{
color: #000000;
background-color: #FFFFFF;
}
/* All views: standard link format*/
a:link
{
color: #284FA8;
text-decoration: underline;
}
/* All views: standard link - visited format */
a:visited
{
color: #00CB40;
text-decoration: underline;
}
/* All views: standard link - activated format */
a:active
{
color: #FF0040;
text-decoration: underline;
}
/* All views: main title format */
td.title
{
text-align: center;
padding-bottom: 10px;
font-family: sans-serif;
font-size: 20pt;
font-style: italic;
font-weight: bold;
}
/* All views: header item format */
td.headerItem
{
text-align: right;
padding-right: 6px;
font-family: sans-serif;
font-weight: bold;
vertical-align: top;
white-space: nowrap;
}
/* All views: header item value format */
td.headerValue
{
text-align: left;
color: #284FA8;
font-family: sans-serif;
font-weight: bold;
white-space: nowrap;
}
/* All views: header item coverage table heading */
td.headerCovTableHead
{
text-align: center;
padding-right: 6px;
padding-left: 6px;
padding-bottom: 0px;
font-family: sans-serif;
font-size: 80%;
white-space: nowrap;
}
/* All views: header item coverage table entry */
td.headerCovTableEntry
{
text-align: right;
color: #284FA8;
font-family: sans-serif;
font-weight: bold;
white-space: nowrap;
padding-left: 12px;
padding-right: 4px;
background-color: #DAE7FE;
}
/* All views: header item coverage table entry for high coverage rate */
td.headerCovTableEntryHi
{
text-align: right;
color: #000000;
font-family: sans-serif;
font-weight: bold;
white-space: nowrap;
padding-left: 12px;
padding-right: 4px;
background-color: #A7FC9D;
}
/* All views: header item coverage table entry for medium coverage rate */
td.headerCovTableEntryMed
{
text-align: right;
color: #000000;
font-family: sans-serif;
font-weight: bold;
white-space: nowrap;
padding-left: 12px;
padding-right: 4px;
background-color: #FFEA20;
}
/* All views: header item coverage table entry for ow coverage rate */
td.headerCovTableEntryLo
{
text-align: right;
color: #000000;
font-family: sans-serif;
font-weight: bold;
white-space: nowrap;
padding-left: 12px;
padding-right: 4px;
background-color: #FF0000;
}
/* All views: header legend value for legend entry */
td.headerValueLeg
{
text-align: left;
color: #000000;
font-family: sans-serif;
font-size: 80%;
white-space: nowrap;
padding-top: 4px;
}
/* All views: color of horizontal ruler */
td.ruler
{
background-color: #6688D4;
}
/* All views: version string format */
td.versionInfo
{
text-align: center;
padding-top: 2px;
font-family: sans-serif;
font-style: italic;
}
/* Directory view/File view (all)/Test case descriptions:
table headline format */
td.tableHead
{
text-align: center;
color: #FFFFFF;
background-color: #6688D4;
font-family: sans-serif;
font-size: 120%;
font-weight: bold;
white-space: nowrap;
padding-left: 4px;
padding-right: 4px;
}
span.tableHeadSort
{
padding-right: 4px;
}
/* Directory view/File view (all): filename entry format */
td.coverFile
{
text-align: left;
padding-left: 10px;
padding-right: 20px;
color: #284FA8;
background-color: #DAE7FE;
font-family: monospace;
}
/* Directory view/File view (all): bar-graph entry format*/
td.coverBar
{
padding-left: 10px;
padding-right: 10px;
background-color: #DAE7FE;
}
/* Directory view/File view (all): bar-graph outline color */
td.coverBarOutline
{
background-color: #000000;
}
/* Directory view/File view (all): percentage entry for files with
high coverage rate */
td.coverPerHi
{
text-align: right;
padding-left: 10px;
padding-right: 10px;
background-color: #A7FC9D;
font-weight: bold;
font-family: sans-serif;
}
/* Directory view/File view (all): line count entry for files with
high coverage rate */
td.coverNumHi
{
text-align: right;
padding-left: 10px;
padding-right: 10px;
background-color: #A7FC9D;
white-space: nowrap;
font-family: sans-serif;
}
/* Directory view/File view (all): percentage entry for files with
medium coverage rate */
td.coverPerMed
{
text-align: right;
padding-left: 10px;
padding-right: 10px;
background-color: #FFEA20;
font-weight: bold;
font-family: sans-serif;
}
/* Directory view/File view (all): line count entry for files with
medium coverage rate */
td.coverNumMed
{
text-align: right;
padding-left: 10px;
padding-right: 10px;
background-color: #FFEA20;
white-space: nowrap;
font-family: sans-serif;
}
/* Directory view/File view (all): percentage entry for files with
low coverage rate */
td.coverPerLo
{
text-align: right;
padding-left: 10px;
padding-right: 10px;
background-color: #FF0000;
font-weight: bold;
font-family: sans-serif;
}
/* Directory view/File view (all): line count entry for files with
low coverage rate */
td.coverNumLo
{
text-align: right;
padding-left: 10px;
padding-right: 10px;
background-color: #FF0000;
white-space: nowrap;
font-family: sans-serif;
}
/* File view (all): "show/hide details" link format */
a.detail:link
{
color: #B8D0FF;
font-size:80%;
}
/* File view (all): "show/hide details" link - visited format */
a.detail:visited
{
color: #B8D0FF;
font-size:80%;
}
/* File view (all): "show/hide details" link - activated format */
a.detail:active
{
color: #FFFFFF;
font-size:80%;
}
/* File view (detail): test name entry */
td.testName
{
text-align: right;
padding-right: 10px;
background-color: #DAE7FE;
font-family: sans-serif;
}
/* File view (detail): test percentage entry */
td.testPer
{
text-align: right;
padding-left: 10px;
padding-right: 10px;
background-color: #DAE7FE;
font-family: sans-serif;
}
/* File view (detail): test lines count entry */
td.testNum
{
text-align: right;
padding-left: 10px;
padding-right: 10px;
background-color: #DAE7FE;
font-family: sans-serif;
}
/* Test case descriptions: test name format*/
dt
{
font-family: sans-serif;
font-weight: bold;
}
/* Test case descriptions: description table body */
td.testDescription
{
padding-top: 10px;
padding-left: 30px;
padding-bottom: 10px;
padding-right: 30px;
background-color: #DAE7FE;
}
/* Source code view: function entry */
td.coverFn
{
text-align: left;
padding-left: 10px;
padding-right: 20px;
color: #284FA8;
background-color: #DAE7FE;
font-family: monospace;
}
/* Source code view: function entry zero count*/
td.coverFnLo
{
text-align: right;
padding-left: 10px;
padding-right: 10px;
background-color: #FF0000;
font-weight: bold;
font-family: sans-serif;
}
/* Source code view: function entry nonzero count*/
td.coverFnHi
{
text-align: right;
padding-left: 10px;
padding-right: 10px;
background-color: #DAE7FE;
font-weight: bold;
font-family: sans-serif;
}
/* Source code view: source code format */
pre.source
{
font-family: monospace;
white-space: pre;
margin-top: 2px;
}
/* Source code view: line number format */
span.lineNum
{
background-color: #EFE383;
}
/* Source code view: format for lines which were executed */
td.lineCov,
span.lineCov
{
background-color: #CAD7FE;
}
/* Source code view: format for Cov legend */
span.coverLegendCov
{
padding-left: 10px;
padding-right: 10px;
padding-bottom: 2px;
background-color: #CAD7FE;
}
/* Source code view: format for lines which were not executed */
td.lineNoCov,
span.lineNoCov
{
background-color: #FF6230;
}
/* Source code view: format for NoCov legend */
span.coverLegendNoCov
{
padding-left: 10px;
padding-right: 10px;
padding-bottom: 2px;
background-color: #FF6230;
}
/* Source code view (function table): standard link - visited format */
td.lineNoCov > a:visited,
td.lineCov > a:visited
{
color: black;
text-decoration: underline;
}
/* Source code view: format for lines which were executed only in a
previous version */
span.lineDiffCov
{
background-color: #B5F7AF;
}
/* Source code view: format for branches which were executed
* and taken */
span.branchCov
{
background-color: #CAD7FE;
}
/* Source code view: format for branches which were executed
* but not taken */
span.branchNoCov
{
background-color: #FF6230;
}
/* Source code view: format for branches which were not executed */
span.branchNoExec
{
background-color: #FF6230;
}
/* Source code view: format for the source code heading line */
pre.sourceHeading
{
white-space: pre;
font-family: monospace;
font-weight: bold;
margin: 0px;
}
/* All views: header legend value for low rate */
td.headerValueLegL
{
font-family: sans-serif;
text-align: center;
white-space: nowrap;
padding-left: 4px;
padding-right: 2px;
background-color: #FF0000;
font-size: 80%;
}
/* All views: header legend value for med rate */
td.headerValueLegM
{
font-family: sans-serif;
text-align: center;
white-space: nowrap;
padding-left: 2px;
padding-right: 2px;
background-color: #FFEA20;
font-size: 80%;
}
/* All views: header legend value for hi rate */
td.headerValueLegH
{
font-family: sans-serif;
text-align: center;
white-space: nowrap;
padding-left: 2px;
padding-right: 4px;
background-color: #A7FC9D;
font-size: 80%;
}
/* All views except source code view: legend format for low coverage */
span.coverLegendCovLo
{
padding-left: 10px;
padding-right: 10px;
padding-top: 2px;
background-color: #FF0000;
}
/* All views except source code view: legend format for med coverage */
span.coverLegendCovMed
{
padding-left: 10px;
padding-right: 10px;
padding-top: 2px;
background-color: #FFEA20;
}
/* All views except source code view: legend format for hi coverage */
span.coverLegendCovHi
{
padding-left: 10px;
padding-right: 10px;
padding-top: 2px;
background-color: #A7FC9D;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 B

View File

@@ -1,93 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info</title>
<link rel="stylesheet" type="text/css" href="gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue">top level</td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">652</td>
<td class="headerCovTableEntry">736</td>
<td class="headerCovTableEntryMed">88.6 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="80%" cellpadding=1 cellspacing=1 border=0>
<tr>
<td width="50%"><br></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td class="tableHead">Directory <span class="tableHeadSort"><a href="index.html"><img src="updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
<td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
<td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
</tr>
<tr>
<td class="coverFile"><a href="src/index.html">src</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=89 height=10 alt="88.6%"><img src="snow.png" width=11 height=10 alt="88.6%"></td></tr></table>
</td>
<td class="coverPerMed">88.6&nbsp;%</td>
<td class="coverNumMed">652 / 736</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
</table>
</center>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,93 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info</title>
<link rel="stylesheet" type="text/css" href="gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue">top level</td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">652</td>
<td class="headerCovTableEntry">736</td>
<td class="headerCovTableEntryMed">88.6 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="80%" cellpadding=1 cellspacing=1 border=0>
<tr>
<td width="50%"><br></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td class="tableHead">Directory <span class="tableHeadSort"><a href="index.html"><img src="updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
<td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
<td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
</tr>
<tr>
<td class="coverFile"><a href="src/index.html">src</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=89 height=10 alt="88.6%"><img src="snow.png" width=11 height=10 alt="88.6%"></td></tr></table>
</td>
<td class="coverPerMed">88.6&nbsp;%</td>
<td class="coverNumMed">652 / 736</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
</table>
</center>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,93 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info</title>
<link rel="stylesheet" type="text/css" href="gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue">top level</td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">652</td>
<td class="headerCovTableEntry">736</td>
<td class="headerCovTableEntryMed">88.6 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="80%" cellpadding=1 cellspacing=1 border=0>
<tr>
<td width="50%"><br></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td class="tableHead">Directory <span class="tableHeadSort"><img src="glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
<td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
<td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
</tr>
<tr>
<td class="coverFile"><a href="src/index.html">src</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="amber.png" width=89 height=10 alt="88.6%"><img src="snow.png" width=11 height=10 alt="88.6%"></td></tr></table>
</td>
<td class="coverPerMed">88.6&nbsp;%</td>
<td class="coverNumMed">652 / 736</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
</table>
</center>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 B

View File

@@ -1,72 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/engine.dart - functions</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - engine.dart<span style="font-size: 80%;"> (<a href="engine.dart.gcov.html">source</a> / functions)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">67</td>
<td class="headerCovTableEntry">81</td>
<td class="headerCovTableEntryMed">82.7 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="60%" cellpadding=1 cellspacing=1 border=0>
<tr><td><br></td></tr>
<tr>
<td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="engine.dart.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
</table>
<br>
</center>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,72 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/engine.dart - functions</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - engine.dart<span style="font-size: 80%;"> (<a href="engine.dart.gcov.html">source</a> / functions)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">67</td>
<td class="headerCovTableEntry">81</td>
<td class="headerCovTableEntryMed">82.7 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="60%" cellpadding=1 cellspacing=1 border=0>
<tr><td><br></td></tr>
<tr>
<td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="engine.dart.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
</table>
<br>
</center>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,248 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/engine.dart</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - engine.dart<span style="font-size: 80%;"> (source / <a href="engine.dart.func-sort-c.html">functions</a>)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">67</td>
<td class="headerCovTableEntry">81</td>
<td class="headerCovTableEntryMed">82.7 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td><br></td>
</tr>
<tr>
<td>
<pre class="sourceHeading"> Line data Source code</pre>
<pre class="source">
<a name="1"><span class="lineNum"> 1 </span> : /*</a>
<a name="2"><span class="lineNum"> 2 </span> : * @Description: quickjs engine</a>
<a name="3"><span class="lineNum"> 3 </span> : * @Author: ekibun</a>
<a name="4"><span class="lineNum"> 4 </span> : * @Date: 2020-08-08 08:29:09</a>
<a name="5"><span class="lineNum"> 5 </span> : * @LastEditors: ekibun</a>
<a name="6"><span class="lineNum"> 6 </span> : * @LastEditTime: 2020-10-06 23:47:13</a>
<a name="7"><span class="lineNum"> 7 </span> : */</a>
<a name="8"><span class="lineNum"> 8 </span> : part of '../flutter_qjs.dart';</a>
<a name="9"><span class="lineNum"> 9 </span> : </a>
<a name="10"><span class="lineNum"> 10 </span> : /// Handler function to manage js module.</a>
<a name="11"><span class="lineNum"> 11 </span> : typedef _JsModuleHandler = String Function(String name);</a>
<a name="12"><span class="lineNum"> 12 </span> : </a>
<a name="13"><span class="lineNum"> 13 </span> : /// Handler to manage unhandled promise rejection.</a>
<a name="14"><span class="lineNum"> 14 </span> : typedef _JsHostPromiseRejectionHandler = void Function(dynamic reason);</a>
<a name="15"><span class="lineNum"> 15 </span> : </a>
<a name="16"><span class="lineNum"> 16 </span> : /// Quickjs engine for flutter.</a>
<a name="17"><span class="lineNum"> 17 </span> : class FlutterQjs {</a>
<a name="18"><span class="lineNum"> 18 </span> : Pointer&lt;JSRuntime&gt;? _rt;</a>
<a name="19"><span class="lineNum"> 19 </span> : Pointer&lt;JSContext&gt;? _ctx;</a>
<a name="20"><span class="lineNum"> 20 </span> : </a>
<a name="21"><span class="lineNum"> 21 </span> : /// Max stack size for quickjs.</a>
<a name="22"><span class="lineNum"> 22 </span> : final int? stackSize;</a>
<a name="23"><span class="lineNum"> 23 </span> : </a>
<a name="24"><span class="lineNum"> 24 </span> : /// Message Port for event loop. Close it to stop dispatching event loop.</a>
<a name="25"><span class="lineNum"> 25 </span> : ReceivePort port = ReceivePort();</a>
<a name="26"><span class="lineNum"> 26 </span> : </a>
<a name="27"><span class="lineNum"> 27 </span> : /// Handler function to manage js module.</a>
<a name="28"><span class="lineNum"> 28 </span> : final _JsModuleHandler? moduleHandler;</a>
<a name="29"><span class="lineNum"> 29 </span> : </a>
<a name="30"><span class="lineNum"> 30 </span> : /// Handler function to manage js module.</a>
<a name="31"><span class="lineNum"> 31 </span> : final _JsHostPromiseRejectionHandler? hostPromiseRejectionHandler;</a>
<a name="32"><span class="lineNum"> 32 </span> : </a>
<a name="33"><span class="lineNum"> 33 </span><span class="lineCov"> 3 : FlutterQjs({</span></a>
<a name="34"><span class="lineNum"> 34 </span> : this.moduleHandler,</a>
<a name="35"><span class="lineNum"> 35 </span> : this.stackSize,</a>
<a name="36"><span class="lineNum"> 36 </span> : this.hostPromiseRejectionHandler,</a>
<a name="37"><span class="lineNum"> 37 </span> : });</a>
<a name="38"><span class="lineNum"> 38 </span> : </a>
<a name="39"><span class="lineNum"> 39 </span><span class="lineCov"> 3 : _ensureEngine() {</span></a>
<a name="40"><span class="lineNum"> 40 </span><span class="lineCov"> 3 : if (_rt != null) return;</span></a>
<a name="41"><span class="lineNum"> 41 </span><span class="lineCov"> 6 : final rt = jsNewRuntime((ctx, type, ptr) {</span></a>
<a name="42"><span class="lineNum"> 42 </span> : try {</a>
<a name="43"><span class="lineNum"> 43 </span> : switch (type) {</a>
<a name="44"><span class="lineNum"> 44 </span><span class="lineCov"> 3 : case JSChannelType.METHON:</span></a>
<a name="45"><span class="lineNum"> 45 </span><span class="lineCov"> 3 : final pdata = ptr.cast&lt;Pointer&lt;JSValue&gt;&gt;();</span></a>
<a name="46"><span class="lineNum"> 46 </span><span class="lineCov"> 9 : final argc = pdata.elementAt(1).value.cast&lt;Int32&gt;().value;</span></a>
<a name="47"><span class="lineNum"> 47 </span><span class="lineCov"> 3 : final pargs = [];</span></a>
<a name="48"><span class="lineNum"> 48 </span><span class="lineCov"> 6 : for (var i = 0; i &lt; argc; ++i) {</span></a>
<a name="49"><span class="lineNum"> 49 </span><span class="lineCov"> 6 : pargs.add(_jsToDart(</span></a>
<a name="50"><span class="lineNum"> 50 </span> : ctx,</a>
<a name="51"><span class="lineNum"> 51 </span><span class="lineCov"> 3 : Pointer.fromAddress(</span></a>
<a name="52"><span class="lineNum"> 52 </span><span class="lineCov"> 15 : pdata.elementAt(2).value.address + sizeOfJSValue * i,</span></a>
<a name="53"><span class="lineNum"> 53 </span> : ),</a>
<a name="54"><span class="lineNum"> 54 </span> : ));</a>
<a name="55"><span class="lineNum"> 55 </span> : }</a>
<a name="56"><span class="lineNum"> 56 </span><span class="lineCov"> 3 : final JSInvokable func = _jsToDart(</span></a>
<a name="57"><span class="lineNum"> 57 </span> : ctx,</a>
<a name="58"><span class="lineNum"> 58 </span><span class="lineCov"> 3 : pdata.elementAt(3).value,</span></a>
<a name="59"><span class="lineNum"> 59 </span> : );</a>
<a name="60"><span class="lineNum"> 60 </span><span class="lineCov"> 3 : return _dartToJs(</span></a>
<a name="61"><span class="lineNum"> 61 </span> : ctx,</a>
<a name="62"><span class="lineNum"> 62 </span><span class="lineCov"> 3 : func.invoke(</span></a>
<a name="63"><span class="lineNum"> 63 </span> : pargs,</a>
<a name="64"><span class="lineNum"> 64 </span><span class="lineCov"> 6 : _jsToDart(ctx, pdata.elementAt(0).value),</span></a>
<a name="65"><span class="lineNum"> 65 </span> : ));</a>
<a name="66"><span class="lineNum"> 66 </span><span class="lineCov"> 3 : case JSChannelType.MODULE:</span></a>
<a name="67"><span class="lineNum"> 67 </span><span class="lineCov"> 1 : if (moduleHandler == null) throw JSError('No ModuleHandler');</span></a>
<a name="68"><span class="lineNum"> 68 </span><span class="lineCov"> 2 : final ret = moduleHandler!(</span></a>
<a name="69"><span class="lineNum"> 69 </span><span class="lineCov"> 2 : ptr.cast&lt;Utf8&gt;().toDartString(),</span></a>
<a name="70"><span class="lineNum"> 70 </span><span class="lineCov"> 1 : ).toNativeUtf8();</span></a>
<a name="71"><span class="lineNum"> 71 </span><span class="lineCov"> 2 : Future.microtask(() {</span></a>
<a name="72"><span class="lineNum"> 72 </span><span class="lineCov"> 1 : malloc.free(ret);</span></a>
<a name="73"><span class="lineNum"> 73 </span> : });</a>
<a name="74"><span class="lineNum"> 74 </span><span class="lineCov"> 1 : return ret.cast();</span></a>
<a name="75"><span class="lineNum"> 75 </span><span class="lineCov"> 3 : case JSChannelType.PROMISE_TRACK:</span></a>
<a name="76"><span class="lineNum"> 76 </span><span class="lineCov"> 2 : final err = _parseJSException(ctx, ptr);</span></a>
<a name="77"><span class="lineNum"> 77 </span><span class="lineCov"> 2 : if (hostPromiseRejectionHandler != null) {</span></a>
<a name="78"><span class="lineNum"> 78 </span><span class="lineCov"> 4 : hostPromiseRejectionHandler!(err);</span></a>
<a name="79"><span class="lineNum"> 79 </span> : } else {</a>
<a name="80"><span class="lineNum"> 80 </span><span class="lineNoCov"> 0 : print('unhandled promise rejection: $err');</span></a>
<a name="81"><span class="lineNum"> 81 </span> : }</a>
<a name="82"><span class="lineNum"> 82 </span><span class="lineCov"> 2 : return nullptr;</span></a>
<a name="83"><span class="lineNum"> 83 </span><span class="lineCov"> 3 : case JSChannelType.FREE_OBJECT:</span></a>
<a name="84"><span class="lineNum"> 84 </span><span class="lineCov"> 3 : final rt = ctx.cast&lt;JSRuntime&gt;();</span></a>
<a name="85"><span class="lineNum"> 85 </span><span class="lineCov"> 9 : _DartObject.fromAddress(rt, ptr.address)?.free();</span></a>
<a name="86"><span class="lineNum"> 86 </span><span class="lineCov"> 3 : return nullptr;</span></a>
<a name="87"><span class="lineNum"> 87 </span> : }</a>
<a name="88"><span class="lineNum"> 88 </span><span class="lineNoCov"> 0 : throw JSError('call channel with wrong type');</span></a>
<a name="89"><span class="lineNum"> 89 </span> : } catch (e) {</a>
<a name="90"><span class="lineNum"> 90 </span><span class="lineNoCov"> 0 : if (type == JSChannelType.FREE_OBJECT) {</span></a>
<a name="91"><span class="lineNum"> 91 </span><span class="lineNoCov"> 0 : print('DartObject release error: $e');</span></a>
<a name="92"><span class="lineNum"> 92 </span><span class="lineNoCov"> 0 : return nullptr;</span></a>
<a name="93"><span class="lineNum"> 93 </span> : }</a>
<a name="94"><span class="lineNum"> 94 </span><span class="lineNoCov"> 0 : if (type == JSChannelType.MODULE) {</span></a>
<a name="95"><span class="lineNum"> 95 </span><span class="lineNoCov"> 0 : print('host Promise Rejection Handler error: $e');</span></a>
<a name="96"><span class="lineNum"> 96 </span><span class="lineNoCov"> 0 : return nullptr;</span></a>
<a name="97"><span class="lineNum"> 97 </span> : }</a>
<a name="98"><span class="lineNum"> 98 </span><span class="lineNoCov"> 0 : final throwObj = _dartToJs(ctx, e);</span></a>
<a name="99"><span class="lineNum"> 99 </span><span class="lineNoCov"> 0 : final err = jsThrow(ctx, throwObj);</span></a>
<a name="100"><span class="lineNum"> 100 </span><span class="lineNoCov"> 0 : jsFreeValue(ctx, throwObj);</span></a>
<a name="101"><span class="lineNum"> 101 </span><span class="lineNoCov"> 0 : if (type == JSChannelType.MODULE) {</span></a>
<a name="102"><span class="lineNum"> 102 </span><span class="lineNoCov"> 0 : jsFreeValue(ctx, err);</span></a>
<a name="103"><span class="lineNum"> 103 </span><span class="lineNoCov"> 0 : return nullptr;</span></a>
<a name="104"><span class="lineNum"> 104 </span> : }</a>
<a name="105"><span class="lineNum"> 105 </span> : return err;</a>
<a name="106"><span class="lineNum"> 106 </span> : }</a>
<a name="107"><span class="lineNum"> 107 </span><span class="lineCov"> 3 : }, port);</span></a>
<a name="108"><span class="lineNum"> 108 </span><span class="lineCov"> 3 : final stackSize = this.stackSize ?? 0;</span></a>
<a name="109"><span class="lineNum"> 109 </span><span class="lineCov"> 3 : if (stackSize &gt; 0) jsSetMaxStackSize(rt, stackSize);</span></a>
<a name="110"><span class="lineNum"> 110 </span><span class="lineCov"> 3 : _rt = rt;</span></a>
<a name="111"><span class="lineNum"> 111 </span><span class="lineCov"> 6 : _ctx = jsNewContext(rt);</span></a>
<a name="112"><span class="lineNum"> 112 </span> : }</a>
<a name="113"><span class="lineNum"> 113 </span> : </a>
<a name="114"><span class="lineNum"> 114 </span> : /// Free Runtime and Context which can be recreate when evaluate again.</a>
<a name="115"><span class="lineNum"> 115 </span><span class="lineCov"> 3 : close() {</span></a>
<a name="116"><span class="lineNum"> 116 </span><span class="lineCov"> 3 : final rt = _rt;</span></a>
<a name="117"><span class="lineNum"> 117 </span><span class="lineCov"> 3 : final ctx = _ctx;</span></a>
<a name="118"><span class="lineNum"> 118 </span><span class="lineCov"> 3 : _rt = null;</span></a>
<a name="119"><span class="lineNum"> 119 </span><span class="lineCov"> 3 : _ctx = null;</span></a>
<a name="120"><span class="lineNum"> 120 </span><span class="lineCov"> 6 : if (ctx != null) jsFreeContext(ctx);</span></a>
<a name="121"><span class="lineNum"> 121 </span> : if (rt == null) return;</a>
<a name="122"><span class="lineNum"> 122 </span><span class="lineCov"> 3 : _executePendingJob();</span></a>
<a name="123"><span class="lineNum"> 123 </span> : try {</a>
<a name="124"><span class="lineNum"> 124 </span><span class="lineCov"> 3 : jsFreeRuntime(rt);</span></a>
<a name="125"><span class="lineNum"> 125 </span><span class="lineCov"> 1 : } on String catch (e) {</span></a>
<a name="126"><span class="lineNum"> 126 </span><span class="lineCov"> 1 : throw JSError(e);</span></a>
<a name="127"><span class="lineNum"> 127 </span> : }</a>
<a name="128"><span class="lineNum"> 128 </span> : }</a>
<a name="129"><span class="lineNum"> 129 </span> : </a>
<a name="130"><span class="lineNum"> 130 </span><span class="lineCov"> 3 : void _executePendingJob() {</span></a>
<a name="131"><span class="lineNum"> 131 </span><span class="lineCov"> 3 : final rt = _rt;</span></a>
<a name="132"><span class="lineNum"> 132 </span><span class="lineCov"> 3 : final ctx = _ctx;</span></a>
<a name="133"><span class="lineNum"> 133 </span> : if (rt == null || ctx == null) return;</a>
<a name="134"><span class="lineNum"> 134 </span> : while (true) {</a>
<a name="135"><span class="lineNum"> 135 </span><span class="lineCov"> 6 : int err = jsExecutePendingJob(rt);</span></a>
<a name="136"><span class="lineNum"> 136 </span><span class="lineCov"> 3 : if (err &lt;= 0) {</span></a>
<a name="137"><span class="lineNum"> 137 </span><span class="lineCov"> 3 : if (err &lt; 0) print(_parseJSException(ctx));</span></a>
<a name="138"><span class="lineNum"> 138 </span> : break;</a>
<a name="139"><span class="lineNum"> 139 </span> : }</a>
<a name="140"><span class="lineNum"> 140 </span> : }</a>
<a name="141"><span class="lineNum"> 141 </span> : }</a>
<a name="142"><span class="lineNum"> 142 </span> : </a>
<a name="143"><span class="lineNum"> 143 </span> : /// Dispatch JavaScript Event loop.</a>
<a name="144"><span class="lineNum"> 144 </span><span class="lineCov"> 3 : Future&lt;void&gt; dispatch() async {</span></a>
<a name="145"><span class="lineNum"> 145 </span><span class="lineCov"> 9 : await for (final _ in port) {</span></a>
<a name="146"><span class="lineNum"> 146 </span><span class="lineCov"> 3 : _executePendingJob();</span></a>
<a name="147"><span class="lineNum"> 147 </span> : }</a>
<a name="148"><span class="lineNum"> 148 </span> : }</a>
<a name="149"><span class="lineNum"> 149 </span> : </a>
<a name="150"><span class="lineNum"> 150 </span> : /// Evaluate js script.</a>
<a name="151"><span class="lineNum"> 151 </span><span class="lineCov"> 3 : dynamic evaluate(</span></a>
<a name="152"><span class="lineNum"> 152 </span> : String command, {</a>
<a name="153"><span class="lineNum"> 153 </span> : String? name,</a>
<a name="154"><span class="lineNum"> 154 </span> : int? evalFlags,</a>
<a name="155"><span class="lineNum"> 155 </span> : }) {</a>
<a name="156"><span class="lineNum"> 156 </span><span class="lineCov"> 3 : _ensureEngine();</span></a>
<a name="157"><span class="lineNum"> 157 </span><span class="lineCov"> 3 : final ctx = _ctx!;</span></a>
<a name="158"><span class="lineNum"> 158 </span><span class="lineCov"> 3 : final jsval = jsEval(</span></a>
<a name="159"><span class="lineNum"> 159 </span> : ctx,</a>
<a name="160"><span class="lineNum"> 160 </span> : command,</a>
<a name="161"><span class="lineNum"> 161 </span> : name ?? '&lt;eval&gt;',</a>
<a name="162"><span class="lineNum"> 162 </span> : evalFlags ?? JSEvalFlag.GLOBAL,</a>
<a name="163"><span class="lineNum"> 163 </span> : );</a>
<a name="164"><span class="lineNum"> 164 </span><span class="lineCov"> 9 : if (jsIsException(jsval) != 0) {</span></a>
<a name="165"><span class="lineNum"> 165 </span><span class="lineCov"> 1 : jsFreeValue(ctx, jsval);</span></a>
<a name="166"><span class="lineNum"> 166 </span><span class="lineCov"> 1 : throw _parseJSException(ctx);</span></a>
<a name="167"><span class="lineNum"> 167 </span> : }</a>
<a name="168"><span class="lineNum"> 168 </span><span class="lineCov"> 3 : final result = _jsToDart(ctx, jsval);</span></a>
<a name="169"><span class="lineNum"> 169 </span><span class="lineCov"> 3 : jsFreeValue(ctx, jsval);</span></a>
<a name="170"><span class="lineNum"> 170 </span> : return result;</a>
<a name="171"><span class="lineNum"> 171 </span> : }</a>
<a name="172"><span class="lineNum"> 172 </span> : }</a>
</pre>
</td>
</tr>
</table>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,72 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/ffi.dart - functions</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - ffi.dart<span style="font-size: 80%;"> (<a href="ffi.dart.gcov.html">source</a> / functions)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">192</td>
<td class="headerCovTableEntry">209</td>
<td class="headerCovTableEntryHi">91.9 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="60%" cellpadding=1 cellspacing=1 border=0>
<tr><td><br></td></tr>
<tr>
<td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="ffi.dart.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
</table>
<br>
</center>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,72 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/ffi.dart - functions</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - ffi.dart<span style="font-size: 80%;"> (<a href="ffi.dart.gcov.html">source</a> / functions)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">192</td>
<td class="headerCovTableEntry">209</td>
<td class="headerCovTableEntryHi">91.9 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="60%" cellpadding=1 cellspacing=1 border=0>
<tr><td><br></td></tr>
<tr>
<td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="ffi.dart.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
</table>
<br>
</center>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -1,133 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - src</td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">652</td>
<td class="headerCovTableEntry">736</td>
<td class="headerCovTableEntryMed">88.6 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="80%" cellpadding=1 cellspacing=1 border=0>
<tr>
<td width="50%"><br></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
<td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
<td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></span></td>
</tr>
<tr>
<td class="coverFile"><a href="isolate.dart.gcov.html">isolate.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=83 height=10 alt="83.1%"><img src="../snow.png" width=17 height=10 alt="83.1%"></td></tr></table>
</td>
<td class="coverPerMed">83.1&nbsp;%</td>
<td class="coverNumMed">118 / 142</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="ffi.dart.gcov.html">ffi.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="91.9%"><img src="../snow.png" width=8 height=10 alt="91.9%"></td></tr></table>
</td>
<td class="coverPerHi">91.9&nbsp;%</td>
<td class="coverNumHi">192 / 209</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="wrapper.dart.gcov.html">wrapper.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="94.3%"><img src="../snow.png" width=6 height=10 alt="94.3%"></td></tr></table>
</td>
<td class="coverPerHi">94.3&nbsp;%</td>
<td class="coverNumHi">149 / 158</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="engine.dart.gcov.html">engine.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=83 height=10 alt="82.7%"><img src="../snow.png" width=17 height=10 alt="82.7%"></td></tr></table>
</td>
<td class="coverPerMed">82.7&nbsp;%</td>
<td class="coverNumMed">67 / 81</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="object.dart.gcov.html">object.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=86 height=10 alt="86.3%"><img src="../snow.png" width=14 height=10 alt="86.3%"></td></tr></table>
</td>
<td class="coverPerMed">86.3&nbsp;%</td>
<td class="coverNumMed">126 / 146</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
</table>
</center>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,133 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - src</td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">652</td>
<td class="headerCovTableEntry">736</td>
<td class="headerCovTableEntryMed">88.6 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="80%" cellpadding=1 cellspacing=1 border=0>
<tr>
<td width="50%"><br></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td class="tableHead">Filename <span class="tableHeadSort"><a href="index.html"><img src="../updown.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></a></span></td>
<td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></span></td>
<td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
</tr>
<tr>
<td class="coverFile"><a href="engine.dart.gcov.html">engine.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=83 height=10 alt="82.7%"><img src="../snow.png" width=17 height=10 alt="82.7%"></td></tr></table>
</td>
<td class="coverPerMed">82.7&nbsp;%</td>
<td class="coverNumMed">67 / 81</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="isolate.dart.gcov.html">isolate.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=83 height=10 alt="83.1%"><img src="../snow.png" width=17 height=10 alt="83.1%"></td></tr></table>
</td>
<td class="coverPerMed">83.1&nbsp;%</td>
<td class="coverNumMed">118 / 142</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="object.dart.gcov.html">object.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=86 height=10 alt="86.3%"><img src="../snow.png" width=14 height=10 alt="86.3%"></td></tr></table>
</td>
<td class="coverPerMed">86.3&nbsp;%</td>
<td class="coverNumMed">126 / 146</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="ffi.dart.gcov.html">ffi.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="91.9%"><img src="../snow.png" width=8 height=10 alt="91.9%"></td></tr></table>
</td>
<td class="coverPerHi">91.9&nbsp;%</td>
<td class="coverNumHi">192 / 209</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="wrapper.dart.gcov.html">wrapper.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="94.3%"><img src="../snow.png" width=6 height=10 alt="94.3%"></td></tr></table>
</td>
<td class="coverPerHi">94.3&nbsp;%</td>
<td class="coverNumHi">149 / 158</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
</table>
</center>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,133 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - src</td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">652</td>
<td class="headerCovTableEntry">736</td>
<td class="headerCovTableEntryMed">88.6 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="80%" cellpadding=1 cellspacing=1 border=0>
<tr>
<td width="50%"><br></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td class="tableHead">Filename <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by name" title="Sort by name" border=0></span></td>
<td class="tableHead" colspan=3>Line Coverage <span class="tableHeadSort"><a href="index-sort-l.html"><img src="../updown.png" width=10 height=14 alt="Sort by line coverage" title="Sort by line coverage" border=0></a></span></td>
<td class="tableHead" colspan=2>Functions <span class="tableHeadSort"><a href="index-sort-f.html"><img src="../updown.png" width=10 height=14 alt="Sort by function coverage" title="Sort by function coverage" border=0></a></span></td>
</tr>
<tr>
<td class="coverFile"><a href="engine.dart.gcov.html">engine.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=83 height=10 alt="82.7%"><img src="../snow.png" width=17 height=10 alt="82.7%"></td></tr></table>
</td>
<td class="coverPerMed">82.7&nbsp;%</td>
<td class="coverNumMed">67 / 81</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="ffi.dart.gcov.html">ffi.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=92 height=10 alt="91.9%"><img src="../snow.png" width=8 height=10 alt="91.9%"></td></tr></table>
</td>
<td class="coverPerHi">91.9&nbsp;%</td>
<td class="coverNumHi">192 / 209</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="isolate.dart.gcov.html">isolate.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=83 height=10 alt="83.1%"><img src="../snow.png" width=17 height=10 alt="83.1%"></td></tr></table>
</td>
<td class="coverPerMed">83.1&nbsp;%</td>
<td class="coverNumMed">118 / 142</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="object.dart.gcov.html">object.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../amber.png" width=86 height=10 alt="86.3%"><img src="../snow.png" width=14 height=10 alt="86.3%"></td></tr></table>
</td>
<td class="coverPerMed">86.3&nbsp;%</td>
<td class="coverNumMed">126 / 146</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
<tr>
<td class="coverFile"><a href="wrapper.dart.gcov.html">wrapper.dart</a></td>
<td class="coverBar" align="center">
<table border=0 cellspacing=0 cellpadding=1><tr><td class="coverBarOutline"><img src="../emerald.png" width=94 height=10 alt="94.3%"><img src="../snow.png" width=6 height=10 alt="94.3%"></td></tr></table>
</td>
<td class="coverPerHi">94.3&nbsp;%</td>
<td class="coverNumHi">149 / 158</td>
<td class="coverPerHi">-</td>
<td class="coverNumHi">0 / 0</td>
</tr>
</table>
</center>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,72 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/isolate.dart - functions</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - isolate.dart<span style="font-size: 80%;"> (<a href="isolate.dart.gcov.html">source</a> / functions)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">118</td>
<td class="headerCovTableEntry">142</td>
<td class="headerCovTableEntryMed">83.1 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="60%" cellpadding=1 cellspacing=1 border=0>
<tr><td><br></td></tr>
<tr>
<td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="isolate.dart.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
</table>
<br>
</center>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,72 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/isolate.dart - functions</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - isolate.dart<span style="font-size: 80%;"> (<a href="isolate.dart.gcov.html">source</a> / functions)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">118</td>
<td class="headerCovTableEntry">142</td>
<td class="headerCovTableEntryMed">83.1 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="60%" cellpadding=1 cellspacing=1 border=0>
<tr><td><br></td></tr>
<tr>
<td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="isolate.dart.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
</table>
<br>
</center>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,353 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/isolate.dart</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - isolate.dart<span style="font-size: 80%;"> (source / <a href="isolate.dart.func-sort-c.html">functions</a>)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">118</td>
<td class="headerCovTableEntry">142</td>
<td class="headerCovTableEntryMed">83.1 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td><br></td>
</tr>
<tr>
<td>
<pre class="sourceHeading"> Line data Source code</pre>
<pre class="source">
<a name="1"><span class="lineNum"> 1 </span> : /*</a>
<a name="2"><span class="lineNum"> 2 </span> : * @Description: isolate</a>
<a name="3"><span class="lineNum"> 3 </span> : * @Author: ekibun</a>
<a name="4"><span class="lineNum"> 4 </span> : * @Date: 2020-10-02 13:49:03</a>
<a name="5"><span class="lineNum"> 5 </span> : * @LastEditors: ekibun</a>
<a name="6"><span class="lineNum"> 6 </span> : * @LastEditTime: 2020-10-03 22:21:31</a>
<a name="7"><span class="lineNum"> 7 </span> : */</a>
<a name="8"><span class="lineNum"> 8 </span> : part of '../flutter_qjs.dart';</a>
<a name="9"><span class="lineNum"> 9 </span> : </a>
<a name="10"><span class="lineNum"> 10 </span> : typedef dynamic _Decode(Map obj);</a>
<a name="11"><span class="lineNum"> 11 </span><span class="lineCov"> 9 : List&lt;_Decode&gt; _decoders = [</span></a>
<a name="12"><span class="lineNum"> 12 </span> : JSError._decode,</a>
<a name="13"><span class="lineNum"> 13 </span> : IsolateFunction._decode,</a>
<a name="14"><span class="lineNum"> 14 </span> : ];</a>
<a name="15"><span class="lineNum"> 15 </span> : </a>
<a name="16"><span class="lineNum"> 16 </span> : abstract class _IsolateEncodable {</a>
<a name="17"><span class="lineNum"> 17 </span> : Map _encode();</a>
<a name="18"><span class="lineNum"> 18 </span> : }</a>
<a name="19"><span class="lineNum"> 19 </span> : </a>
<a name="20"><span class="lineNum"> 20 </span><span class="lineCov"> 3 : dynamic _encodeData(dynamic data, {Map&lt;dynamic, dynamic&gt;? cache}) {</span></a>
<a name="21"><span class="lineNum"> 21 </span><span class="lineCov"> 3 : if (cache == null) cache = Map();</span></a>
<a name="22"><span class="lineNum"> 22 </span><span class="lineCov"> 5 : if (cache.containsKey(data)) return cache[data];</span></a>
<a name="23"><span class="lineNum"> 23 </span><span class="lineCov"> 6 : if (data is _IsolateEncodable) return data._encode();</span></a>
<a name="24"><span class="lineNum"> 24 </span><span class="lineCov"> 3 : if (data is List) {</span></a>
<a name="25"><span class="lineNum"> 25 </span><span class="lineCov"> 3 : final ret = [];</span></a>
<a name="26"><span class="lineNum"> 26 </span><span class="lineCov"> 3 : cache[data] = ret;</span></a>
<a name="27"><span class="lineNum"> 27 </span><span class="lineCov"> 9 : for (int i = 0; i &lt; data.length; ++i) {</span></a>
<a name="28"><span class="lineNum"> 28 </span><span class="lineCov"> 9 : ret.add(_encodeData(data[i], cache: cache));</span></a>
<a name="29"><span class="lineNum"> 29 </span> : }</a>
<a name="30"><span class="lineNum"> 30 </span> : return ret;</a>
<a name="31"><span class="lineNum"> 31 </span> : }</a>
<a name="32"><span class="lineNum"> 32 </span><span class="lineCov"> 3 : if (data is Map) {</span></a>
<a name="33"><span class="lineNum"> 33 </span><span class="lineCov"> 2 : final ret = {};</span></a>
<a name="34"><span class="lineNum"> 34 </span><span class="lineCov"> 2 : cache[data] = ret;</span></a>
<a name="35"><span class="lineNum"> 35 </span><span class="lineCov"> 4 : for (final entry in data.entries) {</span></a>
<a name="36"><span class="lineNum"> 36 </span><span class="lineCov"> 6 : ret[_encodeData(entry.key, cache: cache)] =</span></a>
<a name="37"><span class="lineNum"> 37 </span><span class="lineCov"> 4 : _encodeData(entry.value, cache: cache);</span></a>
<a name="38"><span class="lineNum"> 38 </span> : }</a>
<a name="39"><span class="lineNum"> 39 </span> : return ret;</a>
<a name="40"><span class="lineNum"> 40 </span> : }</a>
<a name="41"><span class="lineNum"> 41 </span><span class="lineCov"> 3 : if (data is Future) {</span></a>
<a name="42"><span class="lineNum"> 42 </span><span class="lineCov"> 2 : final futurePort = ReceivePort();</span></a>
<a name="43"><span class="lineNum"> 43 </span><span class="lineCov"> 4 : data.then((value) {</span></a>
<a name="44"><span class="lineNum"> 44 </span><span class="lineCov"> 6 : futurePort.first.then((port) {</span></a>
<a name="45"><span class="lineNum"> 45 </span><span class="lineCov"> 2 : futurePort.close();</span></a>
<a name="46"><span class="lineNum"> 46 </span><span class="lineCov"> 4 : (port as SendPort).send(_encodeData(value));</span></a>
<a name="47"><span class="lineNum"> 47 </span> : });</a>
<a name="48"><span class="lineNum"> 48 </span><span class="lineCov"> 2 : }, onError: (e) {</span></a>
<a name="49"><span class="lineNum"> 49 </span><span class="lineCov"> 6 : futurePort.first.then((port) {</span></a>
<a name="50"><span class="lineNum"> 50 </span><span class="lineCov"> 2 : futurePort.close();</span></a>
<a name="51"><span class="lineNum"> 51 </span><span class="lineCov"> 6 : (port as SendPort).send({#error: _encodeData(e)});</span></a>
<a name="52"><span class="lineNum"> 52 </span> : });</a>
<a name="53"><span class="lineNum"> 53 </span> : });</a>
<a name="54"><span class="lineNum"> 54 </span><span class="lineCov"> 2 : return {</span></a>
<a name="55"><span class="lineNum"> 55 </span><span class="lineCov"> 2 : #jsFuturePort: futurePort.sendPort,</span></a>
<a name="56"><span class="lineNum"> 56 </span> : };</a>
<a name="57"><span class="lineNum"> 57 </span> : }</a>
<a name="58"><span class="lineNum"> 58 </span> : return data;</a>
<a name="59"><span class="lineNum"> 59 </span> : }</a>
<a name="60"><span class="lineNum"> 60 </span> : </a>
<a name="61"><span class="lineNum"> 61 </span><span class="lineCov"> 3 : dynamic _decodeData(dynamic data, {Map&lt;dynamic, dynamic&gt;? cache}) {</span></a>
<a name="62"><span class="lineNum"> 62 </span><span class="lineCov"> 3 : if (cache == null) cache = Map();</span></a>
<a name="63"><span class="lineNum"> 63 </span><span class="lineCov"> 5 : if (cache.containsKey(data)) return cache[data];</span></a>
<a name="64"><span class="lineNum"> 64 </span><span class="lineCov"> 3 : if (data is List) {</span></a>
<a name="65"><span class="lineNum"> 65 </span><span class="lineCov"> 3 : final ret = [];</span></a>
<a name="66"><span class="lineNum"> 66 </span><span class="lineCov"> 3 : cache[data] = ret;</span></a>
<a name="67"><span class="lineNum"> 67 </span><span class="lineCov"> 9 : for (int i = 0; i &lt; data.length; ++i) {</span></a>
<a name="68"><span class="lineNum"> 68 </span><span class="lineCov"> 9 : ret.add(_decodeData(data[i], cache: cache));</span></a>
<a name="69"><span class="lineNum"> 69 </span> : }</a>
<a name="70"><span class="lineNum"> 70 </span> : return ret;</a>
<a name="71"><span class="lineNum"> 71 </span> : }</a>
<a name="72"><span class="lineNum"> 72 </span><span class="lineCov"> 3 : if (data is Map) {</span></a>
<a name="73"><span class="lineNum"> 73 </span><span class="lineCov"> 6 : for (final decoder in _decoders) {</span></a>
<a name="74"><span class="lineNum"> 74 </span><span class="lineCov"> 3 : final decodeObj = decoder(data);</span></a>
<a name="75"><span class="lineNum"> 75 </span> : if (decodeObj != null) return decodeObj;</a>
<a name="76"><span class="lineNum"> 76 </span> : }</a>
<a name="77"><span class="lineNum"> 77 </span><span class="lineCov"> 2 : if (data.containsKey(#jsFuturePort)) {</span></a>
<a name="78"><span class="lineNum"> 78 </span><span class="lineCov"> 2 : SendPort port = data[#jsFuturePort];</span></a>
<a name="79"><span class="lineNum"> 79 </span><span class="lineCov"> 2 : final futurePort = ReceivePort();</span></a>
<a name="80"><span class="lineNum"> 80 </span><span class="lineCov"> 4 : port.send(futurePort.sendPort);</span></a>
<a name="81"><span class="lineNum"> 81 </span><span class="lineCov"> 2 : final futureCompleter = Completer();</span></a>
<a name="82"><span class="lineNum"> 82 </span><span class="lineCov"> 6 : futureCompleter.future.catchError((e) {});</span></a>
<a name="83"><span class="lineNum"> 83 </span><span class="lineCov"> 6 : futurePort.first.then((value) {</span></a>
<a name="84"><span class="lineNum"> 84 </span><span class="lineCov"> 2 : futurePort.close();</span></a>
<a name="85"><span class="lineNum"> 85 </span><span class="lineCov"> 4 : if (value is Map &amp;&amp; value.containsKey(#error)) {</span></a>
<a name="86"><span class="lineNum"> 86 </span><span class="lineCov"> 6 : futureCompleter.completeError(_decodeData(value[#error]));</span></a>
<a name="87"><span class="lineNum"> 87 </span> : } else {</a>
<a name="88"><span class="lineNum"> 88 </span><span class="lineCov"> 4 : futureCompleter.complete(_decodeData(value));</span></a>
<a name="89"><span class="lineNum"> 89 </span> : }</a>
<a name="90"><span class="lineNum"> 90 </span> : });</a>
<a name="91"><span class="lineNum"> 91 </span><span class="lineCov"> 2 : return futureCompleter.future;</span></a>
<a name="92"><span class="lineNum"> 92 </span> : }</a>
<a name="93"><span class="lineNum"> 93 </span><span class="lineCov"> 2 : final ret = {};</span></a>
<a name="94"><span class="lineNum"> 94 </span><span class="lineCov"> 2 : cache[data] = ret;</span></a>
<a name="95"><span class="lineNum"> 95 </span><span class="lineCov"> 4 : for (final entry in data.entries) {</span></a>
<a name="96"><span class="lineNum"> 96 </span><span class="lineCov"> 6 : ret[_decodeData(entry.key, cache: cache)] =</span></a>
<a name="97"><span class="lineNum"> 97 </span><span class="lineCov"> 4 : _decodeData(entry.value, cache: cache);</span></a>
<a name="98"><span class="lineNum"> 98 </span> : }</a>
<a name="99"><span class="lineNum"> 99 </span> : return ret;</a>
<a name="100"><span class="lineNum"> 100 </span> : }</a>
<a name="101"><span class="lineNum"> 101 </span> : return data;</a>
<a name="102"><span class="lineNum"> 102 </span> : }</a>
<a name="103"><span class="lineNum"> 103 </span> : </a>
<a name="104"><span class="lineNum"> 104 </span><span class="lineCov"> 2 : void _runJsIsolate(Map spawnMessage) async {</span></a>
<a name="105"><span class="lineNum"> 105 </span><span class="lineCov"> 2 : SendPort sendPort = spawnMessage[#port];</span></a>
<a name="106"><span class="lineNum"> 106 </span><span class="lineCov"> 2 : ReceivePort port = ReceivePort();</span></a>
<a name="107"><span class="lineNum"> 107 </span><span class="lineCov"> 4 : sendPort.send(port.sendPort);</span></a>
<a name="108"><span class="lineNum"> 108 </span><span class="lineCov"> 2 : final qjs = FlutterQjs(</span></a>
<a name="109"><span class="lineNum"> 109 </span><span class="lineCov"> 2 : stackSize: spawnMessage[#stackSize],</span></a>
<a name="110"><span class="lineNum"> 110 </span><span class="lineCov"> 1 : hostPromiseRejectionHandler: (reason) {</span></a>
<a name="111"><span class="lineNum"> 111 </span><span class="lineCov"> 2 : sendPort.send({</span></a>
<a name="112"><span class="lineNum"> 112 </span> : #type: #hostPromiseRejection,</a>
<a name="113"><span class="lineNum"> 113 </span><span class="lineCov"> 1 : #reason: _encodeData(reason),</span></a>
<a name="114"><span class="lineNum"> 114 </span> : });</a>
<a name="115"><span class="lineNum"> 115 </span> : },</a>
<a name="116"><span class="lineNum"> 116 </span><span class="lineNoCov"> 0 : moduleHandler: (name) {</span></a>
<a name="117"><span class="lineNum"> 117 </span> : final ptr = calloc&lt;Pointer&lt;Utf8&gt;&gt;();</a>
<a name="118"><span class="lineNum"> 118 </span><span class="lineNoCov"> 0 : ptr.value = Pointer.fromAddress(ptr.address);</span></a>
<a name="119"><span class="lineNum"> 119 </span><span class="lineNoCov"> 0 : sendPort.send({</span></a>
<a name="120"><span class="lineNum"> 120 </span> : #type: #module,</a>
<a name="121"><span class="lineNum"> 121 </span> : #name: name,</a>
<a name="122"><span class="lineNum"> 122 </span><span class="lineNoCov"> 0 : #ptr: ptr.address,</span></a>
<a name="123"><span class="lineNum"> 123 </span> : });</a>
<a name="124"><span class="lineNum"> 124 </span><span class="lineNoCov"> 0 : while (ptr.value.address == ptr.address) sleep(Duration(microseconds: 1));</span></a>
<a name="125"><span class="lineNum"> 125 </span><span class="lineNoCov"> 0 : final ret = ptr.value;</span></a>
<a name="126"><span class="lineNum"> 126 </span><span class="lineNoCov"> 0 : malloc.free(ptr);</span></a>
<a name="127"><span class="lineNum"> 127 </span><span class="lineNoCov"> 0 : if (ret.address == -1) throw JSError('Module Not found');</span></a>
<a name="128"><span class="lineNum"> 128 </span><span class="lineNoCov"> 0 : final retString = ret.toDartString();</span></a>
<a name="129"><span class="lineNum"> 129 </span><span class="lineNoCov"> 0 : malloc.free(ret);</span></a>
<a name="130"><span class="lineNum"> 130 </span> : return retString;</a>
<a name="131"><span class="lineNum"> 131 </span> : },</a>
<a name="132"><span class="lineNum"> 132 </span> : );</a>
<a name="133"><span class="lineNum"> 133 </span><span class="lineCov"> 4 : port.listen((msg) async {</span></a>
<a name="134"><span class="lineNum"> 134 </span> : var data;</a>
<a name="135"><span class="lineNum"> 135 </span><span class="lineCov"> 2 : SendPort? msgPort = msg[#port];</span></a>
<a name="136"><span class="lineNum"> 136 </span> : try {</a>
<a name="137"><span class="lineNum"> 137 </span><span class="lineCov"> 2 : switch (msg[#type]) {</span></a>
<a name="138"><span class="lineNum"> 138 </span><span class="lineCov"> 2 : case #evaluate:</span></a>
<a name="139"><span class="lineNum"> 139 </span><span class="lineCov"> 4 : data = await qjs.evaluate(</span></a>
<a name="140"><span class="lineNum"> 140 </span><span class="lineCov"> 2 : msg[#command],</span></a>
<a name="141"><span class="lineNum"> 141 </span><span class="lineCov"> 2 : name: msg[#name],</span></a>
<a name="142"><span class="lineNum"> 142 </span><span class="lineCov"> 2 : evalFlags: msg[#flag],</span></a>
<a name="143"><span class="lineNum"> 143 </span> : );</a>
<a name="144"><span class="lineNum"> 144 </span> : break;</a>
<a name="145"><span class="lineNum"> 145 </span><span class="lineCov"> 2 : case #close:</span></a>
<a name="146"><span class="lineNum"> 146 </span> : data = false;</a>
<a name="147"><span class="lineNum"> 147 </span><span class="lineCov"> 4 : qjs.port.close();</span></a>
<a name="148"><span class="lineNum"> 148 </span><span class="lineCov"> 2 : qjs.close();</span></a>
<a name="149"><span class="lineNum"> 149 </span><span class="lineCov"> 2 : port.close();</span></a>
<a name="150"><span class="lineNum"> 150 </span> : data = true;</a>
<a name="151"><span class="lineNum"> 151 </span> : break;</a>
<a name="152"><span class="lineNum"> 152 </span> : }</a>
<a name="153"><span class="lineNum"> 153 </span><span class="lineCov"> 4 : if (msgPort != null) msgPort.send(_encodeData(data));</span></a>
<a name="154"><span class="lineNum"> 154 </span> : } catch (e) {</a>
<a name="155"><span class="lineNum"> 155 </span> : if (msgPort != null)</a>
<a name="156"><span class="lineNum"> 156 </span><span class="lineNoCov"> 0 : msgPort.send({</span></a>
<a name="157"><span class="lineNum"> 157 </span><span class="lineNoCov"> 0 : #error: _encodeData(e),</span></a>
<a name="158"><span class="lineNum"> 158 </span> : });</a>
<a name="159"><span class="lineNum"> 159 </span> : }</a>
<a name="160"><span class="lineNum"> 160 </span> : });</a>
<a name="161"><span class="lineNum"> 161 </span><span class="lineCov"> 4 : await qjs.dispatch();</span></a>
<a name="162"><span class="lineNum"> 162 </span> : }</a>
<a name="163"><span class="lineNum"> 163 </span> : </a>
<a name="164"><span class="lineNum"> 164 </span> : typedef _JsAsyncModuleHandler = Future&lt;String&gt; Function(String name);</a>
<a name="165"><span class="lineNum"> 165 </span> : </a>
<a name="166"><span class="lineNum"> 166 </span> : class IsolateQjs {</a>
<a name="167"><span class="lineNum"> 167 </span> : Future&lt;SendPort&gt;? _sendPort;</a>
<a name="168"><span class="lineNum"> 168 </span> : </a>
<a name="169"><span class="lineNum"> 169 </span> : /// Max stack size for quickjs.</a>
<a name="170"><span class="lineNum"> 170 </span> : final int? stackSize;</a>
<a name="171"><span class="lineNum"> 171 </span> : </a>
<a name="172"><span class="lineNum"> 172 </span> : /// Asynchronously handler to manage js module.</a>
<a name="173"><span class="lineNum"> 173 </span> : final _JsAsyncModuleHandler? moduleHandler;</a>
<a name="174"><span class="lineNum"> 174 </span> : </a>
<a name="175"><span class="lineNum"> 175 </span> : /// Handler function to manage js module.</a>
<a name="176"><span class="lineNum"> 176 </span> : final _JsHostPromiseRejectionHandler? hostPromiseRejectionHandler;</a>
<a name="177"><span class="lineNum"> 177 </span> : </a>
<a name="178"><span class="lineNum"> 178 </span> : /// Quickjs engine runing on isolate thread.</a>
<a name="179"><span class="lineNum"> 179 </span> : ///</a>
<a name="180"><span class="lineNum"> 180 </span> : /// Pass handlers to implement js-dart interaction and resolving modules. The `methodHandler` is</a>
<a name="181"><span class="lineNum"> 181 </span> : /// used in isolate, so **the handler function must be a top-level function or a static method**.</a>
<a name="182"><span class="lineNum"> 182 </span><span class="lineCov"> 1 : IsolateQjs({</span></a>
<a name="183"><span class="lineNum"> 183 </span> : this.moduleHandler,</a>
<a name="184"><span class="lineNum"> 184 </span> : this.stackSize,</a>
<a name="185"><span class="lineNum"> 185 </span> : this.hostPromiseRejectionHandler,</a>
<a name="186"><span class="lineNum"> 186 </span> : });</a>
<a name="187"><span class="lineNum"> 187 </span> : </a>
<a name="188"><span class="lineNum"> 188 </span><span class="lineCov"> 1 : _ensureEngine() {</span></a>
<a name="189"><span class="lineNum"> 189 </span><span class="lineCov"> 1 : if (_sendPort != null) return;</span></a>
<a name="190"><span class="lineNum"> 190 </span><span class="lineCov"> 1 : ReceivePort port = ReceivePort();</span></a>
<a name="191"><span class="lineNum"> 191 </span><span class="lineCov"> 1 : Isolate.spawn(</span></a>
<a name="192"><span class="lineNum"> 192 </span> : _runJsIsolate,</a>
<a name="193"><span class="lineNum"> 193 </span><span class="lineCov"> 1 : {</span></a>
<a name="194"><span class="lineNum"> 194 </span><span class="lineCov"> 1 : #port: port.sendPort,</span></a>
<a name="195"><span class="lineNum"> 195 </span><span class="lineCov"> 1 : #stackSize: stackSize,</span></a>
<a name="196"><span class="lineNum"> 196 </span> : },</a>
<a name="197"><span class="lineNum"> 197 </span> : errorsAreFatal: true,</a>
<a name="198"><span class="lineNum"> 198 </span> : );</a>
<a name="199"><span class="lineNum"> 199 </span><span class="lineCov"> 1 : final completer = Completer&lt;SendPort&gt;();</span></a>
<a name="200"><span class="lineNum"> 200 </span><span class="lineCov"> 2 : port.listen((msg) async {</span></a>
<a name="201"><span class="lineNum"> 201 </span><span class="lineCov"> 2 : if (msg is SendPort &amp;&amp; !completer.isCompleted) {</span></a>
<a name="202"><span class="lineNum"> 202 </span><span class="lineCov"> 1 : completer.complete(msg);</span></a>
<a name="203"><span class="lineNum"> 203 </span> : return;</a>
<a name="204"><span class="lineNum"> 204 </span> : }</a>
<a name="205"><span class="lineNum"> 205 </span><span class="lineCov"> 1 : switch (msg[#type]) {</span></a>
<a name="206"><span class="lineNum"> 206 </span><span class="lineCov"> 1 : case #hostPromiseRejection:</span></a>
<a name="207"><span class="lineNum"> 207 </span> : try {</a>
<a name="208"><span class="lineNum"> 208 </span><span class="lineCov"> 2 : final err = _decodeData(msg[#reason]);</span></a>
<a name="209"><span class="lineNum"> 209 </span><span class="lineCov"> 1 : if (hostPromiseRejectionHandler != null) {</span></a>
<a name="210"><span class="lineNum"> 210 </span><span class="lineCov"> 2 : hostPromiseRejectionHandler!(err);</span></a>
<a name="211"><span class="lineNum"> 211 </span> : } else {</a>
<a name="212"><span class="lineNum"> 212 </span><span class="lineNoCov"> 0 : print('unhandled promise rejection: $err');</span></a>
<a name="213"><span class="lineNum"> 213 </span> : }</a>
<a name="214"><span class="lineNum"> 214 </span> : } catch (e) {</a>
<a name="215"><span class="lineNum"> 215 </span><span class="lineNoCov"> 0 : print('host Promise Rejection Handler error: $e');</span></a>
<a name="216"><span class="lineNum"> 216 </span> : }</a>
<a name="217"><span class="lineNum"> 217 </span> : break;</a>
<a name="218"><span class="lineNum"> 218 </span><span class="lineNoCov"> 0 : case #module:</span></a>
<a name="219"><span class="lineNum"> 219 </span><span class="lineNoCov"> 0 : final ptr = Pointer&lt;Pointer&gt;.fromAddress(msg[#ptr]);</span></a>
<a name="220"><span class="lineNum"> 220 </span> : try {</a>
<a name="221"><span class="lineNum"> 221 </span><span class="lineNoCov"> 0 : ptr.value = (await moduleHandler!(msg[#name])).toNativeUtf8();</span></a>
<a name="222"><span class="lineNum"> 222 </span> : } catch (e) {</a>
<a name="223"><span class="lineNum"> 223 </span><span class="lineNoCov"> 0 : ptr.value = Pointer.fromAddress(-1);</span></a>
<a name="224"><span class="lineNum"> 224 </span> : }</a>
<a name="225"><span class="lineNum"> 225 </span> : break;</a>
<a name="226"><span class="lineNum"> 226 </span> : }</a>
<a name="227"><span class="lineNum"> 227 </span><span class="lineNoCov"> 0 : }, onDone: () {</span></a>
<a name="228"><span class="lineNum"> 228 </span><span class="lineNoCov"> 0 : close();</span></a>
<a name="229"><span class="lineNum"> 229 </span><span class="lineNoCov"> 0 : if (!completer.isCompleted)</span></a>
<a name="230"><span class="lineNum"> 230 </span><span class="lineNoCov"> 0 : completer.completeError(JSError('isolate close'));</span></a>
<a name="231"><span class="lineNum"> 231 </span> : });</a>
<a name="232"><span class="lineNum"> 232 </span><span class="lineCov"> 2 : _sendPort = completer.future;</span></a>
<a name="233"><span class="lineNum"> 233 </span> : }</a>
<a name="234"><span class="lineNum"> 234 </span> : </a>
<a name="235"><span class="lineNum"> 235 </span> : /// Free Runtime and close isolate thread that can be recreate when evaluate again.</a>
<a name="236"><span class="lineNum"> 236 </span><span class="lineCov"> 1 : close() {</span></a>
<a name="237"><span class="lineNum"> 237 </span><span class="lineCov"> 1 : final sendPort = _sendPort;</span></a>
<a name="238"><span class="lineNum"> 238 </span><span class="lineCov"> 1 : _sendPort = null;</span></a>
<a name="239"><span class="lineNum"> 239 </span> : if (sendPort == null) return;</a>
<a name="240"><span class="lineNum"> 240 </span><span class="lineCov"> 2 : final ret = sendPort.then((sendPort) async {</span></a>
<a name="241"><span class="lineNum"> 241 </span><span class="lineCov"> 1 : final closePort = ReceivePort();</span></a>
<a name="242"><span class="lineNum"> 242 </span><span class="lineCov"> 2 : sendPort.send({</span></a>
<a name="243"><span class="lineNum"> 243 </span> : #type: #close,</a>
<a name="244"><span class="lineNum"> 244 </span><span class="lineCov"> 1 : #port: closePort.sendPort,</span></a>
<a name="245"><span class="lineNum"> 245 </span> : });</a>
<a name="246"><span class="lineNum"> 246 </span><span class="lineCov"> 2 : final result = await closePort.first;</span></a>
<a name="247"><span class="lineNum"> 247 </span><span class="lineCov"> 1 : closePort.close();</span></a>
<a name="248"><span class="lineNum"> 248 </span><span class="lineCov"> 1 : if (result is Map &amp;&amp; result.containsKey(#error))</span></a>
<a name="249"><span class="lineNum"> 249 </span><span class="lineNoCov"> 0 : throw _decodeData(result[#error]);</span></a>
<a name="250"><span class="lineNum"> 250 </span><span class="lineCov"> 1 : return _decodeData(result);</span></a>
<a name="251"><span class="lineNum"> 251 </span> : });</a>
<a name="252"><span class="lineNum"> 252 </span> : return ret;</a>
<a name="253"><span class="lineNum"> 253 </span> : }</a>
<a name="254"><span class="lineNum"> 254 </span> : </a>
<a name="255"><span class="lineNum"> 255 </span> : /// Evaluate js script.</a>
<a name="256"><span class="lineNum"> 256 </span><span class="lineCov"> 1 : Future&lt;dynamic&gt; evaluate(</span></a>
<a name="257"><span class="lineNum"> 257 </span> : String command, {</a>
<a name="258"><span class="lineNum"> 258 </span> : String? name,</a>
<a name="259"><span class="lineNum"> 259 </span> : int? evalFlags,</a>
<a name="260"><span class="lineNum"> 260 </span> : }) async {</a>
<a name="261"><span class="lineNum"> 261 </span><span class="lineCov"> 1 : _ensureEngine();</span></a>
<a name="262"><span class="lineNum"> 262 </span><span class="lineCov"> 1 : final evaluatePort = ReceivePort();</span></a>
<a name="263"><span class="lineNum"> 263 </span><span class="lineCov"> 2 : final sendPort = await _sendPort!;</span></a>
<a name="264"><span class="lineNum"> 264 </span><span class="lineCov"> 2 : sendPort.send({</span></a>
<a name="265"><span class="lineNum"> 265 </span> : #type: #evaluate,</a>
<a name="266"><span class="lineNum"> 266 </span> : #command: command,</a>
<a name="267"><span class="lineNum"> 267 </span> : #name: name,</a>
<a name="268"><span class="lineNum"> 268 </span> : #flag: evalFlags,</a>
<a name="269"><span class="lineNum"> 269 </span><span class="lineCov"> 1 : #port: evaluatePort.sendPort,</span></a>
<a name="270"><span class="lineNum"> 270 </span> : });</a>
<a name="271"><span class="lineNum"> 271 </span><span class="lineCov"> 2 : final result = await evaluatePort.first;</span></a>
<a name="272"><span class="lineNum"> 272 </span><span class="lineCov"> 1 : evaluatePort.close();</span></a>
<a name="273"><span class="lineNum"> 273 </span><span class="lineCov"> 2 : if (result is Map &amp;&amp; result.containsKey(#error))</span></a>
<a name="274"><span class="lineNum"> 274 </span><span class="lineNoCov"> 0 : throw _decodeData(result[#error]);</span></a>
<a name="275"><span class="lineNum"> 275 </span><span class="lineCov"> 1 : return _decodeData(result);</span></a>
<a name="276"><span class="lineNum"> 276 </span> : }</a>
<a name="277"><span class="lineNum"> 277 </span> : }</a>
</pre>
</td>
</tr>
</table>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,72 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/object.dart - functions</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - object.dart<span style="font-size: 80%;"> (<a href="object.dart.gcov.html">source</a> / functions)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">126</td>
<td class="headerCovTableEntry">146</td>
<td class="headerCovTableEntryMed">86.3 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="60%" cellpadding=1 cellspacing=1 border=0>
<tr><td><br></td></tr>
<tr>
<td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="object.dart.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
</table>
<br>
</center>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,72 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/object.dart - functions</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - object.dart<span style="font-size: 80%;"> (<a href="object.dart.gcov.html">source</a> / functions)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">126</td>
<td class="headerCovTableEntry">146</td>
<td class="headerCovTableEntryMed">86.3 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="60%" cellpadding=1 cellspacing=1 border=0>
<tr><td><br></td></tr>
<tr>
<td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="object.dart.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
</table>
<br>
</center>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,390 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/object.dart</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - object.dart<span style="font-size: 80%;"> (source / <a href="object.dart.func-sort-c.html">functions</a>)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">126</td>
<td class="headerCovTableEntry">146</td>
<td class="headerCovTableEntryMed">86.3 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td><br></td>
</tr>
<tr>
<td>
<pre class="sourceHeading"> Line data Source code</pre>
<pre class="source">
<a name="1"><span class="lineNum"> 1 </span> : /*</a>
<a name="2"><span class="lineNum"> 2 </span> : * @Description: wrap object</a>
<a name="3"><span class="lineNum"> 3 </span> : * @Author: ekibun</a>
<a name="4"><span class="lineNum"> 4 </span> : * @Date: 2020-10-02 13:49:03</a>
<a name="5"><span class="lineNum"> 5 </span> : * @LastEditors: ekibun</a>
<a name="6"><span class="lineNum"> 6 </span> : * @LastEditTime: 2020-10-03 22:21:31</a>
<a name="7"><span class="lineNum"> 7 </span> : */</a>
<a name="8"><span class="lineNum"> 8 </span> : part of '../flutter_qjs.dart';</a>
<a name="9"><span class="lineNum"> 9 </span> : </a>
<a name="10"><span class="lineNum"> 10 </span> : /// js invokable</a>
<a name="11"><span class="lineNum"> 11 </span> : abstract class JSInvokable extends JSRef {</a>
<a name="12"><span class="lineNum"> 12 </span> : dynamic invoke(List args, [dynamic thisVal]);</a>
<a name="13"><span class="lineNum"> 13 </span> : </a>
<a name="14"><span class="lineNum"> 14 </span><span class="lineCov"> 3 : static dynamic _wrap(dynamic func) {</span></a>
<a name="15"><span class="lineNum"> 15 </span><span class="lineCov"> 3 : return func is JSInvokable</span></a>
<a name="16"><span class="lineNum"> 16 </span> : ? func</a>
<a name="17"><span class="lineNum"> 17 </span><span class="lineCov"> 3 : : func is Function</span></a>
<a name="18"><span class="lineNum"> 18 </span><span class="lineCov"> 3 : ? _DartFunction(func)</span></a>
<a name="19"><span class="lineNum"> 19 </span> : : func;</a>
<a name="20"><span class="lineNum"> 20 </span> : }</a>
<a name="21"><span class="lineNum"> 21 </span> : }</a>
<a name="22"><span class="lineNum"> 22 </span> : </a>
<a name="23"><span class="lineNum"> 23 </span> : class _DartFunction extends JSInvokable {</a>
<a name="24"><span class="lineNum"> 24 </span> : final Function _func;</a>
<a name="25"><span class="lineNum"> 25 </span><span class="lineCov"> 3 : _DartFunction(this._func);</span></a>
<a name="26"><span class="lineNum"> 26 </span> : </a>
<a name="27"><span class="lineNum"> 27 </span><span class="lineCov"> 3 : @override</span></a>
<a name="28"><span class="lineNum"> 28 </span> : invoke(List args, [thisVal]) {</a>
<a name="29"><span class="lineNum"> 29 </span> : /// wrap this into function</a>
<a name="30"><span class="lineNum"> 30 </span> : final passThis =</a>
<a name="31"><span class="lineNum"> 31 </span><span class="lineCov"> 15 : RegExp('{.*thisVal.*}').hasMatch(_func.runtimeType.toString());</span></a>
<a name="32"><span class="lineNum"> 32 </span> : final ret =</a>
<a name="33"><span class="lineNum"> 33 </span><span class="lineCov"> 8 : Function.apply(_func, args, passThis ? {#thisVal: thisVal} : null);</span></a>
<a name="34"><span class="lineNum"> 34 </span><span class="lineCov"> 3 : JSRef.freeRecursive(args);</span></a>
<a name="35"><span class="lineNum"> 35 </span><span class="lineCov"> 3 : JSRef.freeRecursive(thisVal);</span></a>
<a name="36"><span class="lineNum"> 36 </span> : return ret;</a>
<a name="37"><span class="lineNum"> 37 </span> : }</a>
<a name="38"><span class="lineNum"> 38 </span> : </a>
<a name="39"><span class="lineNum"> 39 </span><span class="lineNoCov"> 0 : @override</span></a>
<a name="40"><span class="lineNum"> 40 </span> : String toString() {</a>
<a name="41"><span class="lineNum"> 41 </span><span class="lineNoCov"> 0 : return _func.toString();</span></a>
<a name="42"><span class="lineNum"> 42 </span> : }</a>
<a name="43"><span class="lineNum"> 43 </span> : </a>
<a name="44"><span class="lineNum"> 44 </span><span class="lineNoCov"> 0 : @override</span></a>
<a name="45"><span class="lineNum"> 45 </span> : destroy() {}</a>
<a name="46"><span class="lineNum"> 46 </span> : }</a>
<a name="47"><span class="lineNum"> 47 </span> : </a>
<a name="48"><span class="lineNum"> 48 </span> : /// implement this to capture js object release.</a>
<a name="49"><span class="lineNum"> 49 </span> : </a>
<a name="50"><span class="lineNum"> 50 </span> : class _DartObject extends JSRef implements JSRefLeakable {</a>
<a name="51"><span class="lineNum"> 51 </span> : Object? _obj;</a>
<a name="52"><span class="lineNum"> 52 </span> : Pointer&lt;JSContext&gt;? _ctx;</a>
<a name="53"><span class="lineNum"> 53 </span><span class="lineCov"> 3 : _DartObject(Pointer&lt;JSContext&gt; ctx, dynamic obj) {</span></a>
<a name="54"><span class="lineNum"> 54 </span><span class="lineCov"> 3 : _ctx = ctx;</span></a>
<a name="55"><span class="lineNum"> 55 </span><span class="lineCov"> 3 : _obj = obj;</span></a>
<a name="56"><span class="lineNum"> 56 </span><span class="lineCov"> 6 : if (obj is JSRef) obj.dup();</span></a>
<a name="57"><span class="lineNum"> 57 </span><span class="lineCov"> 15 : runtimeOpaques[jsGetRuntime(ctx)]?.addRef(this);</span></a>
<a name="58"><span class="lineNum"> 58 </span> : }</a>
<a name="59"><span class="lineNum"> 59 </span> : </a>
<a name="60"><span class="lineNum"> 60 </span><span class="lineCov"> 3 : static _DartObject? fromAddress(Pointer&lt;JSRuntime&gt; rt, int val) {</span></a>
<a name="61"><span class="lineNum"> 61 </span><span class="lineCov"> 18 : return runtimeOpaques[rt]?.getRef((e) =&gt; identityHashCode(e) == val)</span></a>
<a name="62"><span class="lineNum"> 62 </span> : as _DartObject?;</a>
<a name="63"><span class="lineNum"> 63 </span> : }</a>
<a name="64"><span class="lineNum"> 64 </span> : </a>
<a name="65"><span class="lineNum"> 65 </span><span class="lineNoCov"> 0 : @override</span></a>
<a name="66"><span class="lineNum"> 66 </span> : String toString() {</a>
<a name="67"><span class="lineNum"> 67 </span><span class="lineNoCov"> 0 : if (_ctx == null) return &quot;DartObject(released)&quot;;</span></a>
<a name="68"><span class="lineNum"> 68 </span><span class="lineNoCov"> 0 : return _obj.toString();</span></a>
<a name="69"><span class="lineNum"> 69 </span> : }</a>
<a name="70"><span class="lineNum"> 70 </span> : </a>
<a name="71"><span class="lineNum"> 71 </span><span class="lineCov"> 3 : @override</span></a>
<a name="72"><span class="lineNum"> 72 </span> : void destroy() {</a>
<a name="73"><span class="lineNum"> 73 </span><span class="lineCov"> 3 : final ctx = _ctx;</span></a>
<a name="74"><span class="lineNum"> 74 </span><span class="lineCov"> 3 : final obj = _obj;</span></a>
<a name="75"><span class="lineNum"> 75 </span><span class="lineCov"> 3 : _ctx = null;</span></a>
<a name="76"><span class="lineNum"> 76 </span><span class="lineCov"> 3 : _obj = null;</span></a>
<a name="77"><span class="lineNum"> 77 </span> : if (ctx == null) return;</a>
<a name="78"><span class="lineNum"> 78 </span><span class="lineCov"> 15 : runtimeOpaques[jsGetRuntime(ctx)]?.removeRef(this);</span></a>
<a name="79"><span class="lineNum"> 79 </span><span class="lineCov"> 6 : if (obj is JSRef) obj.free();</span></a>
<a name="80"><span class="lineNum"> 80 </span> : }</a>
<a name="81"><span class="lineNum"> 81 </span> : }</a>
<a name="82"><span class="lineNum"> 82 </span> : </a>
<a name="83"><span class="lineNum"> 83 </span> : /// JS Error wrapper</a>
<a name="84"><span class="lineNum"> 84 </span> : class JSError extends _IsolateEncodable {</a>
<a name="85"><span class="lineNum"> 85 </span> : late String message;</a>
<a name="86"><span class="lineNum"> 86 </span> : late String stack;</a>
<a name="87"><span class="lineNum"> 87 </span><span class="lineCov"> 2 : JSError(message, [stack]) {</span></a>
<a name="88"><span class="lineNum"> 88 </span><span class="lineCov"> 2 : if (message is JSError) {</span></a>
<a name="89"><span class="lineNum"> 89 </span><span class="lineNoCov"> 0 : this.message = message.message;</span></a>
<a name="90"><span class="lineNum"> 90 </span><span class="lineNoCov"> 0 : this.stack = message.stack;</span></a>
<a name="91"><span class="lineNum"> 91 </span> : } else {</a>
<a name="92"><span class="lineNum"> 92 </span><span class="lineCov"> 4 : this.message = message.toString();</span></a>
<a name="93"><span class="lineNum"> 93 </span><span class="lineCov"> 5 : this.stack = (stack ?? StackTrace.current).toString();</span></a>
<a name="94"><span class="lineNum"> 94 </span> : }</a>
<a name="95"><span class="lineNum"> 95 </span> : }</a>
<a name="96"><span class="lineNum"> 96 </span> : </a>
<a name="97"><span class="lineNum"> 97 </span><span class="lineNoCov"> 0 : @override</span></a>
<a name="98"><span class="lineNum"> 98 </span> : String toString() {</a>
<a name="99"><span class="lineNum"> 99 </span><span class="lineNoCov"> 0 : return stack.isEmpty ? message.toString() : &quot;$message\n$stack&quot;;</span></a>
<a name="100"><span class="lineNum"> 100 </span> : }</a>
<a name="101"><span class="lineNum"> 101 </span> : </a>
<a name="102"><span class="lineNum"> 102 </span><span class="lineCov"> 3 : static JSError? _decode(Map obj) {</span></a>
<a name="103"><span class="lineNum"> 103 </span><span class="lineCov"> 3 : if (obj.containsKey(#jsError))</span></a>
<a name="104"><span class="lineNum"> 104 </span><span class="lineCov"> 6 : return JSError(obj[#jsError], obj[#jsErrorStack]);</span></a>
<a name="105"><span class="lineNum"> 105 </span> : return null;</a>
<a name="106"><span class="lineNum"> 106 </span> : }</a>
<a name="107"><span class="lineNum"> 107 </span> : </a>
<a name="108"><span class="lineNum"> 108 </span><span class="lineCov"> 2 : @override</span></a>
<a name="109"><span class="lineNum"> 109 </span> : Map _encode() {</a>
<a name="110"><span class="lineNum"> 110 </span><span class="lineCov"> 2 : return {</span></a>
<a name="111"><span class="lineNum"> 111 </span><span class="lineCov"> 2 : #jsError: message,</span></a>
<a name="112"><span class="lineNum"> 112 </span><span class="lineCov"> 2 : #jsErrorStack: stack,</span></a>
<a name="113"><span class="lineNum"> 113 </span> : };</a>
<a name="114"><span class="lineNum"> 114 </span> : }</a>
<a name="115"><span class="lineNum"> 115 </span> : }</a>
<a name="116"><span class="lineNum"> 116 </span> : </a>
<a name="117"><span class="lineNum"> 117 </span> : /// JS Object reference</a>
<a name="118"><span class="lineNum"> 118 </span> : /// call [release] to release js object.</a>
<a name="119"><span class="lineNum"> 119 </span> : class _JSObject extends JSRef {</a>
<a name="120"><span class="lineNum"> 120 </span> : Pointer&lt;JSValue&gt;? _val;</a>
<a name="121"><span class="lineNum"> 121 </span> : Pointer&lt;JSContext&gt;? _ctx;</a>
<a name="122"><span class="lineNum"> 122 </span> : </a>
<a name="123"><span class="lineNum"> 123 </span> : /// Create</a>
<a name="124"><span class="lineNum"> 124 </span><span class="lineCov"> 3 : _JSObject(Pointer&lt;JSContext&gt; ctx, Pointer&lt;JSValue&gt; val) {</span></a>
<a name="125"><span class="lineNum"> 125 </span><span class="lineCov"> 3 : this._ctx = ctx;</span></a>
<a name="126"><span class="lineNum"> 126 </span><span class="lineCov"> 6 : final rt = jsGetRuntime(ctx);</span></a>
<a name="127"><span class="lineNum"> 127 </span><span class="lineCov"> 9 : this._val = jsDupValue(ctx, val);</span></a>
<a name="128"><span class="lineNum"> 128 </span><span class="lineCov"> 9 : runtimeOpaques[rt]?.addRef(this);</span></a>
<a name="129"><span class="lineNum"> 129 </span> : }</a>
<a name="130"><span class="lineNum"> 130 </span> : </a>
<a name="131"><span class="lineNum"> 131 </span><span class="lineCov"> 3 : @override</span></a>
<a name="132"><span class="lineNum"> 132 </span> : void destroy() {</a>
<a name="133"><span class="lineNum"> 133 </span><span class="lineCov"> 3 : final ctx = _ctx;</span></a>
<a name="134"><span class="lineNum"> 134 </span><span class="lineCov"> 3 : final val = _val;</span></a>
<a name="135"><span class="lineNum"> 135 </span><span class="lineCov"> 3 : _val = null;</span></a>
<a name="136"><span class="lineNum"> 136 </span><span class="lineCov"> 3 : _ctx = null;</span></a>
<a name="137"><span class="lineNum"> 137 </span> : if (ctx == null || val == null) return;</a>
<a name="138"><span class="lineNum"> 138 </span><span class="lineCov"> 6 : final rt = jsGetRuntime(ctx);</span></a>
<a name="139"><span class="lineNum"> 139 </span><span class="lineCov"> 9 : runtimeOpaques[rt]?.removeRef(this);</span></a>
<a name="140"><span class="lineNum"> 140 </span><span class="lineCov"> 3 : jsFreeValue(ctx, val);</span></a>
<a name="141"><span class="lineNum"> 141 </span> : }</a>
<a name="142"><span class="lineNum"> 142 </span> : </a>
<a name="143"><span class="lineNum"> 143 </span><span class="lineCov"> 1 : @override</span></a>
<a name="144"><span class="lineNum"> 144 </span> : String toString() {</a>
<a name="145"><span class="lineNum"> 145 </span><span class="lineCov"> 2 : if (_ctx == null || _val == null) return &quot;JSObject(released)&quot;;</span></a>
<a name="146"><span class="lineNum"> 146 </span><span class="lineCov"> 3 : return jsToCString(_ctx!, _val!);</span></a>
<a name="147"><span class="lineNum"> 147 </span> : }</a>
<a name="148"><span class="lineNum"> 148 </span> : }</a>
<a name="149"><span class="lineNum"> 149 </span> : </a>
<a name="150"><span class="lineNum"> 150 </span> : /// JS function wrapper</a>
<a name="151"><span class="lineNum"> 151 </span> : class _JSFunction extends _JSObject implements JSInvokable, _IsolateEncodable {</a>
<a name="152"><span class="lineNum"> 152 </span><span class="lineCov"> 6 : _JSFunction(Pointer&lt;JSContext&gt; ctx, Pointer&lt;JSValue&gt; val) : super(ctx, val);</span></a>
<a name="153"><span class="lineNum"> 153 </span> : </a>
<a name="154"><span class="lineNum"> 154 </span><span class="lineCov"> 3 : @override</span></a>
<a name="155"><span class="lineNum"> 155 </span> : invoke(List&lt;dynamic&gt; arguments, [dynamic thisVal]) {</a>
<a name="156"><span class="lineNum"> 156 </span><span class="lineCov"> 3 : final jsRet = _invoke(arguments, thisVal);</span></a>
<a name="157"><span class="lineNum"> 157 </span><span class="lineCov"> 3 : final ctx = _ctx!;</span></a>
<a name="158"><span class="lineNum"> 158 </span><span class="lineCov"> 9 : bool isException = jsIsException(jsRet) != 0;</span></a>
<a name="159"><span class="lineNum"> 159 </span> : if (isException) {</a>
<a name="160"><span class="lineNum"> 160 </span><span class="lineNoCov"> 0 : jsFreeValue(ctx, jsRet);</span></a>
<a name="161"><span class="lineNum"> 161 </span><span class="lineNoCov"> 0 : throw _parseJSException(ctx);</span></a>
<a name="162"><span class="lineNum"> 162 </span> : }</a>
<a name="163"><span class="lineNum"> 163 </span><span class="lineCov"> 3 : final ret = _jsToDart(ctx, jsRet);</span></a>
<a name="164"><span class="lineNum"> 164 </span><span class="lineCov"> 3 : jsFreeValue(ctx, jsRet);</span></a>
<a name="165"><span class="lineNum"> 165 </span> : return ret;</a>
<a name="166"><span class="lineNum"> 166 </span> : }</a>
<a name="167"><span class="lineNum"> 167 </span> : </a>
<a name="168"><span class="lineNum"> 168 </span><span class="lineCov"> 3 : Pointer&lt;JSValue&gt; _invoke(List&lt;dynamic&gt; arguments, [dynamic thisVal]) {</span></a>
<a name="169"><span class="lineNum"> 169 </span><span class="lineCov"> 3 : final ctx = _ctx;</span></a>
<a name="170"><span class="lineNum"> 170 </span><span class="lineCov"> 3 : final val = _val;</span></a>
<a name="171"><span class="lineNum"> 171 </span> : if (ctx == null || val == null)</a>
<a name="172"><span class="lineNum"> 172 </span><span class="lineNoCov"> 0 : throw JSError(&quot;InternalError: JSValue released&quot;);</span></a>
<a name="173"><span class="lineNum"> 173 </span> : final args = arguments</a>
<a name="174"><span class="lineNum"> 174 </span><span class="lineCov"> 3 : .map(</span></a>
<a name="175"><span class="lineNum"> 175 </span><span class="lineCov"> 6 : (e) =&gt; _dartToJs(ctx, e),</span></a>
<a name="176"><span class="lineNum"> 176 </span> : )</a>
<a name="177"><span class="lineNum"> 177 </span><span class="lineCov"> 3 : .toList();</span></a>
<a name="178"><span class="lineNum"> 178 </span><span class="lineCov"> 3 : final jsThis = _dartToJs(ctx, thisVal);</span></a>
<a name="179"><span class="lineNum"> 179 </span><span class="lineCov"> 3 : final jsRet = jsCall(ctx, val, jsThis, args);</span></a>
<a name="180"><span class="lineNum"> 180 </span><span class="lineCov"> 3 : jsFreeValue(ctx, jsThis);</span></a>
<a name="181"><span class="lineNum"> 181 </span><span class="lineCov"> 6 : for (final jsArg in args) {</span></a>
<a name="182"><span class="lineNum"> 182 </span><span class="lineCov"> 3 : jsFreeValue(ctx, jsArg);</span></a>
<a name="183"><span class="lineNum"> 183 </span> : }</a>
<a name="184"><span class="lineNum"> 184 </span> : return jsRet;</a>
<a name="185"><span class="lineNum"> 185 </span> : }</a>
<a name="186"><span class="lineNum"> 186 </span> : </a>
<a name="187"><span class="lineNum"> 187 </span><span class="lineCov"> 2 : @override</span></a>
<a name="188"><span class="lineNum"> 188 </span> : Map _encode() {</a>
<a name="189"><span class="lineNum"> 189 </span><span class="lineCov"> 4 : return IsolateFunction._new(this)._encode();</span></a>
<a name="190"><span class="lineNum"> 190 </span> : }</a>
<a name="191"><span class="lineNum"> 191 </span> : }</a>
<a name="192"><span class="lineNum"> 192 </span> : </a>
<a name="193"><span class="lineNum"> 193 </span> : /// Dart function wrapper for isolate</a>
<a name="194"><span class="lineNum"> 194 </span> : class IsolateFunction extends JSInvokable implements _IsolateEncodable {</a>
<a name="195"><span class="lineNum"> 195 </span> : int? _isolateId;</a>
<a name="196"><span class="lineNum"> 196 </span> : SendPort? _port;</a>
<a name="197"><span class="lineNum"> 197 </span> : JSInvokable? _invokable;</a>
<a name="198"><span class="lineNum"> 198 </span><span class="lineCov"> 3 : IsolateFunction._fromId(this._isolateId, this._port);</span></a>
<a name="199"><span class="lineNum"> 199 </span> : </a>
<a name="200"><span class="lineNum"> 200 </span><span class="lineCov"> 3 : IsolateFunction._new(this._invokable) {</span></a>
<a name="201"><span class="lineNum"> 201 </span><span class="lineCov"> 6 : _handlers.add(this);</span></a>
<a name="202"><span class="lineNum"> 202 </span> : }</a>
<a name="203"><span class="lineNum"> 203 </span><span class="lineCov"> 3 : IsolateFunction(Function func) : this._new(_DartFunction(func));</span></a>
<a name="204"><span class="lineNum"> 204 </span> : </a>
<a name="205"><span class="lineNum"> 205 </span> : static ReceivePort? _invokeHandler;</a>
<a name="206"><span class="lineNum"> 206 </span><span class="lineCov"> 6 : static Set&lt;IsolateFunction&gt; _handlers = Set();</span></a>
<a name="207"><span class="lineNum"> 207 </span> : </a>
<a name="208"><span class="lineNum"> 208 </span><span class="lineCov"> 3 : static get _handlePort {</span></a>
<a name="209"><span class="lineNum"> 209 </span> : if (_invokeHandler == null) {</a>
<a name="210"><span class="lineNum"> 210 </span><span class="lineCov"> 3 : _invokeHandler = ReceivePort();</span></a>
<a name="211"><span class="lineNum"> 211 </span><span class="lineCov"> 6 : _invokeHandler!.listen((msg) async {</span></a>
<a name="212"><span class="lineNum"> 212 </span><span class="lineCov"> 3 : final msgPort = msg[#port];</span></a>
<a name="213"><span class="lineNum"> 213 </span> : try {</a>
<a name="214"><span class="lineNum"> 214 </span><span class="lineCov"> 6 : final handler = _handlers.firstWhereOrNull(</span></a>
<a name="215"><span class="lineNum"> 215 </span><span class="lineCov"> 12 : (v) =&gt; identityHashCode(v) == msg[#handler],</span></a>
<a name="216"><span class="lineNum"> 216 </span> : );</a>
<a name="217"><span class="lineNum"> 217 </span><span class="lineNoCov"> 0 : if (handler == null) throw JSError('handler released');</span></a>
<a name="218"><span class="lineNum"> 218 </span><span class="lineCov"> 12 : final ret = _encodeData(await handler._handle(msg[#msg]));</span></a>
<a name="219"><span class="lineNum"> 219 </span><span class="lineCov"> 3 : if (msgPort != null) msgPort.send(ret);</span></a>
<a name="220"><span class="lineNum"> 220 </span> : } catch (e) {</a>
<a name="221"><span class="lineNum"> 221 </span><span class="lineNoCov"> 0 : final err = _encodeData(e);</span></a>
<a name="222"><span class="lineNum"> 222 </span> : if (msgPort != null)</a>
<a name="223"><span class="lineNum"> 223 </span><span class="lineNoCov"> 0 : msgPort.send({</span></a>
<a name="224"><span class="lineNum"> 224 </span> : #error: err,</a>
<a name="225"><span class="lineNum"> 225 </span> : });</a>
<a name="226"><span class="lineNum"> 226 </span> : }</a>
<a name="227"><span class="lineNum"> 227 </span> : });</a>
<a name="228"><span class="lineNum"> 228 </span> : }</a>
<a name="229"><span class="lineNum"> 229 </span><span class="lineCov"> 3 : return _invokeHandler!.sendPort;</span></a>
<a name="230"><span class="lineNum"> 230 </span> : }</a>
<a name="231"><span class="lineNum"> 231 </span> : </a>
<a name="232"><span class="lineNum"> 232 </span><span class="lineCov"> 3 : _send(msg) async {</span></a>
<a name="233"><span class="lineNum"> 233 </span><span class="lineCov"> 3 : final port = _port;</span></a>
<a name="234"><span class="lineNum"> 234 </span><span class="lineCov"> 1 : if (port == null) return _handle(msg);</span></a>
<a name="235"><span class="lineNum"> 235 </span><span class="lineCov"> 3 : final evaluatePort = ReceivePort();</span></a>
<a name="236"><span class="lineNum"> 236 </span><span class="lineCov"> 6 : port.send({</span></a>
<a name="237"><span class="lineNum"> 237 </span><span class="lineCov"> 3 : #handler: _isolateId,</span></a>
<a name="238"><span class="lineNum"> 238 </span> : #msg: msg,</a>
<a name="239"><span class="lineNum"> 239 </span><span class="lineCov"> 3 : #port: evaluatePort.sendPort,</span></a>
<a name="240"><span class="lineNum"> 240 </span> : });</a>
<a name="241"><span class="lineNum"> 241 </span><span class="lineCov"> 6 : final result = await evaluatePort.first;</span></a>
<a name="242"><span class="lineNum"> 242 </span><span class="lineCov"> 5 : if (result is Map &amp;&amp; result.containsKey(#error))</span></a>
<a name="243"><span class="lineNum"> 243 </span><span class="lineNoCov"> 0 : throw _decodeData(result[#error]);</span></a>
<a name="244"><span class="lineNum"> 244 </span><span class="lineCov"> 3 : return _decodeData(result);</span></a>
<a name="245"><span class="lineNum"> 245 </span> : }</a>
<a name="246"><span class="lineNum"> 246 </span> : </a>
<a name="247"><span class="lineNum"> 247 </span><span class="lineCov"> 2 : _destroy() {</span></a>
<a name="248"><span class="lineNum"> 248 </span><span class="lineCov"> 4 : _handlers.remove(this);</span></a>
<a name="249"><span class="lineNum"> 249 </span><span class="lineCov"> 4 : _invokable?.free();</span></a>
<a name="250"><span class="lineNum"> 250 </span><span class="lineCov"> 2 : _invokable = null;</span></a>
<a name="251"><span class="lineNum"> 251 </span> : }</a>
<a name="252"><span class="lineNum"> 252 </span> : </a>
<a name="253"><span class="lineNum"> 253 </span><span class="lineCov"> 3 : _handle(msg) async {</span></a>
<a name="254"><span class="lineNum"> 254 </span> : switch (msg) {</a>
<a name="255"><span class="lineNum"> 255 </span><span class="lineCov"> 3 : case #dup:</span></a>
<a name="256"><span class="lineNum"> 256 </span><span class="lineCov"> 6 : _refCount++;</span></a>
<a name="257"><span class="lineNum"> 257 </span> : return null;</a>
<a name="258"><span class="lineNum"> 258 </span><span class="lineCov"> 3 : case #free:</span></a>
<a name="259"><span class="lineNum"> 259 </span><span class="lineCov"> 6 : _refCount--;</span></a>
<a name="260"><span class="lineNum"> 260 </span><span class="lineCov"> 8 : if (_refCount &lt; 0) _destroy();</span></a>
<a name="261"><span class="lineNum"> 261 </span> : return null;</a>
<a name="262"><span class="lineNum"> 262 </span><span class="lineCov"> 3 : case #destroy:</span></a>
<a name="263"><span class="lineNum"> 263 </span><span class="lineNoCov"> 0 : _destroy();</span></a>
<a name="264"><span class="lineNum"> 264 </span> : return null;</a>
<a name="265"><span class="lineNum"> 265 </span> : }</a>
<a name="266"><span class="lineNum"> 266 </span><span class="lineCov"> 6 : final List args = _decodeData(msg[#args]);</span></a>
<a name="267"><span class="lineNum"> 267 </span><span class="lineCov"> 6 : final thisVal = _decodeData(msg[#thisVal]);</span></a>
<a name="268"><span class="lineNum"> 268 </span><span class="lineCov"> 6 : return _invokable?.invoke(args, thisVal);</span></a>
<a name="269"><span class="lineNum"> 269 </span> : }</a>
<a name="270"><span class="lineNum"> 270 </span> : </a>
<a name="271"><span class="lineNum"> 271 </span> : @override</a>
<a name="272"><span class="lineNum"> 272 </span><span class="lineCov"> 3 : Future invoke(List positionalArguments, [thisVal]) async {</span></a>
<a name="273"><span class="lineNum"> 273 </span><span class="lineCov"> 3 : final List dArgs = _encodeData(positionalArguments);</span></a>
<a name="274"><span class="lineNum"> 274 </span><span class="lineCov"> 3 : final dThisVal = _encodeData(thisVal);</span></a>
<a name="275"><span class="lineNum"> 275 </span><span class="lineCov"> 6 : return _send({</span></a>
<a name="276"><span class="lineNum"> 276 </span> : #args: dArgs,</a>
<a name="277"><span class="lineNum"> 277 </span> : #thisVal: dThisVal,</a>
<a name="278"><span class="lineNum"> 278 </span> : });</a>
<a name="279"><span class="lineNum"> 279 </span> : }</a>
<a name="280"><span class="lineNum"> 280 </span> : </a>
<a name="281"><span class="lineNum"> 281 </span><span class="lineCov"> 3 : static IsolateFunction? _decode(Map obj) {</span></a>
<a name="282"><span class="lineNum"> 282 </span><span class="lineCov"> 3 : if (obj.containsKey(#jsFunctionPort))</span></a>
<a name="283"><span class="lineNum"> 283 </span><span class="lineCov"> 3 : return IsolateFunction._fromId(</span></a>
<a name="284"><span class="lineNum"> 284 </span><span class="lineCov"> 3 : obj[#jsFunctionId],</span></a>
<a name="285"><span class="lineNum"> 285 </span><span class="lineCov"> 3 : obj[#jsFunctionPort],</span></a>
<a name="286"><span class="lineNum"> 286 </span> : );</a>
<a name="287"><span class="lineNum"> 287 </span> : return null;</a>
<a name="288"><span class="lineNum"> 288 </span> : }</a>
<a name="289"><span class="lineNum"> 289 </span> : </a>
<a name="290"><span class="lineNum"> 290 </span><span class="lineCov"> 3 : @override</span></a>
<a name="291"><span class="lineNum"> 291 </span> : Map _encode() {</a>
<a name="292"><span class="lineNum"> 292 </span><span class="lineCov"> 3 : return {</span></a>
<a name="293"><span class="lineNum"> 293 </span><span class="lineCov"> 6 : #jsFunctionId: _isolateId ?? identityHashCode(this),</span></a>
<a name="294"><span class="lineNum"> 294 </span><span class="lineCov"> 6 : #jsFunctionPort: _port ?? IsolateFunction._handlePort,</span></a>
<a name="295"><span class="lineNum"> 295 </span> : };</a>
<a name="296"><span class="lineNum"> 296 </span> : }</a>
<a name="297"><span class="lineNum"> 297 </span> : </a>
<a name="298"><span class="lineNum"> 298 </span> : int _refCount = 0;</a>
<a name="299"><span class="lineNum"> 299 </span> : </a>
<a name="300"><span class="lineNum"> 300 </span><span class="lineCov"> 3 : @override</span></a>
<a name="301"><span class="lineNum"> 301 </span> : dup() {</a>
<a name="302"><span class="lineNum"> 302 </span><span class="lineCov"> 3 : _send(#dup);</span></a>
<a name="303"><span class="lineNum"> 303 </span> : }</a>
<a name="304"><span class="lineNum"> 304 </span> : </a>
<a name="305"><span class="lineNum"> 305 </span><span class="lineCov"> 3 : @override</span></a>
<a name="306"><span class="lineNum"> 306 </span> : free() {</a>
<a name="307"><span class="lineNum"> 307 </span><span class="lineCov"> 3 : _send(#free);</span></a>
<a name="308"><span class="lineNum"> 308 </span> : }</a>
<a name="309"><span class="lineNum"> 309 </span> : </a>
<a name="310"><span class="lineNum"> 310 </span><span class="lineNoCov"> 0 : @override</span></a>
<a name="311"><span class="lineNum"> 311 </span> : void destroy() {</a>
<a name="312"><span class="lineNum"> 312 </span><span class="lineNoCov"> 0 : _send(#destroy);</span></a>
<a name="313"><span class="lineNum"> 313 </span> : }</a>
<a name="314"><span class="lineNum"> 314 </span> : }</a>
</pre>
</td>
</tr>
</table>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,72 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/wrapper.dart - functions</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - wrapper.dart<span style="font-size: 80%;"> (<a href="wrapper.dart.gcov.html">source</a> / functions)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">149</td>
<td class="headerCovTableEntry">158</td>
<td class="headerCovTableEntryHi">94.3 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="60%" cellpadding=1 cellspacing=1 border=0>
<tr><td><br></td></tr>
<tr>
<td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><a href="wrapper.dart.func.html"><img src="../updown.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></a></span></td>
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></span></td>
</tr>
</table>
<br>
</center>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,72 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/wrapper.dart - functions</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - wrapper.dart<span style="font-size: 80%;"> (<a href="wrapper.dart.gcov.html">source</a> / functions)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">149</td>
<td class="headerCovTableEntry">158</td>
<td class="headerCovTableEntryHi">94.3 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<center>
<table width="60%" cellpadding=1 cellspacing=1 border=0>
<tr><td><br></td></tr>
<tr>
<td width="80%" class="tableHead">Function Name <span class="tableHeadSort"><img src="../glass.png" width=10 height=14 alt="Sort by function name" title="Sort by function name" border=0></span></td>
<td width="20%" class="tableHead">Hit count <span class="tableHeadSort"><a href="wrapper.dart.func-sort-c.html"><img src="../updown.png" width=10 height=14 alt="Sort by hit count" title="Sort by hit count" border=0></a></span></td>
</tr>
</table>
<br>
</center>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

View File

@@ -1,325 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>LCOV - lcov.info - src/wrapper.dart</title>
<link rel="stylesheet" type="text/css" href="../gcov.css">
</head>
<body>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="title">LCOV - code coverage report</td></tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr>
<td width="100%">
<table cellpadding=1 border=0 width="100%">
<tr>
<td width="10%" class="headerItem">Current view:</td>
<td width="35%" class="headerValue"><a href="../index.html">top level</a> - <a href="index.html">src</a> - wrapper.dart<span style="font-size: 80%;"> (source / <a href="wrapper.dart.func-sort-c.html">functions</a>)</span></td>
<td width="5%"></td>
<td width="15%"></td>
<td width="10%" class="headerCovTableHead">Hit</td>
<td width="10%" class="headerCovTableHead">Total</td>
<td width="15%" class="headerCovTableHead">Coverage</td>
</tr>
<tr>
<td class="headerItem">Test:</td>
<td class="headerValue">lcov.info</td>
<td></td>
<td class="headerItem">Lines:</td>
<td class="headerCovTableEntry">149</td>
<td class="headerCovTableEntry">158</td>
<td class="headerCovTableEntryHi">94.3 %</td>
</tr>
<tr>
<td class="headerItem">Date:</td>
<td class="headerValue">2021-03-31 22:28:15</td>
<td></td>
<td class="headerItem">Functions:</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntry">0</td>
<td class="headerCovTableEntryHi">-</td>
</tr>
<tr><td><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
</td>
</tr>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
</table>
<table cellpadding=0 cellspacing=0 border=0>
<tr>
<td><br></td>
</tr>
<tr>
<td>
<pre class="sourceHeading"> Line data Source code</pre>
<pre class="source">
<a name="1"><span class="lineNum"> 1 </span> : /*</a>
<a name="2"><span class="lineNum"> 2 </span> : * @Description: wrapper</a>
<a name="3"><span class="lineNum"> 3 </span> : * @Author: ekibun</a>
<a name="4"><span class="lineNum"> 4 </span> : * @Date: 2020-09-19 22:07:47</a>
<a name="5"><span class="lineNum"> 5 </span> : * @LastEditors: ekibun</a>
<a name="6"><span class="lineNum"> 6 </span> : * @LastEditTime: 2020-12-02 11:14:03</a>
<a name="7"><span class="lineNum"> 7 </span> : */</a>
<a name="8"><span class="lineNum"> 8 </span> : part of '../flutter_qjs.dart';</a>
<a name="9"><span class="lineNum"> 9 </span> : </a>
<a name="10"><span class="lineNum"> 10 </span><span class="lineCov"> 2 : dynamic _parseJSException(Pointer&lt;JSContext&gt; ctx, [Pointer&lt;JSValue&gt;? perr]) {</span></a>
<a name="11"><span class="lineNum"> 11 </span><span class="lineCov"> 2 : final e = perr ?? jsGetException(ctx);</span></a>
<a name="12"><span class="lineNum"> 12 </span> : var err;</a>
<a name="13"><span class="lineNum"> 13 </span> : try {</a>
<a name="14"><span class="lineNum"> 14 </span><span class="lineCov"> 2 : err = _jsToDart(ctx, e);</span></a>
<a name="15"><span class="lineNum"> 15 </span> : } catch (exception) {</a>
<a name="16"><span class="lineNum"> 16 </span> : err = exception;</a>
<a name="17"><span class="lineNum"> 17 </span> : }</a>
<a name="18"><span class="lineNum"> 18 </span><span class="lineCov"> 1 : if (perr == null) jsFreeValue(ctx, e);</span></a>
<a name="19"><span class="lineNum"> 19 </span> : return err;</a>
<a name="20"><span class="lineNum"> 20 </span> : }</a>
<a name="21"><span class="lineNum"> 21 </span> : </a>
<a name="22"><span class="lineNum"> 22 </span><span class="lineCov"> 2 : void _definePropertyValue(</span></a>
<a name="23"><span class="lineNum"> 23 </span> : Pointer&lt;JSContext&gt; ctx,</a>
<a name="24"><span class="lineNum"> 24 </span> : Pointer&lt;JSValue&gt; obj,</a>
<a name="25"><span class="lineNum"> 25 </span> : dynamic key,</a>
<a name="26"><span class="lineNum"> 26 </span> : dynamic val, {</a>
<a name="27"><span class="lineNum"> 27 </span> : Map&lt;dynamic, Pointer&lt;JSValue&gt;&gt;? cache,</a>
<a name="28"><span class="lineNum"> 28 </span> : }) {</a>
<a name="29"><span class="lineNum"> 29 </span><span class="lineCov"> 2 : final jsAtomVal = _dartToJs(ctx, key, cache: cache);</span></a>
<a name="30"><span class="lineNum"> 30 </span><span class="lineCov"> 4 : final jsAtom = jsValueToAtom(ctx, jsAtomVal);</span></a>
<a name="31"><span class="lineNum"> 31 </span><span class="lineCov"> 4 : jsDefinePropertyValue(</span></a>
<a name="32"><span class="lineNum"> 32 </span> : ctx,</a>
<a name="33"><span class="lineNum"> 33 </span> : obj,</a>
<a name="34"><span class="lineNum"> 34 </span> : jsAtom,</a>
<a name="35"><span class="lineNum"> 35 </span><span class="lineCov"> 2 : _dartToJs(ctx, val, cache: cache),</span></a>
<a name="36"><span class="lineNum"> 36 </span> : JSProp.C_W_E,</a>
<a name="37"><span class="lineNum"> 37 </span> : );</a>
<a name="38"><span class="lineNum"> 38 </span><span class="lineCov"> 4 : jsFreeAtom(ctx, jsAtom);</span></a>
<a name="39"><span class="lineNum"> 39 </span><span class="lineCov"> 2 : jsFreeValue(ctx, jsAtomVal);</span></a>
<a name="40"><span class="lineNum"> 40 </span> : }</a>
<a name="41"><span class="lineNum"> 41 </span> : </a>
<a name="42"><span class="lineNum"> 42 </span><span class="lineCov"> 3 : Pointer&lt;JSValue&gt; _jsGetPropertyValue(</span></a>
<a name="43"><span class="lineNum"> 43 </span> : Pointer&lt;JSContext&gt; ctx,</a>
<a name="44"><span class="lineNum"> 44 </span> : Pointer&lt;JSValue&gt; obj,</a>
<a name="45"><span class="lineNum"> 45 </span> : dynamic key, {</a>
<a name="46"><span class="lineNum"> 46 </span> : Map&lt;dynamic, Pointer&lt;JSValue&gt;&gt;? cache,</a>
<a name="47"><span class="lineNum"> 47 </span> : }) {</a>
<a name="48"><span class="lineNum"> 48 </span><span class="lineCov"> 3 : final jsAtomVal = _dartToJs(ctx, key, cache: cache);</span></a>
<a name="49"><span class="lineNum"> 49 </span><span class="lineCov"> 6 : final jsAtom = jsValueToAtom(ctx, jsAtomVal);</span></a>
<a name="50"><span class="lineNum"> 50 </span><span class="lineCov"> 6 : final jsProp = jsGetProperty(ctx, obj, jsAtom);</span></a>
<a name="51"><span class="lineNum"> 51 </span><span class="lineCov"> 6 : jsFreeAtom(ctx, jsAtom);</span></a>
<a name="52"><span class="lineNum"> 52 </span><span class="lineCov"> 3 : jsFreeValue(ctx, jsAtomVal);</span></a>
<a name="53"><span class="lineNum"> 53 </span> : return jsProp;</a>
<a name="54"><span class="lineNum"> 54 </span> : }</a>
<a name="55"><span class="lineNum"> 55 </span> : </a>
<a name="56"><span class="lineNum"> 56 </span><span class="lineCov"> 3 : Pointer&lt;JSValue&gt; _dartToJs(Pointer&lt;JSContext&gt; ctx, dynamic val,</span></a>
<a name="57"><span class="lineNum"> 57 </span> : {Map&lt;dynamic, Pointer&lt;JSValue&gt;&gt;? cache}) {</a>
<a name="58"><span class="lineNum"> 58 </span><span class="lineCov"> 6 : if (val == null) return jsUNDEFINED();</span></a>
<a name="59"><span class="lineNum"> 59 </span><span class="lineCov"> 3 : if (val is Error) return _dartToJs(ctx, JSError(val, val.stackTrace));</span></a>
<a name="60"><span class="lineNum"> 60 </span><span class="lineCov"> 3 : if (val is Exception) return _dartToJs(ctx, JSError(val));</span></a>
<a name="61"><span class="lineNum"> 61 </span><span class="lineCov"> 3 : if (val is JSError) {</span></a>
<a name="62"><span class="lineNum"> 62 </span><span class="lineCov"> 4 : final ret = jsNewError(ctx);</span></a>
<a name="63"><span class="lineNum"> 63 </span><span class="lineCov"> 2 : _definePropertyValue(ctx, ret, &quot;name&quot;, &quot;&quot;);</span></a>
<a name="64"><span class="lineNum"> 64 </span><span class="lineCov"> 4 : _definePropertyValue(ctx, ret, &quot;message&quot;, val.message);</span></a>
<a name="65"><span class="lineNum"> 65 </span><span class="lineCov"> 4 : _definePropertyValue(ctx, ret, &quot;stack&quot;, val.stack);</span></a>
<a name="66"><span class="lineNum"> 66 </span> : return ret;</a>
<a name="67"><span class="lineNum"> 67 </span> : }</a>
<a name="68"><span class="lineNum"> 68 </span><span class="lineCov"> 12 : if (val is _JSObject) return jsDupValue(ctx, val._val!);</span></a>
<a name="69"><span class="lineNum"> 69 </span><span class="lineCov"> 3 : if (val is Future) {</span></a>
<a name="70"><span class="lineNum"> 70 </span><span class="lineCov"> 9 : final resolvingFunc = malloc&lt;Uint8&gt;(sizeOfJSValue * 2).cast&lt;JSValue&gt;();</span></a>
<a name="71"><span class="lineNum"> 71 </span> : final resolvingFunc2 =</a>
<a name="72"><span class="lineNum"> 72 </span><span class="lineCov"> 12 : Pointer&lt;JSValue&gt;.fromAddress(resolvingFunc.address + sizeOfJSValue);</span></a>
<a name="73"><span class="lineNum"> 73 </span><span class="lineCov"> 6 : final ret = jsNewPromiseCapability(ctx, resolvingFunc);</span></a>
<a name="74"><span class="lineNum"> 74 </span><span class="lineCov"> 3 : final _JSFunction res = _jsToDart(ctx, resolvingFunc);</span></a>
<a name="75"><span class="lineNum"> 75 </span><span class="lineCov"> 3 : final _JSFunction rej = _jsToDart(ctx, resolvingFunc2);</span></a>
<a name="76"><span class="lineNum"> 76 </span><span class="lineCov"> 3 : jsFreeValue(ctx, resolvingFunc, free: false);</span></a>
<a name="77"><span class="lineNum"> 77 </span><span class="lineCov"> 3 : jsFreeValue(ctx, resolvingFunc2, free: false);</span></a>
<a name="78"><span class="lineNum"> 78 </span><span class="lineCov"> 3 : malloc.free(resolvingFunc);</span></a>
<a name="79"><span class="lineNum"> 79 </span><span class="lineCov"> 3 : final refRes = _DartObject(ctx, res);</span></a>
<a name="80"><span class="lineNum"> 80 </span><span class="lineCov"> 3 : final refRej = _DartObject(ctx, rej);</span></a>
<a name="81"><span class="lineNum"> 81 </span><span class="lineCov"> 3 : res.free();</span></a>
<a name="82"><span class="lineNum"> 82 </span><span class="lineCov"> 3 : rej.free();</span></a>
<a name="83"><span class="lineNum"> 83 </span><span class="lineCov"> 6 : val.then((value) {</span></a>
<a name="84"><span class="lineNum"> 84 </span><span class="lineCov"> 6 : res.invoke([value]);</span></a>
<a name="85"><span class="lineNum"> 85 </span><span class="lineCov"> 2 : }, onError: (e) {</span></a>
<a name="86"><span class="lineNum"> 86 </span><span class="lineCov"> 4 : rej.invoke([e]);</span></a>
<a name="87"><span class="lineNum"> 87 </span><span class="lineCov"> 6 : }).whenComplete(() {</span></a>
<a name="88"><span class="lineNum"> 88 </span><span class="lineCov"> 3 : refRes.free();</span></a>
<a name="89"><span class="lineNum"> 89 </span><span class="lineCov"> 3 : refRej.free();</span></a>
<a name="90"><span class="lineNum"> 90 </span> : });</a>
<a name="91"><span class="lineNum"> 91 </span> : return ret;</a>
<a name="92"><span class="lineNum"> 92 </span> : }</a>
<a name="93"><span class="lineNum"> 93 </span><span class="lineCov"> 3 : if (cache == null) cache = Map();</span></a>
<a name="94"><span class="lineNum"> 94 </span><span class="lineCov"> 7 : if (val is bool) return jsNewBool(ctx, val ? 1 : 0);</span></a>
<a name="95"><span class="lineNum"> 95 </span><span class="lineCov"> 7 : if (val is int) return jsNewInt64(ctx, val);</span></a>
<a name="96"><span class="lineNum"> 96 </span><span class="lineCov"> 7 : if (val is double) return jsNewFloat64(ctx, val);</span></a>
<a name="97"><span class="lineNum"> 97 </span><span class="lineCov"> 6 : if (val is String) return jsNewString(ctx, val);</span></a>
<a name="98"><span class="lineNum"> 98 </span><span class="lineCov"> 3 : if (val is Uint8List) {</span></a>
<a name="99"><span class="lineNum"> 99 </span><span class="lineNoCov"> 0 : final ptr = malloc&lt;Uint8&gt;(val.length);</span></a>
<a name="100"><span class="lineNum"> 100 </span><span class="lineNoCov"> 0 : final byteList = ptr.asTypedList(val.length);</span></a>
<a name="101"><span class="lineNum"> 101 </span><span class="lineNoCov"> 0 : byteList.setAll(0, val);</span></a>
<a name="102"><span class="lineNum"> 102 </span><span class="lineNoCov"> 0 : final ret = jsNewArrayBufferCopy(ctx, ptr, val.length);</span></a>
<a name="103"><span class="lineNum"> 103 </span><span class="lineNoCov"> 0 : malloc.free(ptr);</span></a>
<a name="104"><span class="lineNum"> 104 </span> : return ret;</a>
<a name="105"><span class="lineNum"> 105 </span> : }</a>
<a name="106"><span class="lineNum"> 106 </span><span class="lineCov"> 3 : if (cache.containsKey(val)) {</span></a>
<a name="107"><span class="lineNum"> 107 </span><span class="lineCov"> 6 : return jsDupValue(ctx, cache[val]!);</span></a>
<a name="108"><span class="lineNum"> 108 </span> : }</a>
<a name="109"><span class="lineNum"> 109 </span><span class="lineCov"> 3 : if (val is List) {</span></a>
<a name="110"><span class="lineNum"> 110 </span><span class="lineCov"> 4 : final ret = jsNewArray(ctx);</span></a>
<a name="111"><span class="lineNum"> 111 </span><span class="lineCov"> 2 : cache[val] = ret;</span></a>
<a name="112"><span class="lineNum"> 112 </span><span class="lineCov"> 6 : for (int i = 0; i &lt; val.length; ++i) {</span></a>
<a name="113"><span class="lineNum"> 113 </span><span class="lineCov"> 4 : _definePropertyValue(ctx, ret, i, val[i], cache: cache);</span></a>
<a name="114"><span class="lineNum"> 114 </span> : }</a>
<a name="115"><span class="lineNum"> 115 </span> : return ret;</a>
<a name="116"><span class="lineNum"> 116 </span> : }</a>
<a name="117"><span class="lineNum"> 117 </span><span class="lineCov"> 3 : if (val is Map) {</span></a>
<a name="118"><span class="lineNum"> 118 </span><span class="lineCov"> 4 : final ret = jsNewObject(ctx);</span></a>
<a name="119"><span class="lineNum"> 119 </span><span class="lineCov"> 2 : cache[val] = ret;</span></a>
<a name="120"><span class="lineNum"> 120 </span><span class="lineCov"> 4 : for (MapEntry&lt;dynamic, dynamic&gt; entry in val.entries) {</span></a>
<a name="121"><span class="lineNum"> 121 </span><span class="lineCov"> 6 : _definePropertyValue(ctx, ret, entry.key, entry.value, cache: cache);</span></a>
<a name="122"><span class="lineNum"> 122 </span> : }</a>
<a name="123"><span class="lineNum"> 123 </span> : return ret;</a>
<a name="124"><span class="lineNum"> 124 </span> : }</a>
<a name="125"><span class="lineNum"> 125 </span> : // wrap Function to JSInvokable</a>
<a name="126"><span class="lineNum"> 126 </span><span class="lineCov"> 3 : final valWrap = JSInvokable._wrap(val);</span></a>
<a name="127"><span class="lineNum"> 127 </span> : final dartObjectClassId =</a>
<a name="128"><span class="lineNum"> 128 </span><span class="lineCov"> 15 : runtimeOpaques[jsGetRuntime(ctx)]?.dartObjectClassId ?? 0;</span></a>
<a name="129"><span class="lineNum"> 129 </span><span class="lineCov"> 3 : if (dartObjectClassId == 0) return jsUNDEFINED();</span></a>
<a name="130"><span class="lineNum"> 130 </span><span class="lineCov"> 6 : final dartObject = jsNewObjectClass(</span></a>
<a name="131"><span class="lineNum"> 131 </span> : ctx,</a>
<a name="132"><span class="lineNum"> 132 </span> : dartObjectClassId,</a>
<a name="133"><span class="lineNum"> 133 </span><span class="lineCov"> 6 : identityHashCode(_DartObject(ctx, valWrap)),</span></a>
<a name="134"><span class="lineNum"> 134 </span> : );</a>
<a name="135"><span class="lineNum"> 135 </span><span class="lineCov"> 3 : if (valWrap is JSInvokable) {</span></a>
<a name="136"><span class="lineNum"> 136 </span><span class="lineCov"> 6 : final ret = jsNewCFunction(ctx, dartObject);</span></a>
<a name="137"><span class="lineNum"> 137 </span><span class="lineCov"> 3 : jsFreeValue(ctx, dartObject);</span></a>
<a name="138"><span class="lineNum"> 138 </span> : return ret;</a>
<a name="139"><span class="lineNum"> 139 </span> : }</a>
<a name="140"><span class="lineNum"> 140 </span> : return dartObject;</a>
<a name="141"><span class="lineNum"> 141 </span> : }</a>
<a name="142"><span class="lineNum"> 142 </span> : </a>
<a name="143"><span class="lineNum"> 143 </span><span class="lineCov"> 3 : dynamic _jsToDart(Pointer&lt;JSContext&gt; ctx, Pointer&lt;JSValue&gt; val,</span></a>
<a name="144"><span class="lineNum"> 144 </span> : {Map&lt;int, dynamic&gt;? cache}) {</a>
<a name="145"><span class="lineNum"> 145 </span><span class="lineCov"> 3 : if (cache == null) cache = Map();</span></a>
<a name="146"><span class="lineNum"> 146 </span><span class="lineCov"> 6 : final tag = jsValueGetTag(val);</span></a>
<a name="147"><span class="lineNum"> 147 </span><span class="lineCov"> 9 : if (jsTagIsFloat64(tag) != 0) {</span></a>
<a name="148"><span class="lineNum"> 148 </span><span class="lineCov"> 4 : return jsToFloat64(ctx, val);</span></a>
<a name="149"><span class="lineNum"> 149 </span> : }</a>
<a name="150"><span class="lineNum"> 150 </span> : switch (tag) {</a>
<a name="151"><span class="lineNum"> 151 </span><span class="lineCov"> 3 : case JSTag.BOOL:</span></a>
<a name="152"><span class="lineNum"> 152 </span><span class="lineCov"> 6 : return jsToBool(ctx, val) != 0;</span></a>
<a name="153"><span class="lineNum"> 153 </span><span class="lineCov"> 3 : case JSTag.INT:</span></a>
<a name="154"><span class="lineNum"> 154 </span><span class="lineCov"> 4 : return jsToInt64(ctx, val);</span></a>
<a name="155"><span class="lineNum"> 155 </span><span class="lineCov"> 3 : case JSTag.STRING:</span></a>
<a name="156"><span class="lineNum"> 156 </span><span class="lineCov"> 3 : return jsToCString(ctx, val);</span></a>
<a name="157"><span class="lineNum"> 157 </span><span class="lineCov"> 3 : case JSTag.OBJECT:</span></a>
<a name="158"><span class="lineNum"> 158 </span><span class="lineCov"> 6 : final rt = jsGetRuntime(ctx);</span></a>
<a name="159"><span class="lineNum"> 159 </span><span class="lineCov"> 9 : final dartObjectClassId = runtimeOpaques[rt]?.dartObjectClassId;</span></a>
<a name="160"><span class="lineNum"> 160 </span> : if (dartObjectClassId != null) {</a>
<a name="161"><span class="lineNum"> 161 </span><span class="lineCov"> 3 : final dartObject = _DartObject.fromAddress(</span></a>
<a name="162"><span class="lineNum"> 162 </span><span class="lineCov"> 6 : rt, jsGetObjectOpaque(val, dartObjectClassId));</span></a>
<a name="163"><span class="lineNum"> 163 </span><span class="lineCov"> 3 : if (dartObject != null) return dartObject._obj;</span></a>
<a name="164"><span class="lineNum"> 164 </span> : }</a>
<a name="165"><span class="lineNum"> 165 </span> : final psize = malloc&lt;IntPtr&gt;();</a>
<a name="166"><span class="lineNum"> 166 </span><span class="lineCov"> 6 : final buf = jsGetArrayBuffer(ctx, psize, val);</span></a>
<a name="167"><span class="lineNum"> 167 </span><span class="lineCov"> 3 : final size = psize.value;</span></a>
<a name="168"><span class="lineNum"> 168 </span><span class="lineCov"> 3 : malloc.free(psize);</span></a>
<a name="169"><span class="lineNum"> 169 </span><span class="lineCov"> 6 : if (buf.address != 0) {</span></a>
<a name="170"><span class="lineNum"> 170 </span><span class="lineNoCov"> 0 : return Uint8List.fromList(buf.asTypedList(size));</span></a>
<a name="171"><span class="lineNum"> 171 </span> : }</a>
<a name="172"><span class="lineNum"> 172 </span><span class="lineCov"> 6 : final valptr = jsValueGetPtr(val);</span></a>
<a name="173"><span class="lineNum"> 173 </span><span class="lineCov"> 3 : if (cache.containsKey(valptr)) {</span></a>
<a name="174"><span class="lineNum"> 174 </span><span class="lineCov"> 2 : return cache[valptr];</span></a>
<a name="175"><span class="lineNum"> 175 </span> : }</a>
<a name="176"><span class="lineNum"> 176 </span><span class="lineCov"> 9 : if (jsIsFunction(ctx, val) != 0) {</span></a>
<a name="177"><span class="lineNum"> 177 </span><span class="lineCov"> 3 : return _JSFunction(ctx, val);</span></a>
<a name="178"><span class="lineNum"> 178 </span><span class="lineCov"> 9 : } else if (jsIsError(ctx, val) != 0) {</span></a>
<a name="179"><span class="lineNum"> 179 </span><span class="lineCov"> 2 : final err = jsToCString(ctx, val);</span></a>
<a name="180"><span class="lineNum"> 180 </span><span class="lineCov"> 2 : final pstack = _jsGetPropertyValue(ctx, val, 'stack');</span></a>
<a name="181"><span class="lineNum"> 181 </span> : final stack =</a>
<a name="182"><span class="lineNum"> 182 </span><span class="lineCov"> 8 : jsToBool(ctx, pstack) != 0 ? jsToCString(ctx, pstack) : null;</span></a>
<a name="183"><span class="lineNum"> 183 </span><span class="lineCov"> 2 : jsFreeValue(ctx, pstack);</span></a>
<a name="184"><span class="lineNum"> 184 </span><span class="lineCov"> 2 : return JSError(err, stack);</span></a>
<a name="185"><span class="lineNum"> 185 </span><span class="lineCov"> 9 : } else if (jsIsPromise(ctx, val) != 0) {</span></a>
<a name="186"><span class="lineNum"> 186 </span><span class="lineCov"> 3 : final jsPromiseThen = _jsGetPropertyValue(ctx, val, 'then');</span></a>
<a name="187"><span class="lineNum"> 187 </span> : final _JSFunction promiseThen =</a>
<a name="188"><span class="lineNum"> 188 </span><span class="lineCov"> 3 : _jsToDart(ctx, jsPromiseThen, cache: cache);</span></a>
<a name="189"><span class="lineNum"> 189 </span><span class="lineCov"> 3 : jsFreeValue(ctx, jsPromiseThen);</span></a>
<a name="190"><span class="lineNum"> 190 </span><span class="lineCov"> 3 : final completer = Completer();</span></a>
<a name="191"><span class="lineNum"> 191 </span><span class="lineCov"> 8 : completer.future.catchError((e) {});</span></a>
<a name="192"><span class="lineNum"> 192 </span><span class="lineCov"> 3 : final jsPromise = _JSObject(ctx, val);</span></a>
<a name="193"><span class="lineNum"> 193 </span><span class="lineCov"> 6 : final jsRet = promiseThen._invoke([</span></a>
<a name="194"><span class="lineNum"> 194 </span><span class="lineCov"> 3 : (v) {</span></a>
<a name="195"><span class="lineNum"> 195 </span><span class="lineCov"> 3 : JSRef.dupRecursive(v);</span></a>
<a name="196"><span class="lineNum"> 196 </span><span class="lineCov"> 6 : if (!completer.isCompleted) completer.complete(v);</span></a>
<a name="197"><span class="lineNum"> 197 </span> : },</a>
<a name="198"><span class="lineNum"> 198 </span><span class="lineCov"> 2 : (e) {</span></a>
<a name="199"><span class="lineNum"> 199 </span><span class="lineCov"> 2 : JSRef.dupRecursive(e);</span></a>
<a name="200"><span class="lineNum"> 200 </span><span class="lineCov"> 4 : if (!completer.isCompleted) completer.completeError(e);</span></a>
<a name="201"><span class="lineNum"> 201 </span> : },</a>
<a name="202"><span class="lineNum"> 202 </span> : ], jsPromise);</a>
<a name="203"><span class="lineNum"> 203 </span><span class="lineCov"> 3 : jsPromise.free();</span></a>
<a name="204"><span class="lineNum"> 204 </span><span class="lineCov"> 3 : promiseThen.free();</span></a>
<a name="205"><span class="lineNum"> 205 </span><span class="lineCov"> 9 : final isException = jsIsException(jsRet) != 0;</span></a>
<a name="206"><span class="lineNum"> 206 </span><span class="lineCov"> 3 : jsFreeValue(ctx, jsRet);</span></a>
<a name="207"><span class="lineNum"> 207 </span><span class="lineNoCov"> 0 : if (isException) throw _parseJSException(ctx);</span></a>
<a name="208"><span class="lineNum"> 208 </span><span class="lineCov"> 3 : return completer.future;</span></a>
<a name="209"><span class="lineNum"> 209 </span><span class="lineCov"> 6 : } else if (jsIsArray(ctx, val) != 0) {</span></a>
<a name="210"><span class="lineNum"> 210 </span><span class="lineCov"> 2 : final jslength = _jsGetPropertyValue(ctx, val, 'length');</span></a>
<a name="211"><span class="lineNum"> 211 </span><span class="lineCov"> 4 : final length = jsToInt64(ctx, jslength);</span></a>
<a name="212"><span class="lineNum"> 212 </span><span class="lineCov"> 2 : final ret = [];</span></a>
<a name="213"><span class="lineNum"> 213 </span><span class="lineCov"> 2 : cache[valptr] = ret;</span></a>
<a name="214"><span class="lineNum"> 214 </span><span class="lineCov"> 4 : for (var i = 0; i &lt; length; ++i) {</span></a>
<a name="215"><span class="lineNum"> 215 </span><span class="lineCov"> 2 : final jsProp = _jsGetPropertyValue(ctx, val, i);</span></a>
<a name="216"><span class="lineNum"> 216 </span><span class="lineCov"> 4 : ret.add(_jsToDart(ctx, jsProp, cache: cache));</span></a>
<a name="217"><span class="lineNum"> 217 </span><span class="lineCov"> 2 : jsFreeValue(ctx, jsProp);</span></a>
<a name="218"><span class="lineNum"> 218 </span> : }</a>
<a name="219"><span class="lineNum"> 219 </span> : return ret;</a>
<a name="220"><span class="lineNum"> 220 </span> : } else {</a>
<a name="221"><span class="lineNum"> 221 </span> : final ptab = malloc&lt;Pointer&lt;JSPropertyEnum&gt;&gt;();</a>
<a name="222"><span class="lineNum"> 222 </span> : final plen = malloc&lt;Uint32&gt;();</a>
<a name="223"><span class="lineNum"> 223 </span><span class="lineCov"> 8 : if (jsGetOwnPropertyNames(ctx, ptab, plen, val, -1) != 0) {</span></a>
<a name="224"><span class="lineNum"> 224 </span><span class="lineNoCov"> 0 : malloc.free(plen);</span></a>
<a name="225"><span class="lineNum"> 225 </span><span class="lineNoCov"> 0 : malloc.free(ptab);</span></a>
<a name="226"><span class="lineNum"> 226 </span> : return null;</a>
<a name="227"><span class="lineNum"> 227 </span> : }</a>
<a name="228"><span class="lineNum"> 228 </span><span class="lineCov"> 2 : final len = plen.value;</span></a>
<a name="229"><span class="lineNum"> 229 </span><span class="lineCov"> 2 : malloc.free(plen);</span></a>
<a name="230"><span class="lineNum"> 230 </span><span class="lineCov"> 2 : final ret = Map();</span></a>
<a name="231"><span class="lineNum"> 231 </span><span class="lineCov"> 2 : cache[valptr] = ret;</span></a>
<a name="232"><span class="lineNum"> 232 </span><span class="lineCov"> 4 : for (var i = 0; i &lt; len; ++i) {</span></a>
<a name="233"><span class="lineNum"> 233 </span><span class="lineCov"> 6 : final jsAtom = jsPropertyEnumGetAtom(ptab.value, i);</span></a>
<a name="234"><span class="lineNum"> 234 </span><span class="lineCov"> 4 : final jsAtomValue = jsAtomToValue(ctx, jsAtom);</span></a>
<a name="235"><span class="lineNum"> 235 </span><span class="lineCov"> 4 : final jsProp = jsGetProperty(ctx, val, jsAtom);</span></a>
<a name="236"><span class="lineNum"> 236 </span><span class="lineCov"> 4 : ret[_jsToDart(ctx, jsAtomValue, cache: cache)] =</span></a>
<a name="237"><span class="lineNum"> 237 </span><span class="lineCov"> 2 : _jsToDart(ctx, jsProp, cache: cache);</span></a>
<a name="238"><span class="lineNum"> 238 </span><span class="lineCov"> 2 : jsFreeValue(ctx, jsAtomValue);</span></a>
<a name="239"><span class="lineNum"> 239 </span><span class="lineCov"> 2 : jsFreeValue(ctx, jsProp);</span></a>
<a name="240"><span class="lineNum"> 240 </span><span class="lineCov"> 4 : jsFreeAtom(ctx, jsAtom);</span></a>
<a name="241"><span class="lineNum"> 241 </span> : }</a>
<a name="242"><span class="lineNum"> 242 </span><span class="lineCov"> 6 : jsFree(ctx, ptab.value);</span></a>
<a name="243"><span class="lineNum"> 243 </span><span class="lineCov"> 2 : malloc.free(ptab);</span></a>
<a name="244"><span class="lineNum"> 244 </span> : return ret;</a>
<a name="245"><span class="lineNum"> 245 </span> : }</a>
<a name="246"><span class="lineNum"> 246 </span> : default:</a>
<a name="247"><span class="lineNum"> 247 </span> : }</a>
<a name="248"><span class="lineNum"> 248 </span> : return null;</a>
<a name="249"><span class="lineNum"> 249 </span> : }</a>
</pre>
</td>
</tr>
</table>
<br>
<table width="100%" border=0 cellspacing=0 cellpadding=0>
<tr><td class="ruler"><img src="../glass.png" width=3 height=3 alt=""></td></tr>
<tr><td class="versionInfo">Generated by: <a href="http://ltp.sourceforge.net/coverage/lcov.php" target="_parent">LCOV version 1.14</a></td></tr>
</table>
<br>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 B

View File

@@ -8,10 +8,13 @@ sed 's/\#include \"quickjs\/quickjs.h\"/\#include \"quickjs.h\"/g' ../cxx/ffi.h
cp ../cxx/ffi.cpp ./cxx/ffi.cpp cp ../cxx/ffi.cpp ./cxx/ffi.cpp
cp ../cxx/quickjs/*.h ./cxx/ cp ../cxx/quickjs/*.h ./cxx/
cp ../cxx/quickjs/*.c ./cxx/ cp ../cxx/quickjs/cutils.c ./cxx/
cp ../cxx/quickjs/libregexp.c ./cxx/
cp ../cxx/quickjs/libunicode.c ./cxx/
quickjs_version=$(cat ../cxx/quickjs/VERSION) quickjs_version=$(cat ../cxx/quickjs/VERSION)
sed '1i\ sed '1i\
\#define CONFIG_VERSION \"'$quickjs_version'\"\ \#define CONFIG_VERSION \"'$quickjs_version'\"\
\#define DUMP_LEAKS 1\
' ../cxx/quickjs/quickjs.c > ./cxx/quickjs.c ' ../cxx/quickjs/quickjs.c > ./cxx/quickjs.c

View File

@@ -0,0 +1,29 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

View File

@@ -9,3 +9,5 @@ GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore. # Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties key.properties
**/*.keystore
**/*.jks

View File

@@ -26,21 +26,27 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android { android {
compileSdkVersion 29 compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets { sourceSets {
main.java.srcDirs += 'src/main/kotlin' main.java.srcDirs += 'src/main/kotlin'
} }
lintOptions {
disable 'InvalidPackage'
}
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "soko.ekibun.flutter_qjs_example" applicationId "soko.ekibun.flutter_qjs_example"
minSdkVersion 16 minSdkVersion flutter.minSdkVersion
targetSdkVersion 29 targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger() versionCode flutterVersionCode.toInteger()
versionName flutterVersionName versionName flutterVersionName
} }

View File

@@ -1,6 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="soko.ekibun.flutter_qjs_example"> package="soko.ekibun.flutter_qjs_example">
<!-- Flutter needs it to communicate with the running application <!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc. to allow setting breakpoints, to provide hot reload, etc.
--> -->
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>

View File

@@ -2,9 +2,11 @@
package="soko.ekibun.flutter_qjs_example"> package="soko.ekibun.flutter_qjs_example">
<application <application
android:label="flutter_qjs_example" android:label="flutter_qjs_example"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop" android:launchMode="singleTop"
android:theme="@style/LaunchTheme" android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
@@ -18,15 +20,6 @@
android:name="io.flutter.embedding.android.NormalTheme" android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" android:resource="@style/NormalTheme"
/> />
<!-- Displays an Android View that continues showing the launch screen
Drawable until Flutter paints its first frame, then this splash
screen fades out. A splash screen is useful to avoid any visual
gap between the end of Android's launch screen and the painting of
Flutter's first frame. -->
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background"
/>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen --> <!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" /> <item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here --> <!-- You can insert your own image assets here -->
<!-- <item> <!-- <item>

View File

@@ -3,14 +3,14 @@
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on --> <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar"> <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when <!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame --> the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item> <item name="android:windowBackground">@drawable/launch_background</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its Flutter UI initializes, as well as behind your Flutter UI while its
running. running.
This Theme is only used starting with V2 of Flutter's Android embedding. --> This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar"> <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item> <item name="android:windowBackground">?android:colorBackground</item>

View File

@@ -3,14 +3,14 @@
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off --> <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar"> <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when <!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame --> the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item> <item name="android:windowBackground">@drawable/launch_background</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its Flutter UI initializes, as well as behind your Flutter UI while its
running. running.
This Theme is only used starting with V2 of Flutter's Android embedding. --> This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar"> <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item> <item name="android:windowBackground">?android:colorBackground</item>

View File

@@ -1,6 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="soko.ekibun.flutter_qjs_example"> package="soko.ekibun.flutter_qjs_example">
<!-- Flutter needs it to communicate with the running application <!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc. to allow setting breakpoints, to provide hot reload, etc.
--> -->
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.INTERNET"/>

View File

@@ -1,12 +1,12 @@
buildscript { buildscript {
ext.kotlin_version = '1.3.50' ext.kotlin_version = '1.6.10'
repositories { repositories {
google() google()
jcenter() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.5.0' classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }
@@ -14,7 +14,7 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
google() google()
jcenter() mavenCentral()
} }
} }

View File

@@ -1,4 +1,3 @@
org.gradle.jvmargs=-Xmx1536M org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
android.enableR8=true

View File

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip

View File

@@ -75,7 +75,7 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "0.3.6" version: "0.3.7"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@@ -95,6 +95,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.11" version: "0.12.11"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.4"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@@ -108,7 +115,7 @@ packages:
name: path name: path
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.1"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@@ -120,7 +127,7 @@ packages:
name: source_span name: source_span
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.1" version: "1.8.2"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@@ -155,7 +162,7 @@ packages:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.3" version: "0.4.9"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
@@ -169,7 +176,7 @@ packages:
name: vector_math name: vector_math
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.1" version: "2.1.2"
sdks: sdks:
dart: ">=2.14.0 <3.0.0" dart: ">=2.14.0 <3.0.0"
flutter: ">=1.20.0" flutter: ">=1.20.0"

View File

@@ -1,13 +1,16 @@
cmake_minimum_required(VERSION 3.15) # Project-level configuration.
cmake_minimum_required(VERSION 3.14)
project(example LANGUAGES CXX) project(example LANGUAGES CXX)
# The name of the executable created for the application. Change this to change
# the on-disk name of your application.
set(BINARY_NAME "example") set(BINARY_NAME "example")
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
# versions of CMake.
cmake_policy(SET CMP0063 NEW) cmake_policy(SET CMP0063 NEW)
set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") # Define build configuration option.
# Configure build options.
get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(IS_MULTICONFIG) if(IS_MULTICONFIG)
set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release"
@@ -20,7 +23,7 @@ else()
"Debug" "Profile" "Release") "Debug" "Profile" "Release")
endif() endif()
endif() endif()
# Define settings for the Profile build mode.
set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
@@ -30,6 +33,10 @@ set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
add_definitions(-DUNICODE -D_UNICODE) add_definitions(-DUNICODE -D_UNICODE)
# Compilation settings that should be applied to most targets. # Compilation settings that should be applied to most targets.
#
# Be cautious about adding new options here, as plugins use this function by
# default. In most cases, you should add new options to specific targets instead
# of modifying this function.
function(APPLY_STANDARD_SETTINGS TARGET) function(APPLY_STANDARD_SETTINGS TARGET)
target_compile_features(${TARGET} PUBLIC cxx_std_17) target_compile_features(${TARGET} PUBLIC cxx_std_17)
target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
@@ -38,12 +45,11 @@ function(APPLY_STANDARD_SETTINGS TARGET)
target_compile_definitions(${TARGET} PRIVATE "$<$<CONFIG:Debug>:_DEBUG>") target_compile_definitions(${TARGET} PRIVATE "$<$<CONFIG:Debug>:_DEBUG>")
endfunction() endfunction()
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
# Flutter library and tool build rules. # Flutter library and tool build rules.
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
add_subdirectory(${FLUTTER_MANAGED_DIR}) add_subdirectory(${FLUTTER_MANAGED_DIR})
# Application build # Application build; see runner/CMakeLists.txt.
add_subdirectory("runner") add_subdirectory("runner")
# Generated plugin build rules, which manage building the plugins and adding # Generated plugin build rules, which manage building the plugins and adding

View File

@@ -1,4 +1,5 @@
cmake_minimum_required(VERSION 3.15) # This file controls Flutter-level build steps. It should not be edited.
cmake_minimum_required(VERSION 3.14)
set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
@@ -23,6 +24,7 @@ list(APPEND FLUTTER_LIBRARY_HEADERS
"flutter_windows.h" "flutter_windows.h"
"flutter_messenger.h" "flutter_messenger.h"
"flutter_plugin_registrar.h" "flutter_plugin_registrar.h"
"flutter_texture_registrar.h"
) )
list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/")
add_library(flutter INTERFACE) add_library(flutter INTERFACE)

View File

@@ -6,6 +6,9 @@ list(APPEND FLUTTER_PLUGIN_LIST
flutter_qjs flutter_qjs
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST
)
set(PLUGIN_BUNDLED_LIBRARIES) set(PLUGIN_BUNDLED_LIBRARIES)
foreach(plugin ${FLUTTER_PLUGIN_LIST}) foreach(plugin ${FLUTTER_PLUGIN_LIST})
@@ -14,3 +17,8 @@ foreach(plugin ${FLUTTER_PLUGIN_LIST})
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>) list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
endforeach(plugin) endforeach(plugin)
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
endforeach(ffi_plugin)

View File

@@ -1,18 +1,32 @@
cmake_minimum_required(VERSION 3.15) cmake_minimum_required(VERSION 3.14)
project(runner LANGUAGES CXX) project(runner LANGUAGES CXX)
# Define the application target. To change its name, change BINARY_NAME in the
# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer
# work.
#
# Any new source files that you add to the application should be added here.
add_executable(${BINARY_NAME} WIN32 add_executable(${BINARY_NAME} WIN32
"flutter_window.cpp" "flutter_window.cpp"
"main.cpp" "main.cpp"
"run_loop.cpp"
"utils.cpp" "utils.cpp"
"win32_window.cpp" "win32_window.cpp"
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
"Runner.rc" "Runner.rc"
"runner.exe.manifest" "runner.exe.manifest"
) )
# Apply the standard set of build settings. This can be removed for applications
# that need different build settings.
apply_standard_settings(${BINARY_NAME}) apply_standard_settings(${BINARY_NAME})
# Disable Windows macros that collide with C++ standard library functions.
target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
# Add dependency libraries and include directories. Add any application-specific
# dependencies here.
target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
# Run the Flutter tool portions of the build. This must not be removed.
add_dependencies(${BINARY_NAME} flutter_assemble) add_dependencies(${BINARY_NAME} flutter_assemble)

View File

@@ -89,11 +89,11 @@ BEGIN
BEGIN BEGIN
BLOCK "040904e4" BLOCK "040904e4"
BEGIN BEGIN
VALUE "CompanyName", "soko.ekibun" "\0" VALUE "CompanyName", "com.example" "\0"
VALUE "FileDescription", "A new Flutter project." "\0" VALUE "FileDescription", "example" "\0"
VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "FileVersion", VERSION_AS_STRING "\0"
VALUE "InternalName", "example" "\0" VALUE "InternalName", "example" "\0"
VALUE "LegalCopyright", "Copyright (C) 2020 soko.ekibun. All rights reserved." "\0" VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0"
VALUE "OriginalFilename", "example.exe" "\0" VALUE "OriginalFilename", "example.exe" "\0"
VALUE "ProductName", "example" "\0" VALUE "ProductName", "example" "\0"
VALUE "ProductVersion", VERSION_AS_STRING "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0"

View File

@@ -4,9 +4,8 @@
#include "flutter/generated_plugin_registrant.h" #include "flutter/generated_plugin_registrant.h"
FlutterWindow::FlutterWindow(RunLoop* run_loop, FlutterWindow::FlutterWindow(const flutter::DartProject& project)
const flutter::DartProject& project) : project_(project) {}
: run_loop_(run_loop), project_(project) {}
FlutterWindow::~FlutterWindow() {} FlutterWindow::~FlutterWindow() {}
@@ -26,14 +25,12 @@ bool FlutterWindow::OnCreate() {
return false; return false;
} }
RegisterPlugins(flutter_controller_->engine()); RegisterPlugins(flutter_controller_->engine());
run_loop_->RegisterFlutterInstance(flutter_controller_->engine());
SetChildContent(flutter_controller_->view()->GetNativeWindow()); SetChildContent(flutter_controller_->view()->GetNativeWindow());
return true; return true;
} }
void FlutterWindow::OnDestroy() { void FlutterWindow::OnDestroy() {
if (flutter_controller_) { if (flutter_controller_) {
run_loop_->UnregisterFlutterInstance(flutter_controller_->engine());
flutter_controller_ = nullptr; flutter_controller_ = nullptr;
} }
@@ -44,7 +41,7 @@ LRESULT
FlutterWindow::MessageHandler(HWND hwnd, UINT const message, FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
WPARAM const wparam, WPARAM const wparam,
LPARAM const lparam) noexcept { LPARAM const lparam) noexcept {
// Give Flutter, including plugins, an opporutunity to handle window messages. // Give Flutter, including plugins, an opportunity to handle window messages.
if (flutter_controller_) { if (flutter_controller_) {
std::optional<LRESULT> result = std::optional<LRESULT> result =
flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,

View File

@@ -6,16 +6,13 @@
#include <memory> #include <memory>
#include "run_loop.h"
#include "win32_window.h" #include "win32_window.h"
// A window that does nothing but host a Flutter view. // A window that does nothing but host a Flutter view.
class FlutterWindow : public Win32Window { class FlutterWindow : public Win32Window {
public: public:
// Creates a new FlutterWindow driven by the |run_loop|, hosting a // Creates a new FlutterWindow hosting a Flutter view running |project|.
// Flutter view running |project|. explicit FlutterWindow(const flutter::DartProject& project);
explicit FlutterWindow(RunLoop* run_loop,
const flutter::DartProject& project);
virtual ~FlutterWindow(); virtual ~FlutterWindow();
protected: protected:
@@ -26,9 +23,6 @@ class FlutterWindow : public Win32Window {
LPARAM const lparam) noexcept override; LPARAM const lparam) noexcept override;
private: private:
// The run loop driving events for this window.
RunLoop* run_loop_;
// The project to run. // The project to run.
flutter::DartProject project_; flutter::DartProject project_;

View File

@@ -3,7 +3,6 @@
#include <windows.h> #include <windows.h>
#include "flutter_window.h" #include "flutter_window.h"
#include "run_loop.h"
#include "utils.h" #include "utils.h"
int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
@@ -18,10 +17,14 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
// plugins. // plugins.
::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
RunLoop run_loop;
flutter::DartProject project(L"data"); flutter::DartProject project(L"data");
FlutterWindow window(&run_loop, project);
std::vector<std::string> command_line_arguments =
GetCommandLineArguments();
project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
FlutterWindow window(project);
Win32Window::Point origin(10, 10); Win32Window::Point origin(10, 10);
Win32Window::Size size(1280, 720); Win32Window::Size size(1280, 720);
if (!window.CreateAndShow(L"example", origin, size)) { if (!window.CreateAndShow(L"example", origin, size)) {
@@ -29,7 +32,11 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
} }
window.SetQuitOnClose(true); window.SetQuitOnClose(true);
run_loop.Run(); ::MSG msg;
while (::GetMessage(&msg, nullptr, 0, 0)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
::CoUninitialize(); ::CoUninitialize();
return EXIT_SUCCESS; return EXIT_SUCCESS;

View File

@@ -1,66 +0,0 @@
#include "run_loop.h"
#include <windows.h>
#include <algorithm>
RunLoop::RunLoop() {}
RunLoop::~RunLoop() {}
void RunLoop::Run() {
bool keep_running = true;
TimePoint next_flutter_event_time = TimePoint::clock::now();
while (keep_running) {
std::chrono::nanoseconds wait_duration =
std::max(std::chrono::nanoseconds(0),
next_flutter_event_time - TimePoint::clock::now());
::MsgWaitForMultipleObjects(
0, nullptr, FALSE, static_cast<DWORD>(wait_duration.count() / 1000),
QS_ALLINPUT);
bool processed_events = false;
MSG message;
// All pending Windows messages must be processed; MsgWaitForMultipleObjects
// won't return again for items left in the queue after PeekMessage.
while (::PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) {
processed_events = true;
if (message.message == WM_QUIT) {
keep_running = false;
break;
}
::TranslateMessage(&message);
::DispatchMessage(&message);
// Allow Flutter to process messages each time a Windows message is
// processed, to prevent starvation.
next_flutter_event_time =
std::min(next_flutter_event_time, ProcessFlutterMessages());
}
// If the PeekMessage loop didn't run, process Flutter messages.
if (!processed_events) {
next_flutter_event_time =
std::min(next_flutter_event_time, ProcessFlutterMessages());
}
}
}
void RunLoop::RegisterFlutterInstance(
flutter::FlutterEngine* flutter_instance) {
flutter_instances_.insert(flutter_instance);
}
void RunLoop::UnregisterFlutterInstance(
flutter::FlutterEngine* flutter_instance) {
flutter_instances_.erase(flutter_instance);
}
RunLoop::TimePoint RunLoop::ProcessFlutterMessages() {
TimePoint next_event_time = TimePoint::max();
for (auto instance : flutter_instances_) {
std::chrono::nanoseconds wait_duration = instance->ProcessMessages();
if (wait_duration != std::chrono::nanoseconds::max()) {
next_event_time =
std::min(next_event_time, TimePoint::clock::now() + wait_duration);
}
}
return next_event_time;
}

View File

@@ -1,40 +0,0 @@
#ifndef RUNNER_RUN_LOOP_H_
#define RUNNER_RUN_LOOP_H_
#include <flutter/flutter_engine.h>
#include <chrono>
#include <set>
// A runloop that will service events for Flutter instances as well
// as native messages.
class RunLoop {
public:
RunLoop();
~RunLoop();
// Prevent copying
RunLoop(RunLoop const&) = delete;
RunLoop& operator=(RunLoop const&) = delete;
// Runs the run loop until the application quits.
void Run();
// Registers the given Flutter instance for event servicing.
void RegisterFlutterInstance(
flutter::FlutterEngine* flutter_instance);
// Unregisters the given Flutter instance from event servicing.
void UnregisterFlutterInstance(
flutter::FlutterEngine* flutter_instance);
private:
using TimePoint = std::chrono::steady_clock::time_point;
// Processes all currently pending messages for registered Flutter instances.
TimePoint ProcessFlutterMessages();
std::set<flutter::FlutterEngine*> flutter_instances_;
};
#endif // RUNNER_RUN_LOOP_H_

View File

@@ -20,3 +20,45 @@ void CreateAndAttachConsole() {
FlutterDesktopResyncOutputStreams(); FlutterDesktopResyncOutputStreams();
} }
} }
std::vector<std::string> GetCommandLineArguments() {
// Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.
int argc;
wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
if (argv == nullptr) {
return std::vector<std::string>();
}
std::vector<std::string> command_line_arguments;
// Skip the first argument as it's the binary name.
for (int i = 1; i < argc; i++) {
command_line_arguments.push_back(Utf8FromUtf16(argv[i]));
}
::LocalFree(argv);
return command_line_arguments;
}
std::string Utf8FromUtf16(const wchar_t* utf16_string) {
if (utf16_string == nullptr) {
return std::string();
}
int target_length = ::WideCharToMultiByte(
CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
-1, nullptr, 0, nullptr, nullptr);
if (target_length == 0) {
return std::string();
}
std::string utf8_string;
utf8_string.resize(target_length);
int converted_length = ::WideCharToMultiByte(
CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
-1, utf8_string.data(),
target_length, nullptr, nullptr);
if (converted_length == 0) {
return std::string();
}
return utf8_string;
}

View File

@@ -1,8 +1,19 @@
#ifndef RUNNER_UTILS_H_ #ifndef RUNNER_UTILS_H_
#define RUNNER_UTILS_H_ #define RUNNER_UTILS_H_
#include <string>
#include <vector>
// Creates a console for the process, and redirects stdout and stderr to // Creates a console for the process, and redirects stdout and stderr to
// it for both the runner and the Flutter library. // it for both the runner and the Flutter library.
void CreateAndAttachConsole(); void CreateAndAttachConsole();
// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string
// encoded in UTF-8. Returns an empty std::string on failure.
std::string Utf8FromUtf16(const wchar_t* utf16_string);
// Gets the command line arguments passed in as a std::vector<std::string>,
// encoded in UTF-8. Returns an empty std::vector<std::string> on failure.
std::vector<std::string> GetCommandLineArguments();
#endif // RUNNER_UTILS_H_ #endif // RUNNER_UTILS_H_

View File

@@ -173,7 +173,7 @@ Win32Window::MessageHandler(HWND hwnd,
return 0; return 0;
} }
case WM_SIZE: case WM_SIZE: {
RECT rect = GetClientArea(); RECT rect = GetClientArea();
if (child_content_ != nullptr) { if (child_content_ != nullptr) {
// Size and position the child window. // Size and position the child window.
@@ -181,6 +181,7 @@ Win32Window::MessageHandler(HWND hwnd,
rect.bottom - rect.top, TRUE); rect.bottom - rect.top, TRUE);
} }
return 0; return 0;
}
case WM_ACTIVATE: case WM_ACTIVATE:
if (child_content_ != nullptr) { if (child_content_ != nullptr) {

View File

@@ -20,6 +20,8 @@ abstract class _IsolateEncodable {
dynamic _encodeData(dynamic data, {Map<dynamic, dynamic>? cache}) { dynamic _encodeData(dynamic data, {Map<dynamic, dynamic>? cache}) {
if (cache == null) cache = Map(); if (cache == null) cache = Map();
if (cache.containsKey(data)) return cache[data]; if (cache.containsKey(data)) return cache[data];
if (data is Error || data is Exception)
return _encodeData(JSError(data), cache: cache);
if (data is _IsolateEncodable) return data._encode(); if (data is _IsolateEncodable) return data._encode();
if (data is List) { if (data is List) {
final ret = []; final ret = [];

View File

@@ -1,6 +1,34 @@
# Generated by pub # Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile # See https://dart.dev/tools/pub/glossary#lockfile
packages: packages:
_fe_analyzer_shared:
dependency: transitive
description:
name: _fe_analyzer_shared
url: "https://pub.dartlang.org"
source: hosted
version: "34.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
url: "https://pub.dartlang.org"
source: hosted
version: "3.2.0"
archive:
dependency: transitive
description:
name: archive
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.11"
args:
dependency: transitive
description:
name: args
url: "https://pub.dartlang.org"
source: hosted
version: "2.3.0"
async: async:
dependency: transitive dependency: transitive
description: description:
@@ -15,6 +43,27 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
browser_launcher:
dependency: transitive
description:
name: browser_launcher
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
built_collection:
dependency: transitive
description:
name: built_collection
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.1"
built_value:
dependency: transitive
description:
name: built_value
url: "https://pub.dartlang.org"
source: hosted
version: "8.1.4"
characters: characters:
dependency: transitive dependency: transitive
description: description:
@@ -29,6 +78,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.1" version: "1.3.1"
cli_util:
dependency: transitive
description:
name: cli_util
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.5"
clock: clock:
dependency: transitive dependency: transitive
description: description:
@@ -43,6 +99,69 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.15.0" version: "1.15.0"
completion:
dependency: transitive
description:
name: completion
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
convert:
dependency: transitive
description:
name: convert
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
coverage:
dependency: transitive
description:
name: coverage
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
crypto:
dependency: transitive
description:
name: crypto
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
csslib:
dependency: transitive
description:
name: csslib
url: "https://pub.dartlang.org"
source: hosted
version: "0.17.1"
dds:
dependency: transitive
description:
name: dds
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
dds_service_extensions:
dependency: transitive
description:
name: dds_service_extensions
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
devtools_shared:
dependency: transitive
description:
name: devtools_shared
url: "https://pub.dartlang.org"
source: hosted
version: "2.11.1"
dwds:
dependency: transitive
description:
name: dwds
url: "https://pub.dartlang.org"
source: hosted
version: "12.1.0"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@@ -57,16 +176,112 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.2" version: "1.1.2"
file:
dependency: transitive
description:
name: file
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.2"
fixnum:
dependency: transitive
description:
name: fixnum
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_template_images:
dependency: transitive
description:
name: flutter_template_images
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_tools:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
frontend_server_client:
dependency: transitive
description:
name: frontend_server_client
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.2"
glob:
dependency: transitive
description:
name: glob
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
html:
dependency: transitive
description:
name: html
url: "https://pub.dartlang.org"
source: hosted
version: "0.15.0"
http:
dependency: transitive
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.4"
http_multi_server:
dependency: transitive
description:
name: http_multi_server
url: "https://pub.dartlang.org"
source: hosted
version: "3.2.0"
http_parser:
dependency: transitive
description:
name: http_parser
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
intl:
dependency: transitive
description:
name: intl
url: "https://pub.dartlang.org"
source: hosted
version: "0.17.0"
io:
dependency: transitive
description:
name: io
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.3"
json_rpc_2:
dependency: transitive
description:
name: json_rpc_2
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
logging:
dependency: transitive
description:
name: logging
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@@ -74,6 +289,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.11" version: "0.12.11"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.4"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@@ -81,25 +303,158 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.7.0" version: "1.7.0"
mime:
dependency: transitive
description:
name: mime
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
multicast_dns:
dependency: transitive
description:
name: multicast_dns
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.2"
mustache_template:
dependency: transitive
description:
name: mustache_template
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
native_stack_traces:
dependency: transitive
description:
name: native_stack_traces
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.5"
package_config:
dependency: transitive
description:
name: package_config
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.1"
pedantic:
dependency: transitive
description:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.11.1"
petitparser:
dependency: transitive
description:
name: petitparser
url: "https://pub.dartlang.org"
source: hosted
version: "4.4.0"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
pool:
dependency: transitive
description:
name: pool
url: "https://pub.dartlang.org"
source: hosted
version: "1.5.0"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "4.2.4"
pub_semver:
dependency: transitive
description:
name: pub_semver
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
shelf:
dependency: transitive
description:
name: shelf
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.4"
shelf_packages_handler:
dependency: transitive
description:
name: shelf_packages_handler
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
shelf_proxy:
dependency: transitive
description:
name: shelf_proxy
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
shelf_static:
dependency: transitive
description:
name: shelf_static
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
shelf_web_socket:
dependency: transitive
description:
name: shelf_web_socket
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.99" version: "0.0.99"
source_map_stack_trace:
dependency: transitive
description:
name: source_map_stack_trace
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
source_maps:
dependency: transitive
description:
name: source_maps
url: "https://pub.dartlang.org"
source: hosted
version: "0.10.10"
source_span: source_span:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.1" version: "1.8.2"
sse:
dependency: transitive
description:
name: sse
url: "https://pub.dartlang.org"
source: hosted
version: "4.1.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@@ -121,6 +476,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
sync_http:
dependency: transitive
description:
name: sync_http
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
@@ -134,7 +496,14 @@ packages:
name: test_api name: test_api
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.3" version: "0.4.9"
test_core:
dependency: transitive
description:
name: test_core
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.11"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
@@ -142,13 +511,83 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
usage:
dependency: transitive
description:
name: usage
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.2"
uuid:
dependency: transitive
description:
name: uuid
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.6"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.2"
vm_service:
dependency: transitive
description:
name: vm_service
url: "https://pub.dartlang.org"
source: hosted
version: "8.2.0"
vm_snapshot_analysis:
dependency: transitive
description:
name: vm_snapshot_analysis
url: "https://pub.dartlang.org"
source: hosted
version: "0.7.1"
watcher:
dependency: transitive
description:
name: watcher
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
web_socket_channel:
dependency: transitive
description:
name: web_socket_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0" version: "2.1.0"
webdriver:
dependency: transitive
description:
name: webdriver
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
webkit_inspection_protocol:
dependency: transitive
description:
name: webkit_inspection_protocol
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
xml:
dependency: transitive
description:
name: xml
url: "https://pub.dartlang.org"
source: hosted
version: "5.3.1"
yaml:
dependency: transitive
description:
name: yaml
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
sdks: sdks:
dart: ">=2.12.0 <3.0.0" dart: ">=2.16.0 <3.0.0"
flutter: ">=1.20.0" flutter: ">=1.20.0"

View File

@@ -1,6 +1,6 @@
name: flutter_qjs name: flutter_qjs
description: This plugin is a simple js engine for flutter using the `quickjs` project. Plugin currently supports all the platforms except web! description: This plugin is a simple js engine for flutter using the `quickjs` project. Plugin currently supports all the platforms except web!
version: 0.3.6 version: 0.3.7
homepage: https://github.com/ekibun/flutter_qjs homepage: https://github.com/ekibun/flutter_qjs
environment: environment:
@@ -15,6 +15,8 @@ dependencies:
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter
flutter_tools:
sdk: flutter
# For information on the generic Dart part of this file, see the # For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec # following page: https://dart.dev/tools/pub/pubspec

View File

@@ -11,17 +11,25 @@ import 'dart:io';
import 'package:flutter_qjs/flutter_qjs.dart'; import 'package:flutter_qjs/flutter_qjs.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/terminal.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/windows/visual_studio.dart';
import 'package:file/local.dart';
import 'package:process/process.dart';
dynamic myFunction(String args, {thisVal}) { dynamic myFunction(String args, {thisVal}) {
return [thisVal, args]; return [thisVal, args];
} }
Future testEvaluate(qjs) async { Future testEvaluate(qjs) async {
JSInvokable wrapFunction = await qjs.evaluate( dynamic wrapFunction = await qjs.evaluate(
'async (a) => a', 'async (a) => a',
name: '<testWrap>', name: '<testWrap>',
); );
dynamic testWrap = await wrapFunction.invoke([wrapFunction]); dynamic testWrap = await wrapFunction.invoke([wrapFunction]);
await wrapFunction.free();
final wrapNull = await testWrap.invoke([null]); final wrapNull = await testWrap.invoke([null]);
expect(wrapNull, null, reason: 'wrap null'); expect(wrapNull, null, reason: 'wrap null');
final primities = [0, 1, 0.1, true, false, 'str']; final primities = [0, 1, 0.1, true, false, 'str'];
@@ -39,7 +47,7 @@ Future testEvaluate(qjs) async {
a['a'] = a; a['a'] = a;
final wrapA = await testWrap.invoke([a]); final wrapA = await testWrap.invoke([a]);
expect(wrapA['a'], wrapA, reason: 'recursive object'); expect(wrapA['a'], wrapA, reason: 'recursive object');
JSInvokable testThis = await qjs.evaluate( dynamic testThis = await qjs.evaluate(
'(function (func, arg) { return func.call(this, arg) })', '(function (func, arg) { return func.call(this, arg) })',
name: '<testThis>', name: '<testThis>',
); );
@@ -53,6 +61,7 @@ Future testEvaluate(qjs) async {
name: '<promises>', name: '<promises>',
) )
]); ]);
await testWrap.free();
for (final promise in promises) for (final promise in promises)
expect(promise, isInstanceOf<Future>(), reason: 'promise object'); expect(promise, isInstanceOf<Future>(), reason: 'promise object');
try { try {
@@ -62,21 +71,32 @@ Future testEvaluate(qjs) async {
expect(e, 'reject', reason: 'promise object reject'); expect(e, 'reject', reason: 'promise object reject');
} }
expect(await promises[1], 'resolve', reason: 'promise object resolve'); expect(await promises[1], 'resolve', reason: 'promise object resolve');
testWrap.free();
wrapFunction.free();
} }
void main() async { void main() async {
test('make', () async { test('make', () async {
const platform = LocalPlatform();
final utf8Encoding = Encoding.getByName('utf-8'); final utf8Encoding = Encoding.getByName('utf-8');
var cmakePath = 'cmake'; String cmakePath = 'cmake';
if (Platform.isWindows) { if (platform.isWindows) {
var vsDir = Directory('C:/Program Files (x86)/Microsoft Visual Studio/'); final stdio = Stdio();
vsDir = (vsDir.listSync().firstWhere((e) => e is Directory) as Directory) final vs = VisualStudio(
.listSync() fileSystem: const LocalFileSystem(),
.last as Directory; processManager: const LocalProcessManager(),
cmakePath = vsDir.path + platform: platform,
'/Common7/IDE/CommonExtensions/Microsoft/CMake/CMake/bin/cmake.exe'; logger: StdoutLogger(
terminal: AnsiTerminal(
stdio: stdio,
platform: platform,
),
stdio: stdio,
outputPreferences: OutputPreferences(
wrapText: stdio.hasTerminal,
showColor: platform.stdoutSupportsAnsi,
stdio: stdio,
),
));
cmakePath = vs.cmakePath!;
} }
final buildDir = './build'; final buildDir = './build';
var result = Process.runSync( var result = Process.runSync(
@@ -102,13 +122,12 @@ void main() async {
expect(result.exitCode, 0); expect(result.exitCode, 0);
}); });
test('module', () async { test('module', () async {
final qjs = FlutterQjs( final qjs = IsolateQjs(
moduleHandler: (name) { moduleHandler: (name) async {
return 'export default "test module"'; return 'export default "test module"';
}, },
); );
qjs.dispatch(); await qjs.evaluate('''
qjs.evaluate('''
import handlerData from 'test'; import handlerData from 'test';
export default { export default {
data: handlerData data: handlerData
@@ -116,7 +135,7 @@ void main() async {
''', name: 'evalModule', evalFlags: JSEvalFlag.MODULE); ''', name: 'evalModule', evalFlags: JSEvalFlag.MODULE);
var result = await qjs.evaluate('import("evalModule")'); var result = await qjs.evaluate('import("evalModule")');
expect(result['default']['data'], 'test module', reason: 'eval module'); expect(result['default']['data'], 'test module', reason: 'eval module');
qjs.close(); await qjs.close();
}); });
test('data conversion', () async { test('data conversion', () async {
final qjs = FlutterQjs( final qjs = FlutterQjs(
@@ -124,7 +143,7 @@ void main() async {
); );
qjs.dispatch(); qjs.dispatch();
await testEvaluate(qjs); await testEvaluate(qjs);
qjs.close(); await qjs.close();
}); });
test('isolate conversion', () async { test('isolate conversion', () async {
final qjs = IsolateQjs( final qjs = IsolateQjs(