From e3c12b1daaf56396e5a11a9955b6f92529dcd8b0 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Thu, 26 Nov 2015 22:28:38 -0800 Subject: [PATCH] Remove IDL from engine/core/compositing Rather than using IDL code generation, we now use some template magic to generate this code. No all the code is template-generated yet, but this patch is a start in that direction. --- sky/engine/bindings/dart_ui.cc | 4 + sky/engine/bindings/scripts/dart_types.py | 2 +- sky/engine/core/compositing/Scene.cpp | 18 ++ sky/engine/core/compositing/Scene.h | 3 + sky/engine/core/compositing/Scene.idl | 8 - sky/engine/core/compositing/SceneBuilder.cpp | 82 ++++++++- sky/engine/core/compositing/SceneBuilder.h | 4 +- sky/engine/core/compositing/SceneBuilder.idl | 21 --- sky/engine/core/core.gni | 3 +- sky/engine/core/dart/compositing.dart | 29 ++++ sky/engine/core/painting/CanvasColor.cpp | 2 +- sky/engine/core/painting/CanvasColor.h | 15 +- sky/engine/core/painting/Offset.cpp | 2 +- sky/engine/core/painting/Offset.h | 9 +- sky/engine/core/painting/RRect.cpp | 6 +- sky/engine/core/painting/RRect.h | 7 +- sky/engine/core/painting/Rect.cpp | 6 +- sky/engine/core/painting/Rect.h | 7 +- sky/engine/core/painting/TransferMode.h | 8 +- sky/engine/tonic/dart_args.h | 168 +++++++++++++++++++ sky/engine/tonic/dart_converter.h | 9 +- sky/engine/tonic/dart_wrappable.h | 26 ++- sky/engine/tonic/float32_list.cc | 5 +- sky/engine/tonic/float32_list.h | 9 +- sky/engine/tonic/float64_list.cc | 5 +- sky/engine/tonic/float64_list.h | 9 +- sky/engine/tonic/int32_list.cc | 5 +- sky/engine/tonic/int32_list.h | 9 +- sky/engine/tonic/uint8_list.cc | 5 +- sky/engine/tonic/uint8_list.h | 9 +- 30 files changed, 427 insertions(+), 68 deletions(-) delete mode 100644 sky/engine/core/compositing/Scene.idl delete mode 100644 sky/engine/core/compositing/SceneBuilder.idl create mode 100644 sky/engine/core/dart/compositing.dart create mode 100644 sky/engine/tonic/dart_args.h diff --git a/sky/engine/bindings/dart_ui.cc b/sky/engine/bindings/dart_ui.cc index e113ef746..3c94d5e8c 100644 --- a/sky/engine/bindings/dart_ui.cc +++ b/sky/engine/bindings/dart_ui.cc @@ -6,6 +6,8 @@ #include "gen/sky/bindings/DartGlobal.h" #include "sky/engine/bindings/dart_runtime_hooks.h" +#include "sky/engine/core/compositing/Scene.h" +#include "sky/engine/core/compositing/SceneBuilder.h" #include "sky/engine/core/painting/painting.h" #include "sky/engine/core/window/window.h" #include "sky/engine/tonic/dart_converter.h" @@ -40,6 +42,8 @@ void DartUI::InitForIsolate() { DartRuntimeHooks::RegisterNatives(g_natives); Window::RegisterNatives(g_natives); Painting::RegisterNatives(g_natives); + Scene::RegisterNatives(g_natives); + SceneBuilder::RegisterNatives(g_natives); } DART_CHECK_VALID(Dart_SetNativeResolver( diff --git a/sky/engine/bindings/scripts/dart_types.py b/sky/engine/bindings/scripts/dart_types.py index 60440f0bb..12a4e707a 100644 --- a/sky/engine/bindings/scripts/dart_types.py +++ b/sky/engine/bindings/scripts/dart_types.py @@ -346,7 +346,7 @@ def pass_by_value_format(typename, null_check="{null_check}"): DART_TO_CPP_VALUE = { # Basic 'Date': 'DartUtilities::dartToDate(args, {index}, exception)', - 'DOMString': 'DartConverter::FromArguments{null_check}(args, {index}, exception, {auto_scope})', + 'DOMString': 'DartConverter::FromArguments{null_check}(args, {index}, exception)', 'ByteString': 'DartUtilities::dartToByteString{null_check}(args, {index}, exception, {auto_scope})', 'ScalarValueString': 'DartUtilities::dartToScalarValueString{null_check}(args, {index}, exception, {auto_scope})', 'boolean': 'DartConverter::FromArguments(args, {index}, exception)', diff --git a/sky/engine/core/compositing/Scene.cpp b/sky/engine/core/compositing/Scene.cpp index e03f6b58f..0906f85b0 100644 --- a/sky/engine/core/compositing/Scene.cpp +++ b/sky/engine/core/compositing/Scene.cpp @@ -6,8 +6,26 @@ #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkPictureRecorder.h" +#include "sky/engine/tonic/dart_args.h" +#include "sky/engine/tonic/dart_converter.h" +#include "sky/engine/tonic/dart_library_natives.h" namespace blink { +namespace { + +void DisposeCallback(Dart_NativeArguments args) { + DartCall(&Scene::dispose, args); +} + +} // namespace + +IMPLEMENT_WRAPPERTYPEINFO(Scene); + +void Scene::RegisterNatives(DartLibraryNatives* natives) { + natives->Register({ + { "Scene_dispose", DisposeCallback, 1, true }, + }); +} PassRefPtr Scene::create( std::unique_ptr rootLayer, diff --git a/sky/engine/core/compositing/Scene.h b/sky/engine/core/compositing/Scene.h index f80523a88..036909328 100644 --- a/sky/engine/core/compositing/Scene.h +++ b/sky/engine/core/compositing/Scene.h @@ -16,6 +16,7 @@ #include "third_party/skia/include/core/SkPicture.h" namespace blink { +class DartLibraryNatives; class Scene : public RefCounted, public DartWrappable { DEFINE_WRAPPERTYPEINFO(); @@ -30,6 +31,8 @@ class Scene : public RefCounted, public DartWrappable { void dispose(); + static void RegisterNatives(DartLibraryNatives* natives); + private: explicit Scene(std::unique_ptr rootLayer, uint32_t rasterizerTracingThreshold); diff --git a/sky/engine/core/compositing/Scene.idl b/sky/engine/core/compositing/Scene.idl deleted file mode 100644 index e3e8f0ea3..000000000 --- a/sky/engine/core/compositing/Scene.idl +++ /dev/null @@ -1,8 +0,0 @@ -// 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. - -// An opaque handle to a composited scene. -interface Scene { - void dispose(); -}; diff --git a/sky/engine/core/compositing/SceneBuilder.cpp b/sky/engine/core/compositing/SceneBuilder.cpp index beb9a547b..e334cfc5a 100644 --- a/sky/engine/core/compositing/SceneBuilder.cpp +++ b/sky/engine/core/compositing/SceneBuilder.cpp @@ -15,8 +15,88 @@ #include "sky/compositor/picture_layer.h" #include "sky/compositor/statistics_layer.h" #include "sky/compositor/transform_layer.h" +#include "sky/engine/tonic/dart_args.h" +#include "sky/engine/tonic/dart_converter.h" +#include "sky/engine/tonic/dart_library_natives.h" namespace blink { +namespace { + +void ConstructorCallback(Dart_NativeArguments args) { + DartCallConstructor(&SceneBuilder::create, args); +} + +void PushTransformCallback(Dart_NativeArguments args) { + DartArgIterator it(args); + Float64List matrix4 = it.GetNext(); + if (it.had_exception()) + return; + ExceptionState es; + GetReceiver(args)->pushTransform(matrix4, es); + if (es.had_exception()) + Dart_ThrowException(es.GetDartException(args, true)); +} + +void PushClipRectCallback(Dart_NativeArguments args) { + DartCall(&SceneBuilder::pushClipRect, args); +} + +void PushClipRRectCallback(Dart_NativeArguments args) { + DartCall(&SceneBuilder::pushClipRRect, args); +} + +void PushClipPathCallback(Dart_NativeArguments args) { + DartCall(&SceneBuilder::pushClipPath, args); +} + +void PushOpacityCallback(Dart_NativeArguments args) { + DartCall(&SceneBuilder::pushOpacity, args); +} + +void PushColorFilterCallback(Dart_NativeArguments args) { + DartCall(&SceneBuilder::pushColorFilter, args); +} + +void PopCallback(Dart_NativeArguments args) { + DartCall(&SceneBuilder::pop, args); +} + +void AddPictureCallback(Dart_NativeArguments args) { + DartCall(&SceneBuilder::addPicture, args); +} + +void AddStatisticsCallback(Dart_NativeArguments args) { + DartCall(&SceneBuilder::addStatistics, args); +} + +void SetRasterizerTracingThresholdCallback(Dart_NativeArguments args) { + DartCall(&SceneBuilder::setRasterizerTracingThreshold, args); +} + +void BuildCallback(Dart_NativeArguments args) { + DartCallAndReturn(&SceneBuilder::build, args); +} + +} // namespace + +IMPLEMENT_WRAPPERTYPEINFO(SceneBuilder); + +void SceneBuilder::RegisterNatives(DartLibraryNatives* natives) { + natives->Register({ + { "SceneBuilder_constructor", ConstructorCallback, 2, true }, + { "SceneBuilder_pushTransform", PushTransformCallback, 2, true }, + { "SceneBuilder_pushClipRect", PushClipRectCallback, 2, true }, + { "SceneBuilder_pushClipRRect", PushClipRRectCallback, 3, true }, + { "SceneBuilder_pushClipPath", PushClipPathCallback, 3, true }, + { "SceneBuilder_pushOpacity", PushOpacityCallback, 3, true }, + { "SceneBuilder_pushColorFilter", PushColorFilterCallback, 4, true }, + { "SceneBuilder_pop", PopCallback, 1, true }, + { "SceneBuilder_addPicture", AddPictureCallback, 4, true }, + { "SceneBuilder_addStatistics", AddStatisticsCallback, 3, true }, + { "SceneBuilder_setRasterizerTracingThreshold", SetRasterizerTracingThresholdCallback, 2, true }, + { "SceneBuilder_build", BuildCallback, 1, true }, + }); +} SceneBuilder::SceneBuilder(const Rect& bounds) : m_rootPaintBounds(bounds.sk_rect) @@ -69,7 +149,7 @@ void SceneBuilder::pushOpacity(int alpha, const Rect& bounds) addLayer(std::move(layer)); } -void SceneBuilder::pushColorFilter(SkColor color, SkXfermode::Mode transferMode, const Rect& bounds) +void SceneBuilder::pushColorFilter(CanvasColor color, TransferMode transferMode, const Rect& bounds) { std::unique_ptr layer(new sky::compositor::ColorFilterLayer()); if (!bounds.is_null) diff --git a/sky/engine/core/compositing/SceneBuilder.h b/sky/engine/core/compositing/SceneBuilder.h index 1691ba425..d8d06626d 100644 --- a/sky/engine/core/compositing/SceneBuilder.h +++ b/sky/engine/core/compositing/SceneBuilder.h @@ -40,7 +40,7 @@ public: void pushClipRRect(const RRect& rrect, const Rect& bounds); void pushClipPath(const CanvasPath* path, const Rect& bounds); void pushOpacity(int alpha, const Rect& bounds); - void pushColorFilter(SkColor color, SkXfermode::Mode transferMode, const Rect& bounds); + void pushColorFilter(CanvasColor color, TransferMode transferMode, const Rect& bounds); void pop(); void addPicture(const Offset& offset, Picture* picture, const Rect& bounds); @@ -50,6 +50,8 @@ public: PassRefPtr build(); + static void RegisterNatives(DartLibraryNatives* natives); + private: explicit SceneBuilder(const Rect& bounds); diff --git a/sky/engine/core/compositing/SceneBuilder.idl b/sky/engine/core/compositing/SceneBuilder.idl deleted file mode 100644 index 2681e8ca8..000000000 --- a/sky/engine/core/compositing/SceneBuilder.idl +++ /dev/null @@ -1,21 +0,0 @@ -// 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. - -[ - Constructor(Rect bounds), -] interface SceneBuilder { - [RaisesException] void pushTransform(Float64List matrix4); - void pushClipRect(Rect rect); - void pushClipRRect(RRect rrect, Rect bounds); - void pushClipPath(Path path, Rect bounds); - void pushOpacity(long alpha, Rect bounds); - void pushColorFilter(Color color, TransferMode transferMode, Rect bounds); - void pop(); - - void addPicture(Offset offset, Picture picture, Rect bounds); - void addStatistics(unsigned long enabledOptions, Rect bounds); - void setRasterizerTracingThreshold(unsigned long frameInterval); - - Scene build(); -}; diff --git a/sky/engine/core/core.gni b/sky/engine/core/core.gni index c21793699..744e29433 100644 --- a/sky/engine/core/core.gni +++ b/sky/engine/core/core.gni @@ -236,8 +236,6 @@ sky_core_files = [ ] core_idl_files = get_path_info([ - "compositing/Scene.idl", - "compositing/SceneBuilder.idl", "painting/Canvas.idl", "painting/ColorFilter.idl", "painting/Drawable.idl", @@ -258,6 +256,7 @@ core_idl_files = get_path_info([ "abspath") core_dart_files = get_path_info([ + "dart/compositing.dart", "dart/hash_codes.dart", "dart/hooks.dart", "dart/lerp.dart", diff --git a/sky/engine/core/dart/compositing.dart b/sky/engine/core/dart/compositing.dart new file mode 100644 index 000000000..aa5635a46 --- /dev/null +++ b/sky/engine/core/dart/compositing.dart @@ -0,0 +1,29 @@ +// 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. + +part of dart_ui; + +abstract class Scene extends NativeFieldWrapperClass2 { + void dispose() native "Scene_dispose"; +} + +class SceneBuilder extends NativeFieldWrapperClass2 { + void _constructor(Rect bounds) native "SceneBuilder_constructor"; + SceneBuilder(Rect bounds) { _constructor(bounds); } + + void pushTransform(Float64List matrix4) native "SceneBuilder_pushTransform"; + void pushClipRect(Rect rect) native "SceneBuilder_pushClipRect"; + void pushClipRRect(RRect rrect, Rect bounds) native "SceneBuilder_pushClipRRect"; + void pushClipPath(Path path, Rect bounds) native "SceneBuilder_pushClipPath"; + void pushOpacity(int alpha, Rect bounds) native "SceneBuilder_pushOpacity"; + void pushColorFilter(Color color, TransferMode transferMode, Rect bounds) native "SceneBuilder_pushColorFilter"; + + void pop() native "SceneBuilder_pop"; + + void addPicture(Offset offset, Picture picture, Rect bounds) native "SceneBuilder_addPicture"; + void addStatistics(int enabledOptions, Rect bounds) native "SceneBuilder_addStatistics"; + void setRasterizerTracingThreshold(int frameInterval) native "SceneBuilder_setRasterizerTracingThreshold"; + + Scene build() native "SceneBuilder_build"; +} diff --git a/sky/engine/core/painting/CanvasColor.cpp b/sky/engine/core/painting/CanvasColor.cpp index 11733c184..d3f1b563b 100644 --- a/sky/engine/core/painting/CanvasColor.cpp +++ b/sky/engine/core/painting/CanvasColor.cpp @@ -22,7 +22,7 @@ SkColor DartConverter::FromDart(Dart_Handle dart_color) { return static_cast(color); } -SkColor DartConverter::FromArgumentsWithNullCheck( +SkColor DartConverter::FromArguments( Dart_NativeArguments args, int index, Dart_Handle& exception) { diff --git a/sky/engine/core/painting/CanvasColor.h b/sky/engine/core/painting/CanvasColor.h index 0e727ea04..245c2cd43 100644 --- a/sky/engine/core/painting/CanvasColor.h +++ b/sky/engine/core/painting/CanvasColor.h @@ -13,7 +13,13 @@ namespace blink { -class CanvasColor {}; +struct CanvasColor { + SkColor color; + + CanvasColor(SkColor color) : color(color) { } + CanvasColor() : color() { } + operator SkColor() { return color; } +}; template <> struct DartConverterTypes { @@ -24,9 +30,14 @@ struct DartConverterTypes { template <> struct DartConverter { static SkColor FromDart(Dart_Handle handle); + static SkColor FromArguments(Dart_NativeArguments args, + int index, + Dart_Handle& exception); static SkColor FromArgumentsWithNullCheck(Dart_NativeArguments args, int index, - Dart_Handle& exception); + Dart_Handle& exception) { + return FromArguments(args, index, exception); + } static void SetReturnValue(Dart_NativeArguments args, SkColor val); }; diff --git a/sky/engine/core/painting/Offset.cpp b/sky/engine/core/painting/Offset.cpp index 6fcdff956..c8f7d2f1f 100644 --- a/sky/engine/core/painting/Offset.cpp +++ b/sky/engine/core/painting/Offset.cpp @@ -29,7 +29,7 @@ Offset DartConverter::FromDart(Dart_Handle handle) { return result; } -Offset DartConverter::FromArgumentsWithNullCheck( +Offset DartConverter::FromArguments( Dart_NativeArguments args, int index, Dart_Handle& exception) { diff --git a/sky/engine/core/painting/Offset.h b/sky/engine/core/painting/Offset.h index 2a0acf22b..1a920803a 100644 --- a/sky/engine/core/painting/Offset.h +++ b/sky/engine/core/painting/Offset.h @@ -20,9 +20,14 @@ class Offset { template <> struct DartConverter { static Offset FromDart(Dart_Handle handle); + static Offset FromArguments(Dart_NativeArguments args, + int index, + Dart_Handle& exception); static Offset FromArgumentsWithNullCheck(Dart_NativeArguments args, - int index, - Dart_Handle& exception); + int index, + Dart_Handle& exception) { + return FromArguments(args, index, exception); + } }; } // namespace blink diff --git a/sky/engine/core/painting/RRect.cpp b/sky/engine/core/painting/RRect.cpp index b5f138b48..6d47dc6c4 100644 --- a/sky/engine/core/painting/RRect.cpp +++ b/sky/engine/core/painting/RRect.cpp @@ -42,9 +42,9 @@ RRect DartConverter::FromDart(Dart_Handle dart_rrect) { return result; } -RRect DartConverter::FromArgumentsWithNullCheck(Dart_NativeArguments args, - int index, - Dart_Handle& exception) { +RRect DartConverter::FromArguments(Dart_NativeArguments args, + int index, + Dart_Handle& exception) { Dart_Handle dart_rrect = Dart_GetNativeArgument(args, index); DCHECK(!LogIfError(dart_rrect)); return FromDart(dart_rrect); diff --git a/sky/engine/core/painting/RRect.h b/sky/engine/core/painting/RRect.h index 535797270..016f8d27e 100644 --- a/sky/engine/core/painting/RRect.h +++ b/sky/engine/core/painting/RRect.h @@ -20,9 +20,14 @@ class RRect { template <> struct DartConverter { static RRect FromDart(Dart_Handle handle); + static RRect FromArguments(Dart_NativeArguments args, + int index, + Dart_Handle& exception); static RRect FromArgumentsWithNullCheck(Dart_NativeArguments args, int index, - Dart_Handle& exception); + Dart_Handle& exception) { + return FromArguments(args, index, exception); + } }; } // namespace blink diff --git a/sky/engine/core/painting/Rect.cpp b/sky/engine/core/painting/Rect.cpp index 65dea9592..37213d39a 100644 --- a/sky/engine/core/painting/Rect.cpp +++ b/sky/engine/core/painting/Rect.cpp @@ -46,9 +46,9 @@ Rect DartConverter::FromDart(Dart_Handle dart_rect) { return result; } -Rect DartConverter::FromArgumentsWithNullCheck(Dart_NativeArguments args, - int index, - Dart_Handle& exception) { +Rect DartConverter::FromArguments(Dart_NativeArguments args, + int index, + Dart_Handle& exception) { Dart_Handle dart_rect = Dart_GetNativeArgument(args, index); DCHECK(!LogIfError(dart_rect)); return FromDart(dart_rect); diff --git a/sky/engine/core/painting/Rect.h b/sky/engine/core/painting/Rect.h index 359bcdfdb..57cfdf1b8 100644 --- a/sky/engine/core/painting/Rect.h +++ b/sky/engine/core/painting/Rect.h @@ -20,9 +20,14 @@ class Rect { template <> struct DartConverter { static Rect FromDart(Dart_Handle handle); + static Rect FromArguments(Dart_NativeArguments args, + int index, + Dart_Handle& exception); static Rect FromArgumentsWithNullCheck(Dart_NativeArguments args, int index, - Dart_Handle& exception); + Dart_Handle& exception) { + return FromArguments(args, index, exception); + } }; } // namespace blink diff --git a/sky/engine/core/painting/TransferMode.h b/sky/engine/core/painting/TransferMode.h index fd90c6b88..1cc8d3eb7 100644 --- a/sky/engine/core/painting/TransferMode.h +++ b/sky/engine/core/painting/TransferMode.h @@ -10,7 +10,13 @@ namespace blink { -class TransferMode {}; +struct TransferMode { + SkXfermode::Mode mode; + + TransferMode() : mode() { } + TransferMode(SkXfermode::Mode mode) : mode(mode) { } + operator SkXfermode::Mode() { return mode; } +}; template <> struct DartConverter diff --git a/sky/engine/tonic/dart_args.h b/sky/engine/tonic/dart_args.h new file mode 100644 index 000000000..2cfe1195f --- /dev/null +++ b/sky/engine/tonic/dart_args.h @@ -0,0 +1,168 @@ +// 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. + +#ifndef SKY_ENGINE_TONIC_DART_ARGS_H_ +#define SKY_ENGINE_TONIC_DART_ARGS_H_ + +#include + +#include "sky/engine/tonic/dart_converter.h" +#include "sky/engine/tonic/dart_wrappable.h" +#include "dart/runtime/include/dart_api.h" + +namespace blink { + +class DartArgIterator { + public: + explicit DartArgIterator(Dart_NativeArguments args) + : args_(args), index_(1), had_exception_(false) { } + + template + T GetNext() { + if (had_exception_) + return T(); + Dart_Handle exception = nullptr; + T arg = DartConverter::FromArguments(args_, index_++, exception); + if (exception) { + had_exception_ = true; + Dart_ThrowException(exception); + } + return arg; + } + + bool had_exception() const { return had_exception_; } + + Dart_NativeArguments args() const { return args_; } + + private: + Dart_NativeArguments args_; + int index_; + bool had_exception_; + + DISALLOW_COPY_AND_ASSIGN(DartArgIterator); +}; + +// Classes for generating and storing an argument pack of integer indices +// (based on well-known "indices trick", see: http://goo.gl/bKKojn): +template +struct IndicesHolder {}; + +template +struct IndicesGenerator { + using type = typename IndicesGenerator::type; +}; + +template +struct IndicesGenerator<0, indices...> { + using type = IndicesHolder; +}; + +template +class IndicesForSignature {}; + +template +struct IndicesForSignature { + using type = typename IndicesGenerator::type; +}; + +template +struct IndicesForSignature { + using type = typename IndicesGenerator::type; +}; + +template +struct DartArgHolder { + using ValueType = typename std::remove_const< + typename std::remove_reference::type + >::type; + + ValueType value; + + explicit DartArgHolder(DartArgIterator* it) + : value(it->GetNext()) {} +}; + +template +class DartDecoder { +}; + +template +struct DartDecoder, ResultType (*)(ArgTypes...)> + : public DartArgHolder... { + using FunctionPtr = ResultType (*)(ArgTypes...); + + DartArgIterator* it_; + + explicit DartDecoder(DartArgIterator* it) + : DartArgHolder(it)..., it_(it) { } + + ResultType Dispatch(FunctionPtr func) { + return (*func)(DartArgHolder::value...); + } +}; + +template +struct DartDecoder, ResultType (C::*)(ArgTypes...)> + : public DartArgHolder... { + using FunctionPtr = ResultType (C::*)(ArgTypes...); + + DartArgIterator* it_; + + explicit DartDecoder(DartArgIterator* it) + : DartArgHolder(it)..., it_(it) { } + + ResultType Dispatch(FunctionPtr func) { + return (GetReceiver(it_->args())->*func)( + DartArgHolder::value...); + } +}; + +template +void DartReturn(T result, Dart_NativeArguments args) { + DartConverter::SetReturnValue(args, result); +} + +template +void DartCall(Sig func, Dart_NativeArguments args) { + DartArgIterator it(args); + using Indices = typename IndicesForSignature::type; + DartDecoder decoder(&it); + if (it.had_exception()) + return; + decoder.Dispatch(func); +} + +template +void DartCallAndReturn(Sig func, Dart_NativeArguments args) { + DartArgIterator it(args); + using Indices = typename IndicesForSignature::type; + DartDecoder decoder(&it); + if (it.had_exception()) + return; + DartReturn(decoder.Dispatch(func), args); +} + +template +void DartCallConstructor(Sig func, Dart_NativeArguments args) { + DartArgIterator it(args); + using Indices = typename IndicesForSignature::type; + DartDecoder decoder(&it); + if (it.had_exception()) + return; + decoder.Dispatch(func)->AssociateWithDartWrapper(args); +} + +} // namespace blink + +#endif // SKY_ENGINE_TONIC_DART_ARGS_H_ diff --git a/sky/engine/tonic/dart_converter.h b/sky/engine/tonic/dart_converter.h index 9cb95cac3..ffb3471d5 100644 --- a/sky/engine/tonic/dart_converter.h +++ b/sky/engine/tonic/dart_converter.h @@ -226,8 +226,7 @@ struct DartConverter { static String FromArguments(Dart_NativeArguments args, int index, - Dart_Handle& exception, - bool auto_scope = true) { + Dart_Handle& exception) { // TODO(abarth): What should we do with auto_scope? void* peer = nullptr; Dart_Handle handle = Dart_GetNativeStringArgument(args, index, &peer); @@ -309,8 +308,7 @@ struct DartConverter> { static Vector FromArguments(Dart_NativeArguments args, int index, - Dart_Handle& exception, - bool auto_scope = true) { + Dart_Handle& exception) { // TODO(abarth): What should we do with auto_scope? return FromDart(Dart_GetNativeArgument(args, index)); } @@ -335,8 +333,7 @@ struct DartConverter { static PassRefPtr FromArguments(Dart_NativeArguments args, int index, - Dart_Handle& exception, - bool auto_scope = true) { + Dart_Handle& exception) { // TODO(abarth): What should we do with auto_scope? return FromDart(Dart_GetNativeArgument(args, index)); } diff --git a/sky/engine/tonic/dart_wrappable.h b/sky/engine/tonic/dart_wrappable.h index 2a1add991..0be3eea86 100644 --- a/sky/engine/tonic/dart_wrappable.h +++ b/sky/engine/tonic/dart_wrappable.h @@ -65,6 +65,21 @@ class DartWrappable { private: \ static const DartWrapperInfo& dart_wrapper_info_ +#define IMPLEMENT_WRAPPERTYPEINFO(ClassName) \ +static void RefObject(DartWrappable* impl) { \ + static_cast(impl)->ref(); \ +} \ +static void DerefObject(DartWrappable* impl) { \ + static_cast(impl)->deref(); \ +} \ +static const DartWrapperInfo kDartWrapperInfo = { \ + #ClassName, \ + sizeof(ClassName), \ + &RefObject, \ + &DerefObject, \ +}; \ +const DartWrapperInfo& ClassName::dart_wrapper_info_ = kDartWrapperInfo; \ + struct DartConverterWrappable { static DartWrappable* FromDart(Dart_Handle handle); static DartWrappable* FromArguments(Dart_NativeArguments args, @@ -79,7 +94,7 @@ template struct DartConverter< T*, typename base::enable_if< - base::is_convertible::value>::type> { + base::is_convertible::value>::type> { static Dart_Handle ToDart(DartWrappable* val) { if (!val) return Dart_Null(); @@ -134,6 +149,15 @@ struct DartConverter> { } }; +template +struct DartConverter> { + static void SetReturnValue(Dart_NativeArguments args, + PassRefPtr val, + bool auto_scope = true) { + DartConverter::SetReturnValue(args, val.get()); + } +}; + template inline T* GetReceiver(Dart_NativeArguments args) { intptr_t receiver; diff --git a/sky/engine/tonic/float32_list.cc b/sky/engine/tonic/float32_list.cc index 2ca962dd7..5102a757f 100644 --- a/sky/engine/tonic/float32_list.cc +++ b/sky/engine/tonic/float32_list.cc @@ -7,6 +7,9 @@ namespace blink { +Float32List::Float32List() + : data_(nullptr), num_elements_(0), dart_handle_(nullptr) {} + Float32List::Float32List(Dart_Handle list) : data_(nullptr), num_elements_(0), dart_handle_(list) { if (Dart_IsNull(list)) @@ -32,7 +35,7 @@ Float32List::~Float32List() { Dart_TypedDataReleaseData(dart_handle_); } -Float32List DartConverter::FromArgumentsWithNullCheck( +Float32List DartConverter::FromArguments( Dart_NativeArguments args, int index, Dart_Handle& exception) { diff --git a/sky/engine/tonic/float32_list.h b/sky/engine/tonic/float32_list.h index 98b037a80..cfd2109b5 100644 --- a/sky/engine/tonic/float32_list.h +++ b/sky/engine/tonic/float32_list.h @@ -19,6 +19,7 @@ class Float32List { public: explicit Float32List(Dart_Handle list); Float32List(Float32List&& other); + Float32List(); ~Float32List(); float& at(intptr_t i) @@ -50,10 +51,14 @@ class Float32List { template <> struct DartConverter { static void SetReturnValue(Dart_NativeArguments args, Float32List val); - + static Float32List FromArguments(Dart_NativeArguments args, + int index, + Dart_Handle& exception); static Float32List FromArgumentsWithNullCheck(Dart_NativeArguments args, int index, - Dart_Handle& exception); + Dart_Handle& exception) { + return FromArguments(args, index, exception); + } }; } // namespace blink diff --git a/sky/engine/tonic/float64_list.cc b/sky/engine/tonic/float64_list.cc index 28a6f00a7..39f168eae 100644 --- a/sky/engine/tonic/float64_list.cc +++ b/sky/engine/tonic/float64_list.cc @@ -7,6 +7,9 @@ namespace blink { +Float64List::Float64List() + : data_(nullptr), num_elements_(0), dart_handle_(nullptr) {} + Float64List::Float64List(Dart_Handle list) : data_(nullptr), num_elements_(0), dart_handle_(list) { if (Dart_IsNull(list)) @@ -32,7 +35,7 @@ Float64List::~Float64List() { Dart_TypedDataReleaseData(dart_handle_); } -Float64List DartConverter::FromArgumentsWithNullCheck( +Float64List DartConverter::FromArguments( Dart_NativeArguments args, int index, Dart_Handle& exception) { diff --git a/sky/engine/tonic/float64_list.h b/sky/engine/tonic/float64_list.h index 325b883ad..144823ab2 100644 --- a/sky/engine/tonic/float64_list.h +++ b/sky/engine/tonic/float64_list.h @@ -19,6 +19,7 @@ class Float64List { public: explicit Float64List(Dart_Handle list); Float64List(Float64List&& other); + Float64List(); ~Float64List(); double& at(intptr_t i) @@ -50,10 +51,14 @@ class Float64List { template <> struct DartConverter { static void SetReturnValue(Dart_NativeArguments args, Float64List val); - + static Float64List FromArguments(Dart_NativeArguments args, + int index, + Dart_Handle& exception); static Float64List FromArgumentsWithNullCheck(Dart_NativeArguments args, int index, - Dart_Handle& exception); + Dart_Handle& exception) { + return FromArguments(args, index, exception); + } }; } // namespace blink diff --git a/sky/engine/tonic/int32_list.cc b/sky/engine/tonic/int32_list.cc index ca626fabe..d479d0328 100644 --- a/sky/engine/tonic/int32_list.cc +++ b/sky/engine/tonic/int32_list.cc @@ -7,6 +7,9 @@ namespace blink { +Int32List::Int32List() + : data_(nullptr), num_elements_(0), dart_handle_(nullptr) {} + Int32List::Int32List(Dart_Handle list) : data_(nullptr), num_elements_(0), dart_handle_(list) { if (Dart_IsNull(list)) @@ -39,7 +42,7 @@ void Int32List::Release() { } -Int32List DartConverter::FromArgumentsWithNullCheck( +Int32List DartConverter::FromArguments( Dart_NativeArguments args, int index, Dart_Handle& exception) { diff --git a/sky/engine/tonic/int32_list.h b/sky/engine/tonic/int32_list.h index 8fc740424..03e1d090e 100644 --- a/sky/engine/tonic/int32_list.h +++ b/sky/engine/tonic/int32_list.h @@ -19,6 +19,7 @@ class Int32List { public: explicit Int32List(Dart_Handle list); Int32List(Int32List&& other); + Int32List(); ~Int32List(); int32_t& at(intptr_t i) @@ -52,10 +53,14 @@ class Int32List { template <> struct DartConverter { static void SetReturnValue(Dart_NativeArguments args, Int32List val); - + static Int32List FromArguments(Dart_NativeArguments args, + int index, + Dart_Handle& exception); static Int32List FromArgumentsWithNullCheck(Dart_NativeArguments args, int index, - Dart_Handle& exception); + Dart_Handle& exception) { + return FromArguments(args, index, exception); + } }; } // namespace blink diff --git a/sky/engine/tonic/uint8_list.cc b/sky/engine/tonic/uint8_list.cc index 0a2458e18..f272023c0 100644 --- a/sky/engine/tonic/uint8_list.cc +++ b/sky/engine/tonic/uint8_list.cc @@ -7,6 +7,9 @@ namespace blink { +Uint8List::Uint8List() + : data_(nullptr), num_elements_(0), dart_handle_(nullptr) {} + Uint8List::Uint8List(Dart_Handle list) : data_(nullptr), num_elements_(0), dart_handle_(list) { if (Dart_IsNull(list)) @@ -32,7 +35,7 @@ Uint8List::~Uint8List() { Dart_TypedDataReleaseData(dart_handle_); } -Uint8List DartConverter::FromArgumentsWithNullCheck( +Uint8List DartConverter::FromArguments( Dart_NativeArguments args, int index, Dart_Handle& exception) { diff --git a/sky/engine/tonic/uint8_list.h b/sky/engine/tonic/uint8_list.h index a54349adb..b99e08e11 100644 --- a/sky/engine/tonic/uint8_list.h +++ b/sky/engine/tonic/uint8_list.h @@ -19,6 +19,7 @@ class Uint8List { public: explicit Uint8List(Dart_Handle list); Uint8List(Uint8List&& other); + Uint8List(); ~Uint8List(); uint8& at(intptr_t i) @@ -50,10 +51,14 @@ class Uint8List { template <> struct DartConverter { static void SetReturnValue(Dart_NativeArguments args, Uint8List val); - + static Uint8List FromArguments(Dart_NativeArguments args, + int index, + Dart_Handle& exception); static Uint8List FromArgumentsWithNullCheck(Dart_NativeArguments args, int index, - Dart_Handle& exception); + Dart_Handle& exception) { + return FromArguments(args, index, exception); + } static Dart_Handle ToDart(const uint8_t* buffer, unsigned int length); }; -- GitLab