Skip to content

Commit 7505b3a

Browse files
liamappelbecommit-bot@chromium.org
authored andcommitted
[vm] Boilerplate for wasm types.
Follow up to https://dart-review.googlesource.com/c/sdk/+/117210, which was a quick fix to get the bots green. Since I've cut the FFI dependency for the native type markers, wasm.cc needs to switch to using these new classes, and we need boilerplate to associate them with some CIDs. Bug: #37882 Change-Id: Ic64de8fd08b8a84476aeaacae3f57af3f278b8c9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/117292 Reviewed-by: Alexander Markov <[email protected]> Commit-Queue: Liam Appelbe <[email protected]>
1 parent 4adbc8f commit 7505b3a

File tree

6 files changed

+78
-21
lines changed

6 files changed

+78
-21
lines changed

runtime/lib/wasm.cc

+21-21
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,22 @@ static bool ToWasmValue(const Number& value,
4646
classid_t type,
4747
wasmer_value_t* out) {
4848
switch (type) {
49-
case kFfiInt32Cid:
49+
case kWasmInt32Cid:
5050
if (!value.IsInteger()) return false;
5151
out->tag = wasmer_value_tag::WASM_I32;
5252
out->value.I32 = Integer::Cast(value).AsInt64Value();
5353
return true;
54-
case kFfiInt64Cid:
54+
case kWasmInt64Cid:
5555
if (!value.IsInteger()) return false;
5656
out->tag = wasmer_value_tag::WASM_I64;
5757
out->value.I64 = Integer::Cast(value).AsInt64Value();
5858
return true;
59-
case kFfiFloatCid:
59+
case kWasmFloatCid:
6060
if (!value.IsDouble()) return false;
6161
out->tag = wasmer_value_tag::WASM_F32;
6262
out->value.F32 = Double::Cast(value).value();
6363
return true;
64-
case kFfiDoubleCid:
64+
case kWasmDoubleCid:
6565
if (!value.IsDouble()) return false;
6666
out->tag = wasmer_value_tag::WASM_F64;
6767
out->value.F64 = Double::Cast(value).value();
@@ -137,7 +137,7 @@ class WasmMemory {
137137

138138
class WasmImports {
139139
public:
140-
WasmImports(std::unique_ptr<char[]> module_name)
140+
explicit WasmImports(std::unique_ptr<char[]> module_name)
141141
: _module_name(std::move(module_name)) {}
142142

143143
~WasmImports() {
@@ -195,7 +195,7 @@ class WasmFunction {
195195
classid_t ret,
196196
const wasmer_export_func_t* fn)
197197
: _args(std::move(args)), _ret(ret), _fn(fn) {}
198-
bool IsVoid() const { return _ret == kFfiVoidCid; }
198+
bool IsVoid() const { return _ret == kWasmVoidCid; }
199199
const MallocGrowableArray<classid_t>& args() const { return _args; }
200200

201201
bool SignatureMatches(const MallocGrowableArray<classid_t>& dart_args,
@@ -219,11 +219,11 @@ class WasmFunction {
219219
}
220220

221221
void Print(std::ostream& o, const char* name) const {
222-
PrintFfiType(o, _ret);
222+
PrintDartType(o, _ret);
223223
o << ' ' << name << '(';
224224
for (intptr_t i = 0; i < _args.length(); ++i) {
225225
if (i > 0) o << ", ";
226-
PrintFfiType(o, _args[i]);
226+
PrintDartType(o, _args[i]);
227227
}
228228
o << ')';
229229
}
@@ -233,21 +233,21 @@ class WasmFunction {
233233
const classid_t _ret;
234234
const wasmer_export_func_t* _fn;
235235

236-
static void PrintFfiType(std::ostream& o, classid_t type) {
236+
static void PrintDartType(std::ostream& o, classid_t type) {
237237
switch (type) {
238-
case kFfiInt32Cid:
238+
case kWasmInt32Cid:
239239
o << "i32";
240240
break;
241-
case kFfiInt64Cid:
241+
case kWasmInt64Cid:
242242
o << "i64";
243243
break;
244-
case kFfiFloatCid:
244+
case kWasmFloatCid:
245245
o << "f32";
246246
break;
247-
case kFfiDoubleCid:
247+
case kWasmDoubleCid:
248248
o << "f64";
249249
break;
250-
case kFfiVoidCid:
250+
case kWasmVoidCid:
251251
o << "void";
252252
break;
253253
}
@@ -317,16 +317,16 @@ class WasmInstance {
317317
wasmer_exports_t* _exports;
318318
MallocDirectChainedHashMap<CStringKeyValueTrait<WasmFunction*>> _functions;
319319

320-
static classid_t ToFfiType(wasmer_value_tag wasm_type) {
320+
static classid_t ToDartType(wasmer_value_tag wasm_type) {
321321
switch (wasm_type) {
322322
case wasmer_value_tag::WASM_I32:
323-
return kFfiInt32Cid;
323+
return kWasmInt32Cid;
324324
case wasmer_value_tag::WASM_I64:
325-
return kFfiInt64Cid;
325+
return kWasmInt64Cid;
326326
case wasmer_value_tag::WASM_F32:
327-
return kFfiFloatCid;
327+
return kWasmFloatCid;
328328
case wasmer_value_tag::WASM_F64:
329-
return kFfiDoubleCid;
329+
return kWasmDoubleCid;
330330
}
331331
FATAL("Unknown WASM type");
332332
return 0;
@@ -340,7 +340,7 @@ class WasmInstance {
340340
ASSERT(num_rets <= 1);
341341
wasmer_value_tag wasm_ret;
342342
ThrowIfFailed(wasmer_export_func_returns(fn, &wasm_ret, num_rets));
343-
classid_t ret = num_rets == 0 ? kFfiVoidCid : ToFfiType(wasm_ret);
343+
classid_t ret = num_rets == 0 ? kWasmVoidCid : ToDartType(wasm_ret);
344344

345345
uint32_t num_args;
346346
ThrowIfFailed(wasmer_export_func_params_arity(fn, &num_args));
@@ -349,7 +349,7 @@ class WasmInstance {
349349
ThrowIfFailed(wasmer_export_func_params(fn, wasm_args.get(), num_args));
350350
MallocGrowableArray<classid_t> args;
351351
for (intptr_t i = 0; i < num_args; ++i) {
352-
args.Add(ToFfiType(wasm_args[i]));
352+
args.Add(ToDartType(wasm_args[i]));
353353
}
354354

355355
wasmer_byte_array name_bytes = wasmer_export_name(exp);

runtime/lib/wasm_patch.dart

+20
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,26 @@ import 'dart:_internal' show patch;
66
import "dart:nativewrappers" show NativeFieldWrapperClass1;
77
import 'dart:typed_data';
88

9+
@patch
10+
@pragma("vm:entry-point")
11+
class Int32 {}
12+
13+
@patch
14+
@pragma("vm:entry-point")
15+
class Int64 {}
16+
17+
@patch
18+
@pragma("vm:entry-point")
19+
class Float {}
20+
21+
@patch
22+
@pragma("vm:entry-point")
23+
class Double {}
24+
25+
@patch
26+
@pragma("vm:entry-point")
27+
class Void {}
28+
929
@patch
1030
class WasmModule {
1131
@patch

runtime/vm/class_id.h

+11
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,13 @@ namespace dart {
131131
V(DynamicLibrary) \
132132
V(Struct)
133133

134+
#define CLASS_LIST_WASM(V) \
135+
V(WasmInt32) \
136+
V(WasmInt64) \
137+
V(WasmFloat) \
138+
V(WasmDouble) \
139+
V(WasmVoid)
140+
134141
#define DART_CLASS_LIST_TYPED_DATA(V) \
135142
V(Int8) \
136143
V(Uint8) \
@@ -182,6 +189,10 @@ enum ClassId {
182189
CLASS_LIST_FFI(DEFINE_OBJECT_KIND)
183190
#undef DEFINE_OBJECT_KIND
184191

192+
#define DEFINE_OBJECT_KIND(clazz) k##clazz##Cid,
193+
CLASS_LIST_WASM(DEFINE_OBJECT_KIND)
194+
#undef DEFINE_OBJECT_KIND
195+
185196
#define DEFINE_OBJECT_KIND(clazz) \
186197
kTypedData##clazz##Cid, \
187198
kTypedData##clazz##ViewCid, \

runtime/vm/object.cc

+14
Original file line numberDiff line numberDiff line change
@@ -1931,6 +1931,15 @@ RawError* Object::Init(Isolate* isolate,
19311931
}
19321932
object_store->set_bootstrap_library(ObjectStore::kWasm, lib);
19331933

1934+
#define REGISTER_WASM_TYPE(clazz) \
1935+
cls = Class::New<Instance>(k##clazz##Cid, isolate); \
1936+
cls.set_num_type_arguments(0); \
1937+
cls.set_is_prefinalized(); \
1938+
pending_classes.Add(cls); \
1939+
RegisterClass(cls, Symbols::clazz(), lib);
1940+
CLASS_LIST_WASM(REGISTER_WASM_TYPE);
1941+
#undef REGISTER_WASM_TYPE
1942+
19341943
// Finish the initialization by compiling the bootstrap scripts containing
19351944
// the base interfaces and the implementation of the internal classes.
19361945
const Error& error = Error::Handle(
@@ -2025,6 +2034,11 @@ RawError* Object::Init(Isolate* isolate,
20252034
CLASS_LIST_FFI_TYPE_MARKER(REGISTER_FFI_CLASS);
20262035
#undef REGISTER_FFI_CLASS
20272036

2037+
#define REGISTER_WASM_CLASS(clazz) \
2038+
cls = Class::New<Instance>(k##clazz##Cid, isolate);
2039+
CLASS_LIST_WASM(REGISTER_WASM_CLASS);
2040+
#undef REGISTER_WASM_CLASS
2041+
20282042
cls = Class::New<Instance>(kFfiNativeFunctionCid, isolate);
20292043

20302044
cls = Class::NewPointerClass(kFfiPointerCid, isolate);

runtime/vm/raw_object.cc

+7
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,13 @@ intptr_t RawObject::VisitPointersPredefined(ObjectPointerVisitor* visitor,
319319
size = HeapSize();
320320
break;
321321
}
322+
#undef RAW_VISITPOINTERS
323+
#define RAW_VISITPOINTERS(clazz) case k##clazz##Cid:
324+
CLASS_LIST_WASM(RAW_VISITPOINTERS) {
325+
// These wasm types do not have any fields or type arguments.
326+
size = HeapSize();
327+
break;
328+
}
322329
#undef RAW_VISITPOINTERS
323330
case kFreeListElement: {
324331
uword addr = RawObject::ToAddr(this);

runtime/vm/symbols.h

+5
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,11 @@ class ObjectPointerVisitor;
284284
V(UnwindError, "UnwindError") \
285285
V(Value, "value") \
286286
V(Values, "values") \
287+
V(WasmInt32, "Int32") \
288+
V(WasmInt64, "Int64") \
289+
V(WasmFloat, "Float") \
290+
V(WasmDouble, "Double") \
291+
V(WasmVoid, "Void") \
287292
V(YieldKw, "yield") \
288293
V(_AsyncAwaitCompleter, "_AsyncAwaitCompleter") \
289294
V(_AsyncAwaitCompleterConstructor, "_AsyncAwaitCompleter.") \

0 commit comments

Comments
 (0)