Index: src/runtime/runtime-wasm.cc |
diff --git a/src/runtime/runtime-wasm.cc b/src/runtime/runtime-wasm.cc |
index 3ed63879add0dd24a128c273ff0075f92070f276..61ba1f7a3d1b868d501c24e4037198cd1b55f8c5 100644 |
--- a/src/runtime/runtime-wasm.cc |
+++ b/src/runtime/runtime-wasm.cc |
@@ -21,7 +21,7 @@ namespace v8 { |
namespace internal { |
namespace { |
-Handle<WasmInstanceObject> GetWasmInstanceOnStackTop(Isolate* isolate) { |
+WasmInstanceObject* GetWasmInstanceOnStackTop(Isolate* isolate) { |
DisallowHeapAllocation no_allocation; |
const Address entry = Isolate::c_entry_fp(isolate->thread_local_top()); |
Address pc = |
@@ -30,7 +30,12 @@ Handle<WasmInstanceObject> GetWasmInstanceOnStackTop(Isolate* isolate) { |
DCHECK_EQ(Code::WASM_FUNCTION, code->kind()); |
WasmInstanceObject* owning_instance = wasm::GetOwningWasmInstance(code); |
CHECK_NOT_NULL(owning_instance); |
- return handle(owning_instance, isolate); |
+ return owning_instance; |
+} |
+Context* GetWasmContextOnStackTop(Isolate* isolate) { |
+ return GetWasmInstanceOnStackTop(isolate) |
+ ->compiled_module() |
+ ->ptr_to_native_context(); |
} |
} // namespace |
@@ -38,7 +43,8 @@ RUNTIME_FUNCTION(Runtime_WasmMemorySize) { |
HandleScope scope(isolate); |
DCHECK_EQ(0, args.length()); |
- Handle<WasmInstanceObject> instance = GetWasmInstanceOnStackTop(isolate); |
+ Handle<WasmInstanceObject> instance(GetWasmInstanceOnStackTop(isolate), |
+ isolate); |
return *isolate->factory()->NewNumberFromInt( |
wasm::GetInstanceMemorySize(isolate, instance)); |
} |
@@ -47,7 +53,8 @@ RUNTIME_FUNCTION(Runtime_WasmGrowMemory) { |
HandleScope scope(isolate); |
DCHECK_EQ(1, args.length()); |
CONVERT_UINT32_ARG_CHECKED(delta_pages, 0); |
- Handle<WasmInstanceObject> instance = GetWasmInstanceOnStackTop(isolate); |
+ Handle<WasmInstanceObject> instance(GetWasmInstanceOnStackTop(isolate), |
+ isolate); |
return *isolate->factory()->NewNumberFromInt( |
wasm::GrowMemory(isolate, instance, delta_pages)); |
} |
@@ -56,13 +63,7 @@ Object* ThrowRuntimeError(Isolate* isolate, int message_id, int byte_offset, |
bool patch_source_position) { |
HandleScope scope(isolate); |
DCHECK_NULL(isolate->context()); |
- StackFrameIterator it(isolate); |
- it.Advance(); |
- CHECK(it.frame()->is_wasm_compiled()); |
- isolate->set_context(*WasmCompiledFrame::cast(it.frame()) |
- ->wasm_instance() |
- ->compiled_module() |
- ->native_context()); |
+ isolate->set_context(GetWasmContextOnStackTop(isolate)); |
Handle<Object> error_obj = isolate->factory()->NewWasmRuntimeError( |
static_cast<MessageTemplate::Template>(message_id)); |
@@ -161,7 +162,7 @@ RUNTIME_FUNCTION(Runtime_WasmGetCaughtExceptionValue) { |
} |
RUNTIME_FUNCTION(Runtime_WasmRunInterpreter) { |
- DCHECK(args.length() == 3); |
+ DCHECK_EQ(3, args.length()); |
HandleScope scope(isolate); |
CONVERT_ARG_HANDLE_CHECKED(JSObject, instance_obj, 0); |
CONVERT_NUMBER_CHECKED(int32_t, func_index, Int32, args[1]); |
@@ -177,13 +178,27 @@ RUNTIME_FUNCTION(Runtime_WasmRunInterpreter) { |
CHECK(arg_buffer_obj->IsSmi()); |
uint8_t* arg_buffer = reinterpret_cast<uint8_t*>(*arg_buffer_obj); |
- // Set the current isolate's context, saving the previous one. |
- SaveContext save(isolate); |
- isolate->set_context(*instance->compiled_module()->native_context()); |
+ DCHECK_EQ(isolate->context(), |
+ instance->compiled_module()->ptr_to_native_context()); |
instance->debug_info()->RunInterpreter(func_index, arg_buffer); |
return isolate->heap()->undefined_value(); |
} |
+RUNTIME_FUNCTION(Runtime_WasmStackGuard) { |
+ SealHandleScope shs(isolate); |
+ DCHECK_EQ(0, args.length()); |
+ |
+ // Set the current isolate's context. |
+ DCHECK_NULL(isolate->context()); |
+ isolate->set_context(GetWasmContextOnStackTop(isolate)); |
+ |
+ // Check if this is a real stack overflow. |
+ StackLimitCheck check(isolate); |
+ if (check.JsHasOverflowed()) return isolate->StackOverflow(); |
+ |
+ return isolate->stack_guard()->HandleInterrupts(); |
+} |
+ |
} // namespace internal |
} // namespace v8 |