| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/assembler.h" | 8 #include "src/assembler.h" |
| 9 #include "src/compiler/wasm-compiler.h" | 9 #include "src/compiler/wasm-compiler.h" |
| 10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 return *isolate->factory()->NewNumberFromInt( | 48 return *isolate->factory()->NewNumberFromInt( |
| 49 wasm::GetInstanceMemorySize(isolate, instance)); | 49 wasm::GetInstanceMemorySize(isolate, instance)); |
| 50 } | 50 } |
| 51 | 51 |
| 52 RUNTIME_FUNCTION(Runtime_WasmGrowMemory) { | 52 RUNTIME_FUNCTION(Runtime_WasmGrowMemory) { |
| 53 HandleScope scope(isolate); | 53 HandleScope scope(isolate); |
| 54 DCHECK_EQ(1, args.length()); | 54 DCHECK_EQ(1, args.length()); |
| 55 CONVERT_UINT32_ARG_CHECKED(delta_pages, 0); | 55 CONVERT_UINT32_ARG_CHECKED(delta_pages, 0); |
| 56 Handle<WasmInstanceObject> instance(GetWasmInstanceOnStackTop(isolate), | 56 Handle<WasmInstanceObject> instance(GetWasmInstanceOnStackTop(isolate), |
| 57 isolate); | 57 isolate); |
| 58 |
| 59 // Set the current isolate's context. |
| 60 DCHECK_NULL(isolate->context()); |
| 61 isolate->set_context(instance->compiled_module()->ptr_to_native_context()); |
| 62 |
| 58 return *isolate->factory()->NewNumberFromInt( | 63 return *isolate->factory()->NewNumberFromInt( |
| 59 wasm::GrowMemory(isolate, instance, delta_pages)); | 64 wasm::GrowMemory(isolate, instance, delta_pages)); |
| 60 } | 65 } |
| 61 | 66 |
| 62 Object* ThrowRuntimeError(Isolate* isolate, int message_id, int byte_offset, | 67 Object* ThrowRuntimeError(Isolate* isolate, int message_id, int byte_offset, |
| 63 bool patch_source_position) { | 68 bool patch_source_position) { |
| 64 HandleScope scope(isolate); | 69 HandleScope scope(isolate); |
| 65 DCHECK_NULL(isolate->context()); | 70 DCHECK_NULL(isolate->context()); |
| 66 isolate->set_context(GetWasmContextOnStackTop(isolate)); | 71 isolate->set_context(GetWasmContextOnStackTop(isolate)); |
| 67 Handle<Object> error_obj = isolate->factory()->NewWasmRuntimeError( | 72 Handle<Object> error_obj = isolate->factory()->NewWasmRuntimeError( |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 } | 145 } |
| 141 | 146 |
| 142 RUNTIME_FUNCTION(Runtime_WasmThrow) { | 147 RUNTIME_FUNCTION(Runtime_WasmThrow) { |
| 143 HandleScope scope(isolate); | 148 HandleScope scope(isolate); |
| 144 DCHECK_EQ(2, args.length()); | 149 DCHECK_EQ(2, args.length()); |
| 145 CONVERT_SMI_ARG_CHECKED(lower, 0); | 150 CONVERT_SMI_ARG_CHECKED(lower, 0); |
| 146 CONVERT_SMI_ARG_CHECKED(upper, 1); | 151 CONVERT_SMI_ARG_CHECKED(upper, 1); |
| 147 | 152 |
| 148 const int32_t thrown_value = (upper << 16) | lower; | 153 const int32_t thrown_value = (upper << 16) | lower; |
| 149 | 154 |
| 155 // Set the current isolate's context. |
| 156 DCHECK_NULL(isolate->context()); |
| 157 isolate->set_context(GetWasmContextOnStackTop(isolate)); |
| 158 |
| 150 return isolate->Throw(*isolate->factory()->NewNumberFromInt(thrown_value)); | 159 return isolate->Throw(*isolate->factory()->NewNumberFromInt(thrown_value)); |
| 151 } | 160 } |
| 152 | 161 |
| 153 RUNTIME_FUNCTION(Runtime_WasmGetCaughtExceptionValue) { | 162 RUNTIME_FUNCTION(Runtime_WasmGetCaughtExceptionValue) { |
| 154 HandleScope scope(isolate); | 163 HandleScope scope(isolate); |
| 155 DCHECK_EQ(1, args.length()); | 164 DCHECK_EQ(1, args.length()); |
| 156 Object* exception = args[0]; | 165 Object* exception = args[0]; |
| 157 // The unwinder will only deliver exceptions to wasm if the exception is a | 166 // The unwinder will only deliver exceptions to wasm if the exception is a |
| 158 // Number or a Smi (which we have just converted to a Number.) This logic | 167 // Number or a Smi (which we have just converted to a Number.) This logic |
| 159 // lives in Isolate::is_catchable_by_wasm(Object*). | 168 // lives in Isolate::is_catchable_by_wasm(Object*). |
| (...skipping 11 matching lines...) Expand all Loading... |
| 171 Handle<WasmInstanceObject> instance = | 180 Handle<WasmInstanceObject> instance = |
| 172 Handle<WasmInstanceObject>::cast(instance_obj); | 181 Handle<WasmInstanceObject>::cast(instance_obj); |
| 173 | 182 |
| 174 // The arg buffer is the raw pointer to the caller's stack. It looks like a | 183 // The arg buffer is the raw pointer to the caller's stack. It looks like a |
| 175 // Smi (lowest bit not set, as checked by IsSmi), but is no valid Smi. We just | 184 // Smi (lowest bit not set, as checked by IsSmi), but is no valid Smi. We just |
| 176 // cast it back to the raw pointer. | 185 // cast it back to the raw pointer. |
| 177 CHECK(!arg_buffer_obj->IsHeapObject()); | 186 CHECK(!arg_buffer_obj->IsHeapObject()); |
| 178 CHECK(arg_buffer_obj->IsSmi()); | 187 CHECK(arg_buffer_obj->IsSmi()); |
| 179 uint8_t* arg_buffer = reinterpret_cast<uint8_t*>(*arg_buffer_obj); | 188 uint8_t* arg_buffer = reinterpret_cast<uint8_t*>(*arg_buffer_obj); |
| 180 | 189 |
| 181 DCHECK_EQ(isolate->context(), | 190 // Set the current isolate's context. |
| 182 instance->compiled_module()->ptr_to_native_context()); | 191 DCHECK_NULL(isolate->context()); |
| 192 isolate->set_context(instance->compiled_module()->ptr_to_native_context()); |
| 183 | 193 |
| 184 instance->debug_info()->RunInterpreter(func_index, arg_buffer); | 194 instance->debug_info()->RunInterpreter(func_index, arg_buffer); |
| 185 return isolate->heap()->undefined_value(); | 195 return isolate->heap()->undefined_value(); |
| 186 } | 196 } |
| 187 | 197 |
| 188 RUNTIME_FUNCTION(Runtime_WasmStackGuard) { | 198 RUNTIME_FUNCTION(Runtime_WasmStackGuard) { |
| 189 SealHandleScope shs(isolate); | 199 SealHandleScope shs(isolate); |
| 190 DCHECK_EQ(0, args.length()); | 200 DCHECK_EQ(0, args.length()); |
| 191 | 201 |
| 192 // Set the current isolate's context. | 202 // Set the current isolate's context. |
| 193 DCHECK_NULL(isolate->context()); | 203 DCHECK_NULL(isolate->context()); |
| 194 isolate->set_context(GetWasmContextOnStackTop(isolate)); | 204 isolate->set_context(GetWasmContextOnStackTop(isolate)); |
| 195 | 205 |
| 196 // Check if this is a real stack overflow. | 206 // Check if this is a real stack overflow. |
| 197 StackLimitCheck check(isolate); | 207 StackLimitCheck check(isolate); |
| 198 if (check.JsHasOverflowed()) return isolate->StackOverflow(); | 208 if (check.JsHasOverflowed()) return isolate->StackOverflow(); |
| 199 | 209 |
| 200 return isolate->stack_guard()->HandleInterrupts(); | 210 return isolate->stack_guard()->HandleInterrupts(); |
| 201 } | 211 } |
| 202 | 212 |
| 203 } // namespace internal | 213 } // namespace internal |
| 204 } // namespace v8 | 214 } // namespace v8 |
| OLD | NEW |