Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
deno
提交
559453cf
D
deno
项目概览
张重言
/
deno
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
deno
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
559453cf
编写于
6月 19, 2018
作者:
B
Bert Belder
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Make set_flags() return the remaining non-v8 arguments
上级
b2b4054f
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
34 addition
and
13 deletion
+34
-13
deno2/main.rs
deno2/main.rs
+34
-13
未找到文件。
deno2/main.rs
浏览文件 @
559453cf
...
...
@@ -8,32 +8,53 @@ use std::ffi::CString;
extern
"C"
{
fn
deno_v8_version
()
->
*
const
c_char
;
fn
deno_init
();
// Note: `deno_set_flags` actually takes `char**` as it's second argument,
// not `const char**`, so this is technically incorrect. However it doesn't
// actually modify the contents of the strings, so it's not unsafe.
// TODO: use the correct function signature.
fn
deno_set_flags
(
argc
:
*
mut
c_int
,
argv
:
*
mut
*
const
c_char
);
fn
deno_set_flags
(
argc
:
*
mut
c_int
,
argv
:
*
mut
*
mut
c_char
);
}
fn
set_flags
()
{
// Create a vector of zero terminated c strings.
// Pass the command line arguments to v8.
// Returns a vector of command line arguments that v8 did not understand.
fn
set_flags
()
->
Vec
<
String
>
{
// deno_set_flags(int* argc, char** argv) mutates argc and argv to remove
// flags that v8 understands.
// Convert command line arguments to a vector of C strings.
let
mut
argv
=
std
::
env
::
args
()
.map
(|
arg
|
CString
::
new
(
arg
)
.unwrap
()
.as_ptr
())
.map
(|
arg
|
CString
::
new
(
arg
)
.unwrap
()
.into_bytes_with_nul
())
.collect
::
<
Vec
<
_
>>
();
// Make a new array, that can be modified by V8::SetFlagsFromCommandLine(),
// containing mutable raw pointers to the individual command line args.
let
mut
c_argv
=
argv
.iter_mut
()
.map
(|
arg
|
arg
.as_mut_ptr
()
as
*
mut
i8
)
.collect
::
<
Vec
<
_
>>
();
let
mut
argc
=
argv
.len
()
as
c_int
;
// Store the length of the argv array in a local variable. We'll pass a
// pointer to this local variable to deno_set_flags(), which then
// updates its value.
let
mut
c_argc
=
argv
.len
()
as
c_int
;
// Let v8 parse the arguments it recognizes and remove them from c_argv.
unsafe
{
// pass the pointer of the vector's internal buffer to a C function
deno_set_flags
(
&
mut
argc
,
argv
.as_mut_ptr
());
deno_set_flags
(
&
mut
c_argc
,
c_argv
.as_mut_ptr
());
};
// If c_argc was updated we have to change the length of c_argv to match.
c_argv
.truncate
(
c_argc
as
usize
);
// Copy the modified arguments list into a proper rust vec and return it.
c_argv
.iter
()
.map
(|
ptr
|
unsafe
{
let
cstr
=
CStr
::
from_ptr
(
*
ptr
as
*
const
i8
);
let
slice
=
cstr
.to_str
()
.unwrap
();
slice
.to_string
()
})
.collect
::
<
Vec
<
_
>>
()
}
fn
main
()
{
println!
(
"Hi"
);
set_flags
();
let
args
=
set_flags
();
unsafe
{
deno_init
()
};
let
v
=
unsafe
{
deno_v8_version
()
};
let
c_str
=
unsafe
{
CStr
::
from_ptr
(
v
)
};
let
version
=
c_str
.to_str
()
.unwrap
();
println!
(
"version: {}"
,
version
);
for
arg
in
args
{
println!
(
"arg: {}"
,
arg
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录