| Index: src/runtime/runtime-wasm.cc
|
| diff --git a/src/runtime/runtime-wasm.cc b/src/runtime/runtime-wasm.cc
|
| index 3ed63879add0dd24a128c273ff0075f92070f276..2e579753363e5aedb322ebc9b0d5e23a8caafafb 100644
|
| --- a/src/runtime/runtime-wasm.cc
|
| +++ b/src/runtime/runtime-wasm.cc
|
| @@ -12,6 +12,7 @@
|
| #include "src/factory.h"
|
| #include "src/frames-inl.h"
|
| #include "src/objects-inl.h"
|
| +#include "src/runtime/runtime.h"
|
| #include "src/v8memory.h"
|
| #include "src/wasm/wasm-module.h"
|
| #include "src/wasm/wasm-objects.h"
|
| @@ -21,7 +22,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 +31,7 @@ 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;
|
| }
|
| } // namespace
|
|
|
| @@ -38,7 +39,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 +49,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));
|
| }
|
| @@ -161,7 +164,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 +180,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);
|
| + // Set the current isolate's context.
|
| isolate->set_context(*instance->compiled_module()->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.
|
| + WasmInstanceObject* instance = GetWasmInstanceOnStackTop(isolate);
|
| + isolate->set_context(instance->compiled_module()->ptr_to_native_context());
|
| +
|
| + // 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
|
|
|