Skip to content

Commit 522e611

Browse files
art-snakeCommit Queue
authored andcommitted
[vm] Add useful type getters to C API
This allows direct access to String, int, bool, double, Object types instead of requiring name based lookups via Dart_LookupLibrary and Dart_GetType. [email protected] TEST=vm/cc/DartAPI_CoreTypes Change-Id: I2aba317be3b4be21f37d61843a328a5146417e54 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/450160 Reviewed-by: Daco Harkes <[email protected]> Reviewed-by: Slava Egorov <[email protected]> Auto-Submit: Art Snake <[email protected]> Commit-Queue: Slava Egorov <[email protected]>
1 parent 9eea7a3 commit 522e611

File tree

5 files changed

+148
-0
lines changed

5 files changed

+148
-0
lines changed

runtime/bin/dart_api_win.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,11 @@ typedef Dart_Handle (*Dart_EmptyStringType)();
149149
typedef Dart_Handle (*Dart_TypeDynamicType)();
150150
typedef Dart_Handle (*Dart_TypeVoidType)();
151151
typedef Dart_Handle (*Dart_TypeNeverType)();
152+
typedef Dart_Handle (*Dart_TypeStringType)();
153+
typedef Dart_Handle (*Dart_TypeDoubleType)();
154+
typedef Dart_Handle (*Dart_TypeIntType)();
155+
typedef Dart_Handle (*Dart_TypeBooleanType)();
156+
typedef Dart_Handle (*Dart_TypeObjectType)();
152157
typedef Dart_Handle (*Dart_ObjectEqualsType)(Dart_Handle, Dart_Handle, bool*);
153158
typedef Dart_Handle (*Dart_ObjectIsTypeType)(Dart_Handle, Dart_Handle, bool*);
154159
typedef bool (*Dart_IsInstanceType)(Dart_Handle);
@@ -572,6 +577,11 @@ static Dart_EmptyStringType Dart_EmptyStringFn = NULL;
572577
static Dart_TypeDynamicType Dart_TypeDynamicFn = NULL;
573578
static Dart_TypeVoidType Dart_TypeVoidFn = NULL;
574579
static Dart_TypeNeverType Dart_TypeNeverFn = NULL;
580+
static Dart_TypeStringType Dart_TypeStringFn = NULL;
581+
static Dart_TypeDoubleType Dart_TypeDoubleFn = NULL;
582+
static Dart_TypeIntType Dart_TypeIntFn = NULL;
583+
static Dart_TypeBooleanType Dart_TypeBooleanFn = NULL;
584+
static Dart_TypeObjectType Dart_TypeObjectFn = NULL;
575585
static Dart_ObjectEqualsType Dart_ObjectEqualsFn = NULL;
576586
static Dart_ObjectIsTypeType Dart_ObjectIsTypeFn = NULL;
577587
static Dart_IsInstanceType Dart_IsInstanceFn = NULL;
@@ -983,6 +993,15 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
983993
(Dart_TypeVoidType)GetProcAddress(process, "Dart_TypeVoid");
984994
Dart_TypeNeverFn =
985995
(Dart_TypeNeverType)GetProcAddress(process, "Dart_TypeNever");
996+
Dart_TypeStringFn =
997+
(Dart_TypeStringType)GetProcAddress(process, "Dart_TypeString");
998+
Dart_TypeDoubleFn =
999+
(Dart_TypeDoubleType)GetProcAddress(process, "Dart_TypeDouble");
1000+
Dart_TypeIntFn = (Dart_TypeIntType)GetProcAddress(process, "Dart_TypeInt");
1001+
Dart_TypeBooleanFn =
1002+
(Dart_TypeBooleanType)GetProcAddress(process, "Dart_TypeBoolean");
1003+
Dart_TypeObjectFn =
1004+
(Dart_TypeObjectType)GetProcAddress(process, "Dart_TypeObject");
9861005
Dart_ObjectEqualsFn =
9871006
(Dart_ObjectEqualsType)GetProcAddress(process, "Dart_ObjectEquals");
9881007
Dart_ObjectIsTypeFn =
@@ -1820,6 +1839,26 @@ Dart_Handle Dart_TypeNever() {
18201839
return Dart_TypeNeverFn();
18211840
}
18221841

1842+
Dart_Handle Dart_TypeString() {
1843+
return Dart_TypeStringFn();
1844+
}
1845+
1846+
Dart_Handle Dart_TypeDouble() {
1847+
return Dart_TypeDoubleFn();
1848+
}
1849+
1850+
Dart_Handle Dart_TypeInt() {
1851+
return Dart_TypeIntFn();
1852+
}
1853+
1854+
Dart_Handle Dart_TypeBoolean() {
1855+
return Dart_TypeBooleanFn();
1856+
}
1857+
1858+
Dart_Handle Dart_TypeObject() {
1859+
return Dart_TypeObjectFn();
1860+
}
1861+
18231862
Dart_Handle Dart_ObjectEquals(Dart_Handle obj1, Dart_Handle obj2, bool* equal) {
18241863
return Dart_ObjectEqualsFn(obj1, obj2, equal);
18251864
}

runtime/include/dart_api.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1892,6 +1892,17 @@ DART_EXPORT Dart_Handle Dart_TypeDynamic(void);
18921892
DART_EXPORT Dart_Handle Dart_TypeVoid(void);
18931893
DART_EXPORT Dart_Handle Dart_TypeNever(void);
18941894

1895+
/**
1896+
* Returns simple core types.
1897+
*
1898+
* \return A handle to type.
1899+
*/
1900+
DART_EXPORT Dart_Handle Dart_TypeString();
1901+
DART_EXPORT Dart_Handle Dart_TypeDouble();
1902+
DART_EXPORT Dart_Handle Dart_TypeInt();
1903+
DART_EXPORT Dart_Handle Dart_TypeBoolean();
1904+
DART_EXPORT Dart_Handle Dart_TypeObject();
1905+
18951906
/**
18961907
* Checks if the two objects are equal.
18971908
*

runtime/tests/vm/dart/exported_symbols_test.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,8 +351,13 @@ main() {
351351
"Dart_True",
352352
"Dart_TypedDataAcquireData",
353353
"Dart_TypedDataReleaseData",
354+
"Dart_TypeBoolean",
355+
"Dart_TypeDouble",
354356
"Dart_TypeDynamic",
357+
"Dart_TypeInt",
355358
"Dart_TypeNever",
359+
"Dart_TypeObject",
360+
"Dart_TypeString",
356361
"Dart_TypeToNonNullableType",
357362
"Dart_TypeToNullableType",
358363
"Dart_TypeVoid",

runtime/vm/dart_api_impl.cc

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2307,6 +2307,41 @@ DART_EXPORT Dart_Handle Dart_TypeNever() {
23072307
return Api::NewHandle(T, Type::NeverType());
23082308
}
23092309

2310+
DART_EXPORT Dart_Handle Dart_TypeString() {
2311+
DARTSCOPE(Thread::Current());
2312+
CHECK_CALLBACK_STATE(T);
2313+
API_TIMELINE_DURATION(T);
2314+
return Api::NewHandle(T, T->isolate_group()->object_store()->string_type());
2315+
}
2316+
2317+
DART_EXPORT Dart_Handle Dart_TypeDouble() {
2318+
DARTSCOPE(Thread::Current());
2319+
CHECK_CALLBACK_STATE(T);
2320+
API_TIMELINE_DURATION(T);
2321+
return Api::NewHandle(T, T->isolate_group()->object_store()->double_type());
2322+
}
2323+
2324+
DART_EXPORT Dart_Handle Dart_TypeInt() {
2325+
DARTSCOPE(Thread::Current());
2326+
CHECK_CALLBACK_STATE(T);
2327+
API_TIMELINE_DURATION(T);
2328+
return Api::NewHandle(T, T->isolate_group()->object_store()->int_type());
2329+
}
2330+
2331+
DART_EXPORT Dart_Handle Dart_TypeBoolean() {
2332+
DARTSCOPE(Thread::Current());
2333+
CHECK_CALLBACK_STATE(T);
2334+
API_TIMELINE_DURATION(T);
2335+
return Api::NewHandle(T, T->isolate_group()->object_store()->bool_type());
2336+
}
2337+
2338+
DART_EXPORT Dart_Handle Dart_TypeObject() {
2339+
DARTSCOPE(Thread::Current());
2340+
CHECK_CALLBACK_STATE(T);
2341+
API_TIMELINE_DURATION(T);
2342+
return Api::NewHandle(T, T->isolate_group()->object_store()->object_type());
2343+
}
2344+
23102345
DART_EXPORT Dart_Handle Dart_ObjectEquals(Dart_Handle obj1,
23112346
Dart_Handle obj2,
23122347
bool* value) {

runtime/vm/dart_api_impl_test.cc

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,6 +1163,64 @@ TEST_CASE(DartAPI_TypeNever) {
11631163
EXPECT_STREQ("Never", cstr);
11641164
}
11651165

1166+
TEST_CASE(DartAPI_CoreTypes) {
1167+
{ // String
1168+
Dart_Handle type = Dart_TypeString();
1169+
EXPECT_VALID(type);
1170+
EXPECT(Dart_IsType(type));
1171+
1172+
Dart_Handle str = Dart_ToString(type);
1173+
EXPECT_VALID(str);
1174+
const char* cstr = nullptr;
1175+
EXPECT_VALID(Dart_StringToCString(str, &cstr));
1176+
EXPECT_STREQ("String", cstr);
1177+
}
1178+
{ // Double
1179+
Dart_Handle type = Dart_TypeDouble();
1180+
EXPECT_VALID(type);
1181+
EXPECT(Dart_IsType(type));
1182+
1183+
Dart_Handle str = Dart_ToString(type);
1184+
EXPECT_VALID(str);
1185+
const char* cstr = nullptr;
1186+
EXPECT_VALID(Dart_StringToCString(str, &cstr));
1187+
EXPECT_STREQ("double", cstr);
1188+
}
1189+
{ // Boolean
1190+
Dart_Handle type = Dart_TypeBoolean();
1191+
EXPECT_VALID(type);
1192+
EXPECT(Dart_IsType(type));
1193+
1194+
Dart_Handle str = Dart_ToString(type);
1195+
EXPECT_VALID(str);
1196+
const char* cstr = nullptr;
1197+
EXPECT_VALID(Dart_StringToCString(str, &cstr));
1198+
EXPECT_STREQ("bool", cstr);
1199+
}
1200+
{ // Int
1201+
Dart_Handle type = Dart_TypeInt();
1202+
EXPECT_VALID(type);
1203+
EXPECT(Dart_IsType(type));
1204+
1205+
Dart_Handle str = Dart_ToString(type);
1206+
EXPECT_VALID(str);
1207+
const char* cstr = nullptr;
1208+
EXPECT_VALID(Dart_StringToCString(str, &cstr));
1209+
EXPECT_STREQ("int", cstr);
1210+
}
1211+
{ // Object
1212+
Dart_Handle type = Dart_TypeObject();
1213+
EXPECT_VALID(type);
1214+
EXPECT(Dart_IsType(type));
1215+
1216+
Dart_Handle str = Dart_ToString(type);
1217+
EXPECT_VALID(str);
1218+
const char* cstr = nullptr;
1219+
EXPECT_VALID(Dart_StringToCString(str, &cstr));
1220+
EXPECT_STREQ("Object", cstr);
1221+
}
1222+
}
1223+
11661224
TEST_CASE(DartAPI_IdentityEquals) {
11671225
Dart_Handle five = Dart_NewInteger(5);
11681226
Dart_Handle five_again = Dart_NewInteger(5);

0 commit comments

Comments
 (0)