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

Unified Diff: src/asmjs/asm-js.cc

Issue 2251433002: [wasm] asm.js - Check stdlib.NaN is valid, prepare for the rest. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix Created 4 years, 4 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
« no previous file with comments | « src/asmjs/asm-js.h ('k') | src/asmjs/asm-typer.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/asmjs/asm-js.cc
diff --git a/src/asmjs/asm-js.cc b/src/asmjs/asm-js.cc
index cb44ec237a2f3c48267d1d834fb3b6a2ee4b867f..c38c0537358b1f5f38606c05af9efcc568fedb2a 100644
--- a/src/asmjs/asm-js.cc
+++ b/src/asmjs/asm-js.cc
@@ -53,6 +53,70 @@ i::MaybeHandle<i::FixedArray> CompileModule(
return compiled_module;
}
+bool IsStdlibMemberValid(i::Isolate* isolate, Handle<JSReceiver> stdlib,
+ i::Handle<i::Object> member_id) {
+ int32_t member_kind;
+ if (!member_id->ToInt32(&member_kind)) {
+ UNREACHABLE();
+ }
+ switch (member_kind) {
+ case wasm::AsmTyper::StandardMember::kNone:
+ case wasm::AsmTyper::StandardMember::kModule:
+ case wasm::AsmTyper::StandardMember::kStdlib: {
+ // Nothing to check for these.
+ return true;
+ }
+ case wasm::AsmTyper::StandardMember::kNaN: {
+ i::Handle<i::Name> name(isolate->factory()->InternalizeOneByteString(
+ STATIC_CHAR_VECTOR("NaN")));
+ i::MaybeHandle<i::Object> maybe_value =
+ i::Object::GetProperty(stdlib, name);
+ if (maybe_value.is_null()) {
+ return false;
+ }
+ i::Handle<i::Object> value = maybe_value.ToHandleChecked();
+ if (!value->IsNaN()) {
+ return false;
+ }
+ return true;
+ }
+ case wasm::AsmTyper::StandardMember::kHeap:
+ case wasm::AsmTyper::StandardMember::kFFI:
+ case wasm::AsmTyper::StandardMember::kInfinity:
+ case wasm::AsmTyper::StandardMember::kMathAcos:
+ case wasm::AsmTyper::StandardMember::kMathAsin:
+ case wasm::AsmTyper::StandardMember::kMathAtan:
+ case wasm::AsmTyper::StandardMember::kMathCos:
+ case wasm::AsmTyper::StandardMember::kMathSin:
+ case wasm::AsmTyper::StandardMember::kMathTan:
+ case wasm::AsmTyper::StandardMember::kMathExp:
+ case wasm::AsmTyper::StandardMember::kMathLog:
+ case wasm::AsmTyper::StandardMember::kMathCeil:
+ case wasm::AsmTyper::StandardMember::kMathFloor:
+ case wasm::AsmTyper::StandardMember::kMathSqrt:
+ case wasm::AsmTyper::StandardMember::kMathAbs:
+ case wasm::AsmTyper::StandardMember::kMathClz32:
+ case wasm::AsmTyper::StandardMember::kMathMin:
+ case wasm::AsmTyper::StandardMember::kMathMax:
+ case wasm::AsmTyper::StandardMember::kMathAtan2:
+ case wasm::AsmTyper::StandardMember::kMathPow:
+ case wasm::AsmTyper::StandardMember::kMathImul:
+ case wasm::AsmTyper::StandardMember::kMathFround:
+ case wasm::AsmTyper::StandardMember::kMathE:
+ case wasm::AsmTyper::StandardMember::kMathLN10:
+ case wasm::AsmTyper::StandardMember::kMathLN2:
+ case wasm::AsmTyper::StandardMember::kMathLOG2E:
+ case wasm::AsmTyper::StandardMember::kMathLOG10E:
+ case wasm::AsmTyper::StandardMember::kMathPI:
+ case wasm::AsmTyper::StandardMember::kMathSQRT1_2:
+ case wasm::AsmTyper::StandardMember::kMathSQRT2:
+ // TODO(bradnelson) Actually check these.
+ return true;
+ default: { UNREACHABLE(); }
+ }
+ return false;
+}
+
} // namespace
MaybeHandle<FixedArray> AsmJs::ConvertAsmToWasm(ParseInfo* info) {
@@ -74,16 +138,37 @@ MaybeHandle<FixedArray> AsmJs::ConvertAsmToWasm(ParseInfo* info) {
internal::wasm::kAsmJsOrigin);
DCHECK(!compiled.is_null());
- Handle<FixedArray> result = info->isolate()->factory()->NewFixedArray(2);
+ wasm::AsmTyper::StdlibSet uses = typer.StdlibUses();
+ Handle<FixedArray> uses_array =
+ info->isolate()->factory()->NewFixedArray(static_cast<int>(uses.size()));
+ int count = 0;
+ for (auto i : uses) {
+ uses_array->set(count++, Smi::FromInt(i));
+ }
+
+ Handle<FixedArray> result = info->isolate()->factory()->NewFixedArray(3);
result->set(0, *compiled.ToHandleChecked());
result->set(1, *foreign_globals);
+ result->set(2, *uses_array);
return result;
}
+bool AsmJs::IsStdlibValid(i::Isolate* isolate, Handle<FixedArray> wasm_data,
+ Handle<JSReceiver> stdlib) {
+ i::Handle<i::FixedArray> uses(i::FixedArray::cast(wasm_data->get(2)));
+ for (int i = 0; i < uses->length(); ++i) {
+ if (!IsStdlibMemberValid(isolate, stdlib,
+ uses->GetValueChecked<i::Object>(isolate, i))) {
+ return false;
+ }
+ }
+ return true;
+}
+
MaybeHandle<Object> AsmJs::InstantiateAsmWasm(i::Isolate* isolate,
Handle<FixedArray> wasm_data,
Handle<JSArrayBuffer> memory,
- Handle<JSObject> foreign) {
+ Handle<JSReceiver> foreign) {
i::Handle<i::FixedArray> compiled(i::FixedArray::cast(wasm_data->get(0)));
i::Handle<i::FixedArray> foreign_globals(
i::FixedArray::cast(wasm_data->get(1)));
« no previous file with comments | « src/asmjs/asm-js.h ('k') | src/asmjs/asm-typer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698