Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
YottaChain
YTBP
提交
02212951
Y
YTBP
项目概览
YottaChain
/
YTBP
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Y
YTBP
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
02212951
编写于
1月 15, 2018
作者:
W
wanderingbort
提交者:
GitHub
1月 15, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #1083 from EOSIO/reset-wasm-globals
Reset WASM globals on each invocation
上级
433af74d
f3d03a64
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
61 addition
and
1 deletion
+61
-1
libraries/chain/wasm_interface.cpp
libraries/chain/wasm_interface.cpp
+1
-0
libraries/wasm-jit/Include/Runtime/Runtime.h
libraries/wasm-jit/Include/Runtime/Runtime.h
+1
-0
libraries/wasm-jit/Source/Runtime/ModuleInstance.cpp
libraries/wasm-jit/Source/Runtime/ModuleInstance.cpp
+5
-0
libraries/wasm-jit/Source/Runtime/RuntimePrivate.h
libraries/wasm-jit/Source/Runtime/RuntimePrivate.h
+2
-1
tests/wasm_tests/test_wasts.hpp
tests/wasm_tests/test_wasts.hpp
+26
-0
tests/wasm_tests/wasm_tests.cpp
tests/wasm_tests/wasm_tests.cpp
+26
-0
未找到文件。
libraries/chain/wasm_interface.cpp
浏览文件 @
02212951
...
...
@@ -308,6 +308,7 @@ namespace eosio { namespace chain {
memset
(
memstart
+
info
.
mem_end
,
0
,
((
1
<<
16
)
-
info
.
mem_end
)
);
memcpy
(
memstart
,
info
.
mem_image
.
data
(),
info
.
mem_end
);
}
resetGlobalInstances
(
entry
.
instance
);
// under a lock, put this entry back in the available instances side of the instances vector
with_lock
([
&
,
this
](){
...
...
libraries/wasm-jit/Include/Runtime/Runtime.h
浏览文件 @
02212951
...
...
@@ -216,6 +216,7 @@ namespace Runtime
RUNTIME_API
TableInstance
*
getDefaultTable
(
ModuleInstance
*
moduleInstance
);
RUNTIME_API
void
runInstanceStartFunc
(
ModuleInstance
*
moduleInstance
);
RUNTIME_API
void
resetGlobalInstances
(
ModuleInstance
*
moduleInstance
);
// Gets an object exported by a ModuleInstance by name.
RUNTIME_API
ObjectInstance
*
getInstanceExport
(
ModuleInstance
*
moduleInstance
,
const
std
::
string
&
name
);
...
...
libraries/wasm-jit/Source/Runtime/ModuleInstance.cpp
浏览文件 @
02212951
...
...
@@ -204,6 +204,11 @@ namespace Runtime
if
(
moduleInstance
->
startFunctionIndex
!=
UINTPTR_MAX
)
invokeFunction
(
moduleInstance
->
functions
[
moduleInstance
->
startFunctionIndex
],{});
}
void
resetGlobalInstances
(
ModuleInstance
*
moduleInstance
)
{
for
(
GlobalInstance
*&
gi
:
moduleInstance
->
globals
)
memcpy
(
&
gi
->
value
,
&
gi
->
initialValue
,
sizeof
(
gi
->
value
));
}
ObjectInstance
*
getInstanceExport
(
ModuleInstance
*
moduleInstance
,
const
std
::
string
&
name
)
{
...
...
libraries/wasm-jit/Source/Runtime/RuntimePrivate.h
浏览文件 @
02212951
...
...
@@ -97,8 +97,9 @@ namespace Runtime
{
GlobalType
type
;
UntaggedValue
value
;
UntaggedValue
initialValue
;
GlobalInstance
(
GlobalType
inType
,
UntaggedValue
inValue
)
:
GCObject
(
ObjectKind
::
global
),
type
(
inType
),
value
(
inValue
)
{}
GlobalInstance
(
GlobalType
inType
,
UntaggedValue
inValue
)
:
GCObject
(
ObjectKind
::
global
),
type
(
inType
),
value
(
inValue
)
,
initialValue
(
value
)
{}
};
// An instance of a WebAssembly module.
...
...
tests/wasm_tests/test_wasts.hpp
浏览文件 @
02212951
...
...
@@ -53,4 +53,30 @@ static const char simple_no_memory_wast[] = R"=====(
)
)
)
)====="
;
static
const
char
mutable_global_wast
[]
=
R"=====(
(module
(import "env" "assert" (func $assert (param i32 i32)))
(table 0 anyfunc)
(memory $0 1)
(export "memory" (memory $0))
(export "init" (func $init))
(export "apply" (func $apply))
(func $init
(set_global $g0
(i32.const 444)
)
)
(func $apply (param $0 i64) (param $1 i64)
(call $assert
(i32.eq
(get_global $g0)
(i32.const 2)
)
(i32.const 0)
)
)
(global $g0 (mut i32) (i32.const 2))
)
)====="
;
\ No newline at end of file
tests/wasm_tests/wasm_tests.cpp
浏览文件 @
02212951
...
...
@@ -569,7 +569,33 @@ BOOST_FIXTURE_TEST_CASE( simple_no_memory_check, tester ) try {
trx
.
sign
(
get_private_key
(
N
(
nomem
),
"active"
),
chain_id_type
());
BOOST_CHECK_THROW
(
control
->
push_transaction
(
trx
),
wasm_execution_error
);
}
FC_LOG_AND_RETHROW
()
//Make sure globals are all reset to their inital values
BOOST_FIXTURE_TEST_CASE
(
check_global_reset
,
tester
)
try
{
produce_blocks
(
2
);
create_accounts
(
{
N
(
globalreset
)},
asset
::
from_string
(
"1000.0000 EOS"
)
);
transfer
(
N
(
inita
),
N
(
globalreset
),
"10.0000 EOS"
,
"memo"
);
produce_block
();
set_code
(
N
(
globalreset
),
mutable_global_wast
);
produce_blocks
(
1
);
signed_transaction
trx
;
action
act
;
act
.
account
=
N
(
globalreset
);
act
.
name
=
N
();
act
.
authorization
=
vector
<
permission_level
>
{{
N
(
globalreset
),
config
::
active_name
}};
trx
.
actions
.
push_back
(
act
);
set_tapos
(
trx
);
trx
.
sign
(
get_private_key
(
N
(
globalreset
),
"active"
),
chain_id_type
());
control
->
push_transaction
(
trx
);
produce_blocks
(
1
);
BOOST_REQUIRE_EQUAL
(
true
,
chain_has_transaction
(
trx
.
id
()));
const
auto
&
receipt
=
get_transaction_receipt
(
trx
.
id
());
BOOST_CHECK_EQUAL
(
transaction_receipt
::
executed
,
receipt
.
status
);
}
FC_LOG_AND_RETHROW
()
BOOST_AUTO_TEST_SUITE_END
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录