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

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

Issue 2267633002: [wasm] asm.js - Check stdlib functions are valid. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 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 | « no previous file | src/asmjs/asm-typer.cc » ('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 c38c0537358b1f5f38606c05af9efcc568fedb2a..fa9ed598cb94c0b3f63524a1deff495a244245f7 100644
--- a/src/asmjs/asm-js.cc
+++ b/src/asmjs/asm-js.cc
@@ -62,10 +62,29 @@ bool IsStdlibMemberValid(i::Isolate* isolate, Handle<JSReceiver> stdlib,
switch (member_kind) {
case wasm::AsmTyper::StandardMember::kNone:
case wasm::AsmTyper::StandardMember::kModule:
- case wasm::AsmTyper::StandardMember::kStdlib: {
+ case wasm::AsmTyper::StandardMember::kStdlib:
+ case wasm::AsmTyper::StandardMember::kHeap:
+ case wasm::AsmTyper::StandardMember::kFFI: {
// Nothing to check for these.
return true;
}
+ case wasm::AsmTyper::StandardMember::kInfinity: {
+ i::Handle<i::Name> name(isolate->factory()->InternalizeOneByteString(
+ STATIC_CHAR_VECTOR("Infinity")));
+ 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->IsNumber()) {
+ return false;
+ }
+ if (!std::isinf(value->Number())) {
+ return false;
+ }
+ return true;
+ }
case wasm::AsmTyper::StandardMember::kNaN: {
i::Handle<i::Name> name(isolate->factory()->InternalizeOneByteString(
STATIC_CHAR_VECTOR("NaN")));
@@ -80,38 +99,95 @@ bool IsStdlibMemberValid(i::Isolate* isolate, Handle<JSReceiver> stdlib,
}
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;
+#define STDLIB_MATH_FUNC(CamelName, fname) \
titzer 2016/08/22 08:41:22 That's a pretty big macro. Can you factor some of
bradn 2016/08/22 16:53:40 Good idea. Done.
+ case wasm::AsmTyper::StandardMember::k##CamelName: { \
+ i::Handle<i::Name> math_name(isolate->factory()->InternalizeOneByteString( \
+ STATIC_CHAR_VECTOR("Math"))); \
+ i::MaybeHandle<i::Object> maybe_math = \
+ i::Object::GetProperty(stdlib, math_name); \
+ if (maybe_math.is_null()) { \
+ return false; \
+ } \
+ i::Handle<i::Object> math = maybe_math.ToHandleChecked(); \
+ if (!math->IsJSReceiver()) { \
+ return false; \
+ } \
+ i::Handle<i::Name> name(isolate->factory()->InternalizeOneByteString( \
+ STATIC_CHAR_VECTOR(#fname))); \
+ i::MaybeHandle<i::Object> maybe_value = \
+ i::Object::GetProperty(math, name); \
+ if (maybe_value.is_null()) { \
+ return false; \
+ } \
+ i::Handle<i::Object> value = maybe_value.ToHandleChecked(); \
+ if (!value->IsJSFunction()) { \
+ return false; \
+ } \
+ i::Handle<i::JSFunction> func(i::JSFunction::cast(*value)); \
+ if (func->shared()->code() != \
+ isolate->builtins()->builtin(Builtins::k##CamelName)) { \
+ return false; \
+ } \
+ return true; \
+ }
+ STDLIB_MATH_FUNC(MathAcos, acos)
+ STDLIB_MATH_FUNC(MathAsin, asin)
+ STDLIB_MATH_FUNC(MathAtan, atan)
+ STDLIB_MATH_FUNC(MathCos, cos)
+ STDLIB_MATH_FUNC(MathSin, sin)
+ STDLIB_MATH_FUNC(MathTan, tan)
+ STDLIB_MATH_FUNC(MathExp, exp)
+ STDLIB_MATH_FUNC(MathLog, log)
+ STDLIB_MATH_FUNC(MathCeil, ceil)
+ STDLIB_MATH_FUNC(MathFloor, floor)
+ STDLIB_MATH_FUNC(MathSqrt, sqrt)
+ STDLIB_MATH_FUNC(MathAbs, abs)
+ STDLIB_MATH_FUNC(MathClz32, clz32)
+ STDLIB_MATH_FUNC(MathMin, min)
+ STDLIB_MATH_FUNC(MathMax, max)
+ STDLIB_MATH_FUNC(MathAtan2, atan2)
+ STDLIB_MATH_FUNC(MathPow, pow)
+ STDLIB_MATH_FUNC(MathImul, imul)
+ STDLIB_MATH_FUNC(MathFround, fround)
+#undef STDLIB_MATH_FUNC
+#define STDLIB_MATH_CONST(cname, const_value) \
+ case wasm::AsmTyper::StandardMember::kMath##cname: { \
+ i::Handle<i::Name> math_name(isolate->factory()->InternalizeOneByteString( \
+ STATIC_CHAR_VECTOR("Math"))); \
+ i::MaybeHandle<i::Object> maybe_math = \
+ i::Object::GetProperty(stdlib, math_name); \
+ if (maybe_math.is_null()) { \
+ return false; \
+ } \
+ i::Handle<i::Object> math = maybe_math.ToHandleChecked(); \
+ if (!math->IsJSReceiver()) { \
+ return false; \
+ } \
+ i::Handle<i::Name> name(isolate->factory()->InternalizeOneByteString( \
+ STATIC_CHAR_VECTOR(#cname))); \
+ i::MaybeHandle<i::Object> maybe_value = \
+ i::Object::GetProperty(math, name); \
+ if (maybe_value.is_null()) { \
+ return false; \
+ } \
+ i::Handle<i::Object> value = maybe_value.ToHandleChecked(); \
+ if (!value->IsNumber()) { \
+ return false; \
+ } \
+ if (value->Number() != const_value) { \
+ return false; \
+ } \
+ return true; \
+ }
+ STDLIB_MATH_CONST(E, 2.718281828459045)
+ STDLIB_MATH_CONST(LN10, 2.302585092994046)
+ STDLIB_MATH_CONST(LN2, 0.6931471805599453)
+ STDLIB_MATH_CONST(LOG2E, 1.4426950408889634)
+ STDLIB_MATH_CONST(LOG10E, 0.4342944819032518)
+ STDLIB_MATH_CONST(PI, 3.141592653589793)
+ STDLIB_MATH_CONST(SQRT1_2, 0.7071067811865476)
+ STDLIB_MATH_CONST(SQRT2, 1.4142135623730951)
+#undef STDLIB_MATH_CONST
default: { UNREACHABLE(); }
}
return false;
« no previous file with comments | « no previous file | src/asmjs/asm-typer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698