diff --git a/runtime/bin/dart_api_win.c b/runtime/bin/dart_api_win.c index bf04c3d0680..1bcc477e43e 100644 --- a/runtime/bin/dart_api_win.c +++ b/runtime/bin/dart_api_win.c @@ -149,6 +149,11 @@ typedef Dart_Handle (*Dart_EmptyStringType)(); typedef Dart_Handle (*Dart_TypeDynamicType)(); typedef Dart_Handle (*Dart_TypeVoidType)(); typedef Dart_Handle (*Dart_TypeNeverType)(); +typedef Dart_Handle (*Dart_TypeStringType)(); +typedef Dart_Handle (*Dart_TypeDoubleType)(); +typedef Dart_Handle (*Dart_TypeIntType)(); +typedef Dart_Handle (*Dart_TypeBooleanType)(); +typedef Dart_Handle (*Dart_TypeObjectType)(); typedef Dart_Handle (*Dart_ObjectEqualsType)(Dart_Handle, Dart_Handle, bool*); typedef Dart_Handle (*Dart_ObjectIsTypeType)(Dart_Handle, Dart_Handle, bool*); typedef bool (*Dart_IsInstanceType)(Dart_Handle); @@ -572,6 +577,11 @@ static Dart_EmptyStringType Dart_EmptyStringFn = NULL; static Dart_TypeDynamicType Dart_TypeDynamicFn = NULL; static Dart_TypeVoidType Dart_TypeVoidFn = NULL; static Dart_TypeNeverType Dart_TypeNeverFn = NULL; +static Dart_TypeStringType Dart_TypeStringFn = NULL; +static Dart_TypeDoubleType Dart_TypeDoubleFn = NULL; +static Dart_TypeIntType Dart_TypeIntFn = NULL; +static Dart_TypeBooleanType Dart_TypeBooleanFn = NULL; +static Dart_TypeObjectType Dart_TypeObjectFn = NULL; static Dart_ObjectEqualsType Dart_ObjectEqualsFn = NULL; static Dart_ObjectIsTypeType Dart_ObjectIsTypeFn = NULL; static Dart_IsInstanceType Dart_IsInstanceFn = NULL; @@ -983,6 +993,15 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { (Dart_TypeVoidType)GetProcAddress(process, "Dart_TypeVoid"); Dart_TypeNeverFn = (Dart_TypeNeverType)GetProcAddress(process, "Dart_TypeNever"); + Dart_TypeStringFn = + (Dart_TypeStringType)GetProcAddress(process, "Dart_TypeString"); + Dart_TypeDoubleFn = + (Dart_TypeDoubleType)GetProcAddress(process, "Dart_TypeDouble"); + Dart_TypeIntFn = (Dart_TypeIntType)GetProcAddress(process, "Dart_TypeInt"); + Dart_TypeBooleanFn = + (Dart_TypeBooleanType)GetProcAddress(process, "Dart_TypeBoolean"); + Dart_TypeObjectFn = + (Dart_TypeObjectType)GetProcAddress(process, "Dart_TypeObject"); Dart_ObjectEqualsFn = (Dart_ObjectEqualsType)GetProcAddress(process, "Dart_ObjectEquals"); Dart_ObjectIsTypeFn = @@ -1820,6 +1839,26 @@ Dart_Handle Dart_TypeNever() { return Dart_TypeNeverFn(); } +Dart_Handle Dart_TypeString() { + return Dart_TypeStringFn(); +} + +Dart_Handle Dart_TypeDouble() { + return Dart_TypeDoubleFn(); +} + +Dart_Handle Dart_TypeInt() { + return Dart_TypeIntFn(); +} + +Dart_Handle Dart_TypeBoolean() { + return Dart_TypeBooleanFn(); +} + +Dart_Handle Dart_TypeObject() { + return Dart_TypeObjectFn(); +} + Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, bool* equal) { return Dart_ObjectEqualsFn(obj1, obj2, equal); } diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h index e8c8120c583..18c8d6b35bc 100644 --- a/runtime/include/dart_api.h +++ b/runtime/include/dart_api.h @@ -1892,6 +1892,17 @@ DART_EXPORT Dart_Handle Dart_TypeDynamic(void); DART_EXPORT Dart_Handle Dart_TypeVoid(void); DART_EXPORT Dart_Handle Dart_TypeNever(void); +/** + * Returns simple core types. + * + * \return A handle to type. + */ +DART_EXPORT Dart_Handle Dart_TypeString(); +DART_EXPORT Dart_Handle Dart_TypeDouble(); +DART_EXPORT Dart_Handle Dart_TypeInt(); +DART_EXPORT Dart_Handle Dart_TypeBoolean(); +DART_EXPORT Dart_Handle Dart_TypeObject(); + /** * Checks if the two objects are equal. * diff --git a/runtime/tests/vm/dart/exported_symbols_test.dart b/runtime/tests/vm/dart/exported_symbols_test.dart index 74096130ee2..f6b0bbafdd4 100644 --- a/runtime/tests/vm/dart/exported_symbols_test.dart +++ b/runtime/tests/vm/dart/exported_symbols_test.dart @@ -351,8 +351,13 @@ main() { "Dart_True", "Dart_TypedDataAcquireData", "Dart_TypedDataReleaseData", + "Dart_TypeBoolean", + "Dart_TypeDouble", "Dart_TypeDynamic", + "Dart_TypeInt", "Dart_TypeNever", + "Dart_TypeObject", + "Dart_TypeString", "Dart_TypeToNonNullableType", "Dart_TypeToNullableType", "Dart_TypeVoid", diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc index ea0488450b2..88ab152acd8 100644 --- a/runtime/vm/dart_api_impl.cc +++ b/runtime/vm/dart_api_impl.cc @@ -2307,6 +2307,41 @@ DART_EXPORT Dart_Handle Dart_TypeNever() { return Api::NewHandle(T, Type::NeverType()); } +DART_EXPORT Dart_Handle Dart_TypeString() { + DARTSCOPE(Thread::Current()); + CHECK_CALLBACK_STATE(T); + API_TIMELINE_DURATION(T); + return Api::NewHandle(T, T->isolate_group()->object_store()->string_type()); +} + +DART_EXPORT Dart_Handle Dart_TypeDouble() { + DARTSCOPE(Thread::Current()); + CHECK_CALLBACK_STATE(T); + API_TIMELINE_DURATION(T); + return Api::NewHandle(T, T->isolate_group()->object_store()->double_type()); +} + +DART_EXPORT Dart_Handle Dart_TypeInt() { + DARTSCOPE(Thread::Current()); + CHECK_CALLBACK_STATE(T); + API_TIMELINE_DURATION(T); + return Api::NewHandle(T, T->isolate_group()->object_store()->int_type()); +} + +DART_EXPORT Dart_Handle Dart_TypeBoolean() { + DARTSCOPE(Thread::Current()); + CHECK_CALLBACK_STATE(T); + API_TIMELINE_DURATION(T); + return Api::NewHandle(T, T->isolate_group()->object_store()->bool_type()); +} + +DART_EXPORT Dart_Handle Dart_TypeObject() { + DARTSCOPE(Thread::Current()); + CHECK_CALLBACK_STATE(T); + API_TIMELINE_DURATION(T); + return Api::NewHandle(T, T->isolate_group()->object_store()->object_type()); +} + DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, bool* value) { diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc index 848b1121837..f2bc3197fed 100644 --- a/runtime/vm/dart_api_impl_test.cc +++ b/runtime/vm/dart_api_impl_test.cc @@ -1163,6 +1163,64 @@ TEST_CASE(DartAPI_TypeNever) { EXPECT_STREQ("Never", cstr); } +TEST_CASE(DartAPI_CoreTypes) { + { // String + Dart_Handle type = Dart_TypeString(); + EXPECT_VALID(type); + EXPECT(Dart_IsType(type)); + + Dart_Handle str = Dart_ToString(type); + EXPECT_VALID(str); + const char* cstr = nullptr; + EXPECT_VALID(Dart_StringToCString(str, &cstr)); + EXPECT_STREQ("String", cstr); + } + { // Double + Dart_Handle type = Dart_TypeDouble(); + EXPECT_VALID(type); + EXPECT(Dart_IsType(type)); + + Dart_Handle str = Dart_ToString(type); + EXPECT_VALID(str); + const char* cstr = nullptr; + EXPECT_VALID(Dart_StringToCString(str, &cstr)); + EXPECT_STREQ("double", cstr); + } + { // Boolean + Dart_Handle type = Dart_TypeBoolean(); + EXPECT_VALID(type); + EXPECT(Dart_IsType(type)); + + Dart_Handle str = Dart_ToString(type); + EXPECT_VALID(str); + const char* cstr = nullptr; + EXPECT_VALID(Dart_StringToCString(str, &cstr)); + EXPECT_STREQ("bool", cstr); + } + { // Int + Dart_Handle type = Dart_TypeInt(); + EXPECT_VALID(type); + EXPECT(Dart_IsType(type)); + + Dart_Handle str = Dart_ToString(type); + EXPECT_VALID(str); + const char* cstr = nullptr; + EXPECT_VALID(Dart_StringToCString(str, &cstr)); + EXPECT_STREQ("int", cstr); + } + { // Object + Dart_Handle type = Dart_TypeObject(); + EXPECT_VALID(type); + EXPECT(Dart_IsType(type)); + + Dart_Handle str = Dart_ToString(type); + EXPECT_VALID(str); + const char* cstr = nullptr; + EXPECT_VALID(Dart_StringToCString(str, &cstr)); + EXPECT_STREQ("Object", cstr); + } +} + TEST_CASE(DartAPI_IdentityEquals) { Dart_Handle five = Dart_NewInteger(5); Dart_Handle five_again = Dart_NewInteger(5);