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

Unified Diff: src/compiler/wasm-compiler.cc

Issue 2254803002: [wasm] Throw a type error if an I64 is exported to JS. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove IfSuccess nodes for now. 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/messages.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/wasm-compiler.cc
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc
index b457efec4ec3e0e34ddd7305b16f1539a29fc631..07df3857d3df057fdf3a9b3be4549c5296b240af 100644
--- a/src/compiler/wasm-compiler.cc
+++ b/src/compiler/wasm-compiler.cc
@@ -63,6 +63,39 @@ void MergeControlToEnd(JSGraph* jsgraph, Node* node) {
}
}
+Node* BuildCallToRuntime(Runtime::FunctionId f, JSGraph* jsgraph,
+ Handle<Context> context, Node** parameters,
+ int parameter_count, Node** effect_ptr,
+ Node** control_ptr) {
+ // At the moment we only allow 2 parameters. If more parameters are needed,
+ // then the size of {inputs} below has to be increased accordingly.
+ DCHECK(parameter_count <= 2);
+ const Runtime::Function* fun = Runtime::FunctionForId(f);
+ CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor(
+ jsgraph->zone(), f, fun->nargs, Operator::kNoProperties,
+ CallDescriptor::kNoFlags);
+ // CEntryStubConstant nodes have to be created and cached in the main
+ // thread. At the moment this is only done for CEntryStubConstant(1).
+ DCHECK_EQ(1, fun->result_size);
+ Node* inputs[8];
+ int count = 0;
+ inputs[count++] = jsgraph->CEntryStubConstant(fun->result_size);
+ for (int i = 0; i < parameter_count; i++) {
+ inputs[count++] = parameters[i];
+ }
+ inputs[count++] = jsgraph->ExternalConstant(
+ ExternalReference(f, jsgraph->isolate())); // ref
+ inputs[count++] = jsgraph->Int32Constant(fun->nargs); // arity
+ inputs[count++] = jsgraph->HeapConstant(context); // context
+ inputs[count++] = *effect_ptr;
+ inputs[count++] = *control_ptr;
+
+ Node* node =
+ jsgraph->graph()->NewNode(jsgraph->common()->Call(desc), count, inputs);
+ *effect_ptr = node;
+ return node;
+}
+
} // namespace
// A helper that handles building graph fragments for trapping.
@@ -226,30 +259,11 @@ class WasmTrapHelper : public ZoneObject {
Node* trap_position_smi = builder_->BuildChangeInt32ToSmi(trap_position_);
if (module && !module->instance->context.is_null()) {
- // Use the module context to call the runtime to throw an exception.
- Runtime::FunctionId f = Runtime::kThrowWasmError;
- const Runtime::Function* fun = Runtime::FunctionForId(f);
- CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor(
- jsgraph()->zone(), f, fun->nargs, Operator::kNoProperties,
- CallDescriptor::kNoFlags);
- // CEntryStubConstant nodes have to be created and cached in the main
- // thread. At the moment this is only done for CEntryStubConstant(1).
- DCHECK_EQ(1, fun->result_size);
- Node* inputs[] = {
- jsgraph()->CEntryStubConstant(fun->result_size), // C entry
- trap_reason_smi, // message id
- trap_position_smi, // byte position
- jsgraph()->ExternalConstant(
- ExternalReference(f, jsgraph()->isolate())), // ref
- jsgraph()->Int32Constant(fun->nargs), // arity
- builder_->HeapConstant(module->instance->context), // context
- *effect_ptr,
- *control_ptr};
-
- Node* node = graph()->NewNode(
- common()->Call(desc), static_cast<int>(arraysize(inputs)), inputs);
- *effect_ptr = node;
- *control_ptr = graph()->NewNode(common()->IfSuccess(), node);
+ Node* parameters[] = {trap_reason_smi, // message id
+ trap_position_smi}; // byte position
+ BuildCallToRuntime(Runtime::kThrowWasmError, jsgraph(),
+ module->instance->context, parameters,
+ arraysize(parameters), effect_ptr, control_ptr);
}
if (false) {
// End the control flow with a throw
@@ -2187,15 +2201,11 @@ Node* WasmGraphBuilder::ToJS(Node* node, wasm::LocalType type) {
case wasm::kAstI32:
return BuildChangeInt32ToTagged(node);
case wasm::kAstI64:
- // TODO(titzer): i64->JS has no good solution right now. Using lower 32
- // bits.
- if (jsgraph()->machine()->Is64()) {
- // On 32 bit platforms we do not have to do the truncation because the
- // node we get in as a parameter only contains the low word anyways.
- node = graph()->NewNode(jsgraph()->machine()->TruncateInt64ToInt32(),
- node);
- }
- return BuildChangeInt32ToTagged(node);
+ DCHECK(module_ && !module_->instance->context.is_null());
+ // Throw a TypeError.
+ return BuildCallToRuntime(Runtime::kWasmThrowTypeError, jsgraph(),
+ module_->instance->context, nullptr, 0, effect_,
+ control_);
case wasm::kAstF32:
node = graph()->NewNode(jsgraph()->machine()->ChangeFloat32ToFloat64(),
node);
@@ -2222,7 +2232,6 @@ Node* WasmGraphBuilder::BuildJavaScriptToNumber(Node* node, Node* context,
node, context, effect, control);
*effect_ = result;
- *control_ = graph()->NewNode(jsgraph()->common()->IfSuccess(), result);
return result;
}
« no previous file with comments | « no previous file | src/messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698