Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
sxychenjing
engine
提交
36757708
E
engine
项目概览
sxychenjing
/
engine
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
engine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
36757708
编写于
1月 06, 2016
作者:
A
Adam Barth
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #2218 from abarth/direct_wrapper
Add direct wrappers to tonic
上级
405d9a8c
72c87f27
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
187 addition
and
1 deletion
+187
-1
sky/engine/tonic/BUILD.gn
sky/engine/tonic/BUILD.gn
+2
-0
sky/engine/tonic/dart_converter.h
sky/engine/tonic/dart_converter.h
+48
-1
sky/engine/tonic/dart_direct_wrappable.cc
sky/engine/tonic/dart_direct_wrappable.cc
+53
-0
sky/engine/tonic/dart_direct_wrappable.h
sky/engine/tonic/dart_direct_wrappable.h
+84
-0
未找到文件。
sky/engine/tonic/BUILD.gn
浏览文件 @
36757708
...
...
@@ -15,6 +15,8 @@ source_set("tonic") {
"dart_converter.h",
"dart_dependency_catcher.cc",
"dart_dependency_catcher.h",
"dart_direct_wrappable.cc",
"dart_direct_wrappable.h",
"dart_error.cc",
"dart_error.h",
"dart_exception_factory.cc",
...
...
sky/engine/tonic/dart_converter.h
浏览文件 @
36757708
...
...
@@ -267,6 +267,29 @@ struct DartConverter<AtomicString> {
}
};
template
<
>
struct
DartConverter
<
const
char
*>
{
static
Dart_Handle
ToDart
(
const
char
*
val
)
{
return
Dart_NewStringFromCString
(
val
);
}
static
void
SetReturnValue
(
Dart_NativeArguments
args
,
const
char
*
val
)
{
Dart_SetReturnValue
(
args
,
ToDart
(
val
));
}
static
const
char
*
FromDart
(
Dart_Handle
handle
)
{
const
char
*
result
=
nullptr
;
Dart_StringToCString
(
handle
,
&
result
);
return
result
;
}
static
const
char
*
FromArguments
(
Dart_NativeArguments
args
,
int
index
,
Dart_Handle
&
exception
)
{
return
FromDart
(
Dart_GetNativeArgument
(
args
,
index
));
}
};
////////////////////////////////////////////////////////////////////////////////
// Collections
...
...
@@ -342,11 +365,35 @@ struct DartConverter<DartValue*> {
static
PassRefPtr
<
DartValue
>
FromArguments
(
Dart_NativeArguments
args
,
int
index
,
Dart_Handle
&
exception
)
{
// TODO(abarth): What should we do with auto_scope?
return
FromDart
(
Dart_GetNativeArgument
(
args
,
index
));
}
};
////////////////////////////////////////////////////////////////////////////////
// Dart_Handle
template
<
>
struct
DartConverter
<
Dart_Handle
>
{
static
Dart_Handle
ToDart
(
DartState
*
state
,
Dart_Handle
val
)
{
return
val
;
}
static
void
SetReturnValue
(
Dart_NativeArguments
args
,
Dart_Handle
val
)
{
Dart_SetReturnValue
(
args
,
val
);
}
static
Dart_Handle
FromDart
(
Dart_Handle
handle
)
{
return
handle
;
}
static
Dart_Handle
FromArguments
(
Dart_NativeArguments
args
,
int
index
,
Dart_Handle
&
exception
)
{
return
Dart_GetNativeArgument
(
args
,
index
);
}
};
////////////////////////////////////////////////////////////////////////////////
// Convience wrappers for commonly used conversions
...
...
sky/engine/tonic/dart_direct_wrappable.cc
0 → 100644
浏览文件 @
36757708
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "sky/engine/tonic/dart_direct_wrappable.h"
#include "sky/engine/tonic/dart_class_library.h"
#include "sky/engine/tonic/dart_error.h"
#include "sky/engine/tonic/dart_state.h"
#include "sky/engine/tonic/dart_wrappable.h"
#include "sky/engine/tonic/dart_wrapper_info.h"
namespace
blink
{
Dart_Handle
DartDirectWrappable
<
void
*>::
Wrap
(
DartState
*
dart_state
,
void
*
val
,
const
DartWrapperInfo
&
info
)
{
Dart_PersistentHandle
type
=
dart_state
->
class_library
().
GetClass
(
info
);
DCHECK
(
!
LogIfError
(
type
));
intptr_t
native_fields
[
DartWrappable
::
kNumberOfNativeFields
];
native_fields
[
DartWrappable
::
kPeerIndex
]
=
reinterpret_cast
<
intptr_t
>
(
val
);
native_fields
[
DartWrappable
::
kWrapperInfoIndex
]
=
reinterpret_cast
<
intptr_t
>
(
&
info
);
Dart_Handle
wrapper
=
Dart_AllocateWithNativeFields
(
type
,
DartWrappable
::
kNumberOfNativeFields
,
native_fields
);
DCHECK
(
!
LogIfError
(
wrapper
));
return
wrapper
;
}
void
*
DartDirectWrappable
<
void
*>::
FromDart
(
Dart_Handle
handle
)
{
intptr_t
peer
=
0
;
Dart_Handle
result
=
Dart_GetNativeInstanceField
(
handle
,
DartWrappable
::
kPeerIndex
,
&
peer
);
if
(
Dart_IsError
(
result
))
return
nullptr
;
return
reinterpret_cast
<
void
*>
(
peer
);
}
void
*
DartDirectWrappable
<
void
*>::
FromArguments
(
Dart_NativeArguments
args
,
int
index
,
Dart_Handle
&
exception
)
{
intptr_t
native_fields
[
DartWrappable
::
kNumberOfNativeFields
];
Dart_Handle
result
=
Dart_GetNativeFieldsOfArgument
(
args
,
index
,
DartWrappable
::
kNumberOfNativeFields
,
native_fields
);
if
(
Dart_IsError
(
result
))
{
exception
=
Dart_NewStringFromCString
(
DartError
::
kInvalidArgument
);
return
nullptr
;
}
return
reinterpret_cast
<
void
*>
(
native_fields
[
DartWrappable
::
kPeerIndex
]);
}
}
// namespace blink
sky/engine/tonic/dart_direct_wrappable.h
0 → 100644
浏览文件 @
36757708
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SKY_ENGINE_TONIC_DART_DIRECT_WRAPPABLE_H_
#define SKY_ENGINE_TONIC_DART_DIRECT_WRAPPABLE_H_
#include "dart/runtime/include/dart_api.h"
#include "sky/engine/tonic/dart_converter.h"
namespace
blink
{
class
DartState
;
struct
DartWrapperInfo
;
template
<
typename
T
>
struct
DartDirectWrappable
;
template
<
>
struct
DartDirectWrappable
<
void
*>
{
static
Dart_Handle
Wrap
(
DartState
*
dart_state
,
void
*
val
,
const
DartWrapperInfo
&
info
);
static
void
*
FromDart
(
Dart_Handle
handle
);
static
void
*
FromArguments
(
Dart_NativeArguments
args
,
int
index
,
Dart_Handle
&
exception
);
};
template
<
typename
T
>
struct
DartDirectWrappable
{
static
Dart_Handle
Wrap
(
DartState
*
dart_state
,
T
val
,
const
DartWrapperInfo
&
info
)
{
return
DartDirectWrappable
<
void
*>::
Wrap
(
dart_state
,
static_cast
<
void
*>
(
val
),
info
);
}
static
T
FromDart
(
Dart_Handle
handle
)
{
return
static_cast
<
T
>
(
DartDirectWrappable
<
void
*>::
FromDart
(
handle
));
}
static
T
FromArguments
(
Dart_NativeArguments
args
,
int
index
,
Dart_Handle
&
exception
)
{
return
static_cast
<
T
>
(
DartDirectWrappable
<
void
*>::
FromArguments
(
args
,
index
,
exception
));
}
};
template
<
typename
T
,
const
DartWrapperInfo
&
(
*
GetWrapperInfo
)()>
struct
DartConverterDirectWrappable
{
static
Dart_Handle
ToDart
(
T
val
)
{
if
(
!
val
)
return
Dart_Null
();
return
DartDirectWrappable
<
T
>::
Wrap
(
DartState
::
Current
(),
val
,
GetWrapperInfo
());
}
static
void
SetReturnValue
(
Dart_NativeArguments
args
,
T
val
)
{
Dart_SetReturnValue
(
args
,
ToDart
(
val
));
}
static
T
FromDart
(
Dart_Handle
handle
)
{
return
DartDirectWrappable
<
T
>::
FromDart
(
handle
);
}
static
T
FromArguments
(
Dart_NativeArguments
args
,
int
index
,
Dart_Handle
&
exception
)
{
return
DartDirectWrappable
<
T
>::
FromArguments
(
args
,
index
,
exception
);
}
};
#define IMPLEMENT_DIRECT_WRAPPABLE(DartName, ImplType) \
static const DartWrapperInfo kDartWrapperInfo_##DartName = { \
#DartName, 0, 0, 0, \
}; \
static const DartWrapperInfo& GetWrapperTypeInfo##DartName() { \
return kDartWrapperInfo_##DartName; \
} \
template <> \
struct DartConverter<ImplType> : public DartConverterDirectWrappable< \
ImplType, GetWrapperTypeInfo##DartName> {};
}
// namespace blink
#endif // SKY_ENGINE_TONIC_DART_DIRECT_WRAPPABLE_H_
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录