Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(623)

Unified Diff: src/wasm/wasm-module-builder.cc

Issue 2757693003: [wasm][asm.js] Asm.js -> wasm custom parser. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/wasm/wasm-module-builder.cc
diff --git a/src/wasm/wasm-module-builder.cc b/src/wasm/wasm-module-builder.cc
index 6b7f9104ac47abd4e8391079f4804b7a0835e537..4c2f6cbe6a2312a1b45fff5c99897021e9895290 100644
--- a/src/wasm/wasm-module-builder.cc
+++ b/src/wasm/wasm-module-builder.cc
@@ -185,6 +185,20 @@ void WasmFunctionBuilder::SetAsmFunctionStartPosition(int position) {
last_asm_source_position_ = position;
}
+void WasmFunctionBuilder::StashCode(std::vector<byte>* dst, size_t position) {
vogelheim 2017/03/17 17:27:07 This method would probably benefit from hosting th
bradn 2017/03/24 03:58:19 Done.
+ size_t len = body_.size() - position;
+ if (dst != nullptr) {
+ dst->resize(body_.size() - position);
vogelheim 2017/03/17 17:27:07 dst->resize(len) ?
bradn 2017/03/24 03:58:19 Done.
+ }
+ if (len == 0) {
+ return;
+ }
+ if (dst != nullptr) {
+ memcpy(dst->data(), &body_[position], len);
+ }
+ body_.resize(position);
+}
+
void WasmFunctionBuilder::WriteSignature(ZoneBuffer& buffer) const {
buffer.write_u32v(signature_index_);
}
@@ -194,8 +208,8 @@ void WasmFunctionBuilder::WriteExports(ZoneBuffer& buffer) const {
buffer.write_size(name.size());
buffer.write(reinterpret_cast<const byte*>(name.data()), name.size());
buffer.write_u8(kExternalFunction);
- buffer.write_u32v(func_index_ +
- static_cast<uint32_t>(builder_->imports_.size()));
+ buffer.write_u32v(func_index_ + static_cast<uint32_t>(
+ builder_->function_imports_.size()));
}
}
@@ -212,7 +226,8 @@ void WasmFunctionBuilder::WriteBody(ZoneBuffer& buffer) const {
for (DirectCallIndex call : direct_calls_) {
buffer.patch_u32v(
base + call.offset,
- call.direct_index + static_cast<uint32_t>(builder_->imports_.size()));
+ call.direct_index +
+ static_cast<uint32_t>(builder_->function_imports_.size()));
}
}
}
@@ -237,7 +252,8 @@ void WasmFunctionBuilder::WriteAsmWasmOffsetTable(ZoneBuffer& buffer) const {
WasmModuleBuilder::WasmModuleBuilder(Zone* zone)
: zone_(zone),
signatures_(zone),
- imports_(zone),
+ function_imports_(zone),
+ global_imports_(zone),
functions_(zone),
data_segments_(zone),
indirect_functions_(zone),
@@ -303,8 +319,15 @@ void WasmModuleBuilder::SetIndirectFunction(uint32_t indirect,
uint32_t WasmModuleBuilder::AddImport(const char* name, int name_length,
FunctionSig* sig) {
- imports_.push_back({AddSignature(sig), name, name_length});
- return static_cast<uint32_t>(imports_.size() - 1);
+ function_imports_.push_back({AddSignature(sig), name, name_length});
+ return static_cast<uint32_t>(function_imports_.size() - 1);
+}
+
+uint32_t WasmModuleBuilder::AddGlobalImport(const char* name, int name_length,
+ ValueType type) {
+ global_imports_.push_back(
+ {WasmOpcodes::ValueTypeCodeFor(type), name, name_length});
+ return static_cast<uint32_t>(global_imports_.size() - 1);
}
void WasmModuleBuilder::MarkStartFunction(WasmFunctionBuilder* function) {
@@ -346,10 +369,19 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const {
}
// == Emit imports ===========================================================
- if (imports_.size() > 0) {
+ if (global_imports_.size() + function_imports_.size() > 0) {
size_t start = EmitSection(kImportSectionCode, buffer);
- buffer.write_size(imports_.size());
- for (auto import : imports_) {
+ buffer.write_size(global_imports_.size() + function_imports_.size());
+ for (auto import : global_imports_) {
+ buffer.write_u32v(0); // module name length
+ buffer.write_u32v(import.name_length); // field name length
+ buffer.write(reinterpret_cast<const byte*>(import.name), // field name
+ import.name_length);
+ buffer.write_u8(kExternalGlobal);
+ buffer.write_u8(import.type_code);
+ buffer.write_u8(0); // immutable
+ }
+ for (auto import : function_imports_) {
buffer.write_u32v(0); // module name length
buffer.write_u32v(import.name_length); // field name length
buffer.write(reinterpret_cast<const byte*>(import.name), // field name
@@ -478,7 +510,7 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const {
if (start_function_index_ >= 0) {
size_t start = EmitSection(kStartSectionCode, buffer);
buffer.write_u32v(start_function_index_ +
- static_cast<uint32_t>(imports_.size()));
+ static_cast<uint32_t>(function_imports_.size()));
FixupSection(buffer, start);
}
@@ -493,7 +525,8 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const {
buffer.write_size(indirect_functions_.size()); // element count
for (auto index : indirect_functions_) {
- buffer.write_u32v(index + static_cast<uint32_t>(imports_.size()));
+ buffer.write_u32v(index +
+ static_cast<uint32_t>(function_imports_.size()));
}
FixupSection(buffer, start);
@@ -535,9 +568,9 @@ void WasmModuleBuilder::WriteTo(ZoneBuffer& buffer) const {
buffer.write_size(4);
buffer.write(reinterpret_cast<const byte*>("name"), 4);
// Emit the names.
- size_t count = functions_.size() + imports_.size();
+ size_t count = functions_.size() + function_imports_.size();
buffer.write_size(count);
- for (size_t i = 0; i < imports_.size(); i++) {
+ for (size_t i = 0; i < function_imports_.size(); i++) {
buffer.write_u8(0); // empty name for import
buffer.write_u8(0); // no local variables
}

Powered by Google App Engine
This is Rietveld 408576698