| OLD | NEW | 
|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 <memory> | 7 #include <memory> | 
| 8 | 8 | 
| 9 #include "src/arguments.h" | 9 #include "src/arguments.h" | 
| 10 #include "src/compiler-dispatcher/optimizing-compile-dispatcher.h" | 10 #include "src/compiler-dispatcher/optimizing-compile-dispatcher.h" | 
| 11 #include "src/compiler.h" | 11 #include "src/compiler.h" | 
| 12 #include "src/deoptimizer.h" | 12 #include "src/deoptimizer.h" | 
| 13 #include "src/frames-inl.h" | 13 #include "src/frames-inl.h" | 
| 14 #include "src/full-codegen/full-codegen.h" | 14 #include "src/full-codegen/full-codegen.h" | 
| 15 #include "src/isolate-inl.h" | 15 #include "src/isolate-inl.h" | 
| 16 #include "src/runtime-profiler.h" | 16 #include "src/runtime-profiler.h" | 
| 17 #include "src/snapshot/code-serializer.h" | 17 #include "src/snapshot/code-serializer.h" | 
| 18 #include "src/snapshot/natives.h" | 18 #include "src/snapshot/natives.h" | 
| 19 #include "src/wasm/wasm-module.h" | 19 #include "src/wasm/wasm-module.h" | 
| 20 #include "src/wasm/wasm-objects.h" | 20 #include "src/wasm/wasm-objects.h" | 
| 21 | 21 | 
| 22 namespace v8 { | 22 namespace v8 { | 
| 23 namespace internal { | 23 namespace internal { | 
| 24 | 24 | 
| 25 RUNTIME_FUNCTION(Runtime_ConstructDouble) { | 25 RUNTIME_FUNCTION(Runtime_ConstructDouble) { | 
| 26   HandleScope scope(isolate); | 26   HandleScope scope(isolate); | 
| 27   DCHECK(args.length() == 2); | 27   DCHECK_EQ(2, args.length()); | 
| 28   CONVERT_NUMBER_CHECKED(uint32_t, hi, Uint32, args[0]); | 28   CONVERT_NUMBER_CHECKED(uint32_t, hi, Uint32, args[0]); | 
| 29   CONVERT_NUMBER_CHECKED(uint32_t, lo, Uint32, args[1]); | 29   CONVERT_NUMBER_CHECKED(uint32_t, lo, Uint32, args[1]); | 
| 30   uint64_t result = (static_cast<uint64_t>(hi) << 32) | lo; | 30   uint64_t result = (static_cast<uint64_t>(hi) << 32) | lo; | 
| 31   return *isolate->factory()->NewNumber(uint64_to_double(result)); | 31   return *isolate->factory()->NewNumber(uint64_to_double(result)); | 
| 32 } | 32 } | 
| 33 | 33 | 
| 34 RUNTIME_FUNCTION(Runtime_DeoptimizeFunction) { | 34 RUNTIME_FUNCTION(Runtime_DeoptimizeFunction) { | 
| 35   HandleScope scope(isolate); | 35   HandleScope scope(isolate); | 
| 36   DCHECK(args.length() == 1); | 36   DCHECK_EQ(1, args.length()); | 
| 37 | 37 | 
| 38   // This function is used by fuzzers to get coverage in compiler. | 38   // This function is used by fuzzers to get coverage in compiler. | 
| 39   // Ignore calls on non-function objects to avoid runtime errors. | 39   // Ignore calls on non-function objects to avoid runtime errors. | 
| 40   CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); | 40   CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); | 
| 41   if (!function_object->IsJSFunction()) { | 41   if (!function_object->IsJSFunction()) { | 
| 42     return isolate->heap()->undefined_value(); | 42     return isolate->heap()->undefined_value(); | 
| 43   } | 43   } | 
| 44   Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); | 44   Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); | 
| 45 | 45 | 
| 46   // If the function is not optimized, just return. | 46   // If the function is not optimized, just return. | 
| 47   if (!function->IsOptimized()) return isolate->heap()->undefined_value(); | 47   if (!function->IsOptimized()) return isolate->heap()->undefined_value(); | 
| 48 | 48 | 
| 49   // TODO(turbofan): Deoptimization is not supported yet. | 49   // TODO(turbofan): Deoptimization is not supported yet. | 
| 50   if (function->code()->is_turbofanned() && | 50   if (function->code()->is_turbofanned() && | 
| 51       function->shared()->asm_function()) { | 51       function->shared()->asm_function()) { | 
| 52     return isolate->heap()->undefined_value(); | 52     return isolate->heap()->undefined_value(); | 
| 53   } | 53   } | 
| 54 | 54 | 
| 55   Deoptimizer::DeoptimizeFunction(*function); | 55   Deoptimizer::DeoptimizeFunction(*function); | 
| 56 | 56 | 
| 57   return isolate->heap()->undefined_value(); | 57   return isolate->heap()->undefined_value(); | 
| 58 } | 58 } | 
| 59 | 59 | 
| 60 | 60 | 
| 61 RUNTIME_FUNCTION(Runtime_DeoptimizeNow) { | 61 RUNTIME_FUNCTION(Runtime_DeoptimizeNow) { | 
| 62   HandleScope scope(isolate); | 62   HandleScope scope(isolate); | 
| 63   DCHECK(args.length() == 0); | 63   DCHECK_EQ(0, args.length()); | 
| 64 | 64 | 
| 65   Handle<JSFunction> function; | 65   Handle<JSFunction> function; | 
| 66 | 66 | 
| 67   // Find the JavaScript function on the top of the stack. | 67   // Find the JavaScript function on the top of the stack. | 
| 68   JavaScriptFrameIterator it(isolate); | 68   JavaScriptFrameIterator it(isolate); | 
| 69   if (!it.done()) function = Handle<JSFunction>(it.frame()->function()); | 69   if (!it.done()) function = Handle<JSFunction>(it.frame()->function()); | 
| 70   if (function.is_null()) return isolate->heap()->undefined_value(); | 70   if (function.is_null()) return isolate->heap()->undefined_value(); | 
| 71 | 71 | 
| 72   // If the function is not optimized, just return. | 72   // If the function is not optimized, just return. | 
| 73   if (!function->IsOptimized()) return isolate->heap()->undefined_value(); | 73   if (!function->IsOptimized()) return isolate->heap()->undefined_value(); | 
| 74 | 74 | 
| 75   // TODO(turbofan): Deoptimization is not supported yet. | 75   // TODO(turbofan): Deoptimization is not supported yet. | 
| 76   if (function->code()->is_turbofanned() && | 76   if (function->code()->is_turbofanned() && | 
| 77       function->shared()->asm_function()) { | 77       function->shared()->asm_function()) { | 
| 78     return isolate->heap()->undefined_value(); | 78     return isolate->heap()->undefined_value(); | 
| 79   } | 79   } | 
| 80 | 80 | 
| 81   Deoptimizer::DeoptimizeFunction(*function); | 81   Deoptimizer::DeoptimizeFunction(*function); | 
| 82 | 82 | 
| 83   return isolate->heap()->undefined_value(); | 83   return isolate->heap()->undefined_value(); | 
| 84 } | 84 } | 
| 85 | 85 | 
| 86 | 86 | 
| 87 RUNTIME_FUNCTION(Runtime_RunningInSimulator) { | 87 RUNTIME_FUNCTION(Runtime_RunningInSimulator) { | 
| 88   SealHandleScope shs(isolate); | 88   SealHandleScope shs(isolate); | 
| 89   DCHECK(args.length() == 0); | 89   DCHECK_EQ(0, args.length()); | 
| 90 #if defined(USE_SIMULATOR) | 90 #if defined(USE_SIMULATOR) | 
| 91   return isolate->heap()->true_value(); | 91   return isolate->heap()->true_value(); | 
| 92 #else | 92 #else | 
| 93   return isolate->heap()->false_value(); | 93   return isolate->heap()->false_value(); | 
| 94 #endif | 94 #endif | 
| 95 } | 95 } | 
| 96 | 96 | 
| 97 | 97 | 
| 98 RUNTIME_FUNCTION(Runtime_IsConcurrentRecompilationSupported) { | 98 RUNTIME_FUNCTION(Runtime_IsConcurrentRecompilationSupported) { | 
| 99   SealHandleScope shs(isolate); | 99   SealHandleScope shs(isolate); | 
| 100   DCHECK(args.length() == 0); | 100   DCHECK_EQ(0, args.length()); | 
| 101   return isolate->heap()->ToBoolean( | 101   return isolate->heap()->ToBoolean( | 
| 102       isolate->concurrent_recompilation_enabled()); | 102       isolate->concurrent_recompilation_enabled()); | 
| 103 } | 103 } | 
| 104 | 104 | 
| 105 | 105 | 
| 106 RUNTIME_FUNCTION(Runtime_OptimizeFunctionOnNextCall) { | 106 RUNTIME_FUNCTION(Runtime_OptimizeFunctionOnNextCall) { | 
| 107   HandleScope scope(isolate); | 107   HandleScope scope(isolate); | 
| 108 | 108 | 
| 109   // This function is used by fuzzers, ignore calls with bogus arguments count. | 109   // This function is used by fuzzers, ignore calls with bogus arguments count. | 
| 110   if (args.length() != 1 && args.length() != 2) { | 110   if (args.length() != 1 && args.length() != 2) { | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 145         isolate->concurrent_recompilation_enabled()) { | 145         isolate->concurrent_recompilation_enabled()) { | 
| 146       function->AttemptConcurrentOptimization(); | 146       function->AttemptConcurrentOptimization(); | 
| 147     } | 147     } | 
| 148   } | 148   } | 
| 149 | 149 | 
| 150   return isolate->heap()->undefined_value(); | 150   return isolate->heap()->undefined_value(); | 
| 151 } | 151 } | 
| 152 | 152 | 
| 153 RUNTIME_FUNCTION(Runtime_InterpretFunctionOnNextCall) { | 153 RUNTIME_FUNCTION(Runtime_InterpretFunctionOnNextCall) { | 
| 154   HandleScope scope(isolate); | 154   HandleScope scope(isolate); | 
| 155   DCHECK(args.length() == 1); | 155   DCHECK_EQ(1, args.length()); | 
| 156   CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); | 156   CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); | 
| 157   if (!function_object->IsJSFunction()) { | 157   if (!function_object->IsJSFunction()) { | 
| 158     return isolate->heap()->undefined_value(); | 158     return isolate->heap()->undefined_value(); | 
| 159   } | 159   } | 
| 160   Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); | 160   Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); | 
| 161 | 161 | 
| 162   // Do not tier down if we are already on optimized code. Replacing optimized | 162   // Do not tier down if we are already on optimized code. Replacing optimized | 
| 163   // code without actual deoptimization can lead to funny bugs. | 163   // code without actual deoptimization can lead to funny bugs. | 
| 164   if (function->code()->kind() != Code::OPTIMIZED_FUNCTION && | 164   if (function->code()->kind() != Code::OPTIMIZED_FUNCTION && | 
| 165       function->shared()->HasBytecodeArray()) { | 165       function->shared()->HasBytecodeArray()) { | 
| 166     function->ReplaceCode(*isolate->builtins()->InterpreterEntryTrampoline()); | 166     function->ReplaceCode(*isolate->builtins()->InterpreterEntryTrampoline()); | 
| 167   } | 167   } | 
| 168   return isolate->heap()->undefined_value(); | 168   return isolate->heap()->undefined_value(); | 
| 169 } | 169 } | 
| 170 | 170 | 
| 171 RUNTIME_FUNCTION(Runtime_BaselineFunctionOnNextCall) { | 171 RUNTIME_FUNCTION(Runtime_BaselineFunctionOnNextCall) { | 
| 172   HandleScope scope(isolate); | 172   HandleScope scope(isolate); | 
| 173   DCHECK(args.length() == 1); | 173   DCHECK_EQ(1, args.length()); | 
| 174   CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); | 174   CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); | 
| 175   if (!function_object->IsJSFunction()) { | 175   if (!function_object->IsJSFunction()) { | 
| 176     return isolate->heap()->undefined_value(); | 176     return isolate->heap()->undefined_value(); | 
| 177   } | 177   } | 
| 178   Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); | 178   Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); | 
| 179 | 179 | 
| 180   // If function isn't compiled, compile it now. | 180   // If function isn't compiled, compile it now. | 
| 181   if (!function->shared()->is_compiled() && | 181   if (!function->shared()->is_compiled() && | 
| 182       !Compiler::Compile(function, Compiler::CLEAR_EXCEPTION)) { | 182       !Compiler::Compile(function, Compiler::CLEAR_EXCEPTION)) { | 
| 183     return isolate->heap()->undefined_value(); | 183     return isolate->heap()->undefined_value(); | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 221     isolate->runtime_profiler()->AttemptOnStackReplacement( | 221     isolate->runtime_profiler()->AttemptOnStackReplacement( | 
| 222         it.frame(), AbstractCode::kMaxLoopNestingMarker); | 222         it.frame(), AbstractCode::kMaxLoopNestingMarker); | 
| 223   } | 223   } | 
| 224 | 224 | 
| 225   return isolate->heap()->undefined_value(); | 225   return isolate->heap()->undefined_value(); | 
| 226 } | 226 } | 
| 227 | 227 | 
| 228 | 228 | 
| 229 RUNTIME_FUNCTION(Runtime_NeverOptimizeFunction) { | 229 RUNTIME_FUNCTION(Runtime_NeverOptimizeFunction) { | 
| 230   HandleScope scope(isolate); | 230   HandleScope scope(isolate); | 
| 231   DCHECK(args.length() == 1); | 231   DCHECK_EQ(1, args.length()); | 
| 232   CONVERT_ARG_CHECKED(JSFunction, function, 0); | 232   CONVERT_ARG_CHECKED(JSFunction, function, 0); | 
| 233   function->shared()->set_disable_optimization_reason( | 233   function->shared()->set_disable_optimization_reason( | 
| 234       kOptimizationDisabledForTest); | 234       kOptimizationDisabledForTest); | 
| 235   function->shared()->set_optimization_disabled(true); | 235   function->shared()->set_optimization_disabled(true); | 
| 236   return isolate->heap()->undefined_value(); | 236   return isolate->heap()->undefined_value(); | 
| 237 } | 237 } | 
| 238 | 238 | 
| 239 | 239 | 
| 240 RUNTIME_FUNCTION(Runtime_GetOptimizationStatus) { | 240 RUNTIME_FUNCTION(Runtime_GetOptimizationStatus) { | 
| 241   HandleScope scope(isolate); | 241   HandleScope scope(isolate); | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 282   } | 282   } | 
| 283   if (function->IsInterpreted()) { | 283   if (function->IsInterpreted()) { | 
| 284     return Smi::FromInt(8);  // 8 == "Interpreted". | 284     return Smi::FromInt(8);  // 8 == "Interpreted". | 
| 285   } | 285   } | 
| 286   return function->IsOptimized() ? Smi::FromInt(1)   // 1 == "yes". | 286   return function->IsOptimized() ? Smi::FromInt(1)   // 1 == "yes". | 
| 287                                  : Smi::FromInt(2);  // 2 == "no". | 287                                  : Smi::FromInt(2);  // 2 == "no". | 
| 288 } | 288 } | 
| 289 | 289 | 
| 290 | 290 | 
| 291 RUNTIME_FUNCTION(Runtime_UnblockConcurrentRecompilation) { | 291 RUNTIME_FUNCTION(Runtime_UnblockConcurrentRecompilation) { | 
| 292   DCHECK(args.length() == 0); | 292   DCHECK_EQ(0, args.length()); | 
| 293   if (FLAG_block_concurrent_recompilation && | 293   if (FLAG_block_concurrent_recompilation && | 
| 294       isolate->concurrent_recompilation_enabled()) { | 294       isolate->concurrent_recompilation_enabled()) { | 
| 295     isolate->optimizing_compile_dispatcher()->Unblock(); | 295     isolate->optimizing_compile_dispatcher()->Unblock(); | 
| 296   } | 296   } | 
| 297   return isolate->heap()->undefined_value(); | 297   return isolate->heap()->undefined_value(); | 
| 298 } | 298 } | 
| 299 | 299 | 
| 300 | 300 | 
| 301 RUNTIME_FUNCTION(Runtime_GetOptimizationCount) { | 301 RUNTIME_FUNCTION(Runtime_GetOptimizationCount) { | 
| 302   HandleScope scope(isolate); | 302   HandleScope scope(isolate); | 
| 303   DCHECK(args.length() == 1); | 303   DCHECK_EQ(1, args.length()); | 
| 304   CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 304   CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 
| 305   return Smi::FromInt(function->shared()->opt_count()); | 305   return Smi::FromInt(function->shared()->opt_count()); | 
| 306 } | 306 } | 
| 307 | 307 | 
| 308 static void ReturnThis(const v8::FunctionCallbackInfo<v8::Value>& args) { | 308 static void ReturnThis(const v8::FunctionCallbackInfo<v8::Value>& args) { | 
| 309   args.GetReturnValue().Set(args.This()); | 309   args.GetReturnValue().Set(args.This()); | 
| 310 } | 310 } | 
| 311 | 311 | 
| 312 RUNTIME_FUNCTION(Runtime_GetUndetectable) { | 312 RUNTIME_FUNCTION(Runtime_GetUndetectable) { | 
| 313   HandleScope scope(isolate); | 313   HandleScope scope(isolate); | 
| 314   DCHECK(args.length() == 0); | 314   DCHECK_EQ(0, args.length()); | 
| 315   v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); | 315   v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); | 
| 316 | 316 | 
| 317   Local<v8::ObjectTemplate> desc = v8::ObjectTemplate::New(v8_isolate); | 317   Local<v8::ObjectTemplate> desc = v8::ObjectTemplate::New(v8_isolate); | 
| 318   desc->MarkAsUndetectable(); | 318   desc->MarkAsUndetectable(); | 
| 319   desc->SetCallAsFunctionHandler(ReturnThis); | 319   desc->SetCallAsFunctionHandler(ReturnThis); | 
| 320   Local<v8::Object> obj; | 320   Local<v8::Object> obj; | 
| 321   if (!desc->NewInstance(v8_isolate->GetCurrentContext()).ToLocal(&obj)) { | 321   if (!desc->NewInstance(v8_isolate->GetCurrentContext()).ToLocal(&obj)) { | 
| 322     return nullptr; | 322     return nullptr; | 
| 323   } | 323   } | 
| 324   return *Utils::OpenHandle(*obj); | 324   return *Utils::OpenHandle(*obj); | 
| 325 } | 325 } | 
| 326 | 326 | 
| 327 static void call_as_function(const v8::FunctionCallbackInfo<v8::Value>& args) { | 327 static void call_as_function(const v8::FunctionCallbackInfo<v8::Value>& args) { | 
| 328   double v1 = args[0] | 328   double v1 = args[0] | 
| 329                   ->NumberValue(v8::Isolate::GetCurrent()->GetCurrentContext()) | 329                   ->NumberValue(v8::Isolate::GetCurrent()->GetCurrentContext()) | 
| 330                   .ToChecked(); | 330                   .ToChecked(); | 
| 331   double v2 = args[1] | 331   double v2 = args[1] | 
| 332                   ->NumberValue(v8::Isolate::GetCurrent()->GetCurrentContext()) | 332                   ->NumberValue(v8::Isolate::GetCurrent()->GetCurrentContext()) | 
| 333                   .ToChecked(); | 333                   .ToChecked(); | 
| 334   args.GetReturnValue().Set( | 334   args.GetReturnValue().Set( | 
| 335       v8::Number::New(v8::Isolate::GetCurrent(), v1 - v2)); | 335       v8::Number::New(v8::Isolate::GetCurrent(), v1 - v2)); | 
| 336 } | 336 } | 
| 337 | 337 | 
| 338 // Returns a callable object. The object returns the difference of its two | 338 // Returns a callable object. The object returns the difference of its two | 
| 339 // parameters when it is called. | 339 // parameters when it is called. | 
| 340 RUNTIME_FUNCTION(Runtime_GetCallable) { | 340 RUNTIME_FUNCTION(Runtime_GetCallable) { | 
| 341   HandleScope scope(isolate); | 341   HandleScope scope(isolate); | 
| 342   DCHECK(args.length() == 0); | 342   DCHECK_EQ(0, args.length()); | 
| 343   v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); | 343   v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); | 
| 344   Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(v8_isolate); | 344   Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(v8_isolate); | 
| 345   Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 345   Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 
| 346   instance_template->SetCallAsFunctionHandler(call_as_function); | 346   instance_template->SetCallAsFunctionHandler(call_as_function); | 
| 347   v8_isolate->GetCurrentContext(); | 347   v8_isolate->GetCurrentContext(); | 
| 348   Local<v8::Object> instance = | 348   Local<v8::Object> instance = | 
| 349       t->GetFunction(v8_isolate->GetCurrentContext()) | 349       t->GetFunction(v8_isolate->GetCurrentContext()) | 
| 350           .ToLocalChecked() | 350           .ToLocalChecked() | 
| 351           ->NewInstance(v8_isolate->GetCurrentContext()) | 351           ->NewInstance(v8_isolate->GetCurrentContext()) | 
| 352           .ToLocalChecked(); | 352           .ToLocalChecked(); | 
| 353   return *Utils::OpenHandle(*instance); | 353   return *Utils::OpenHandle(*instance); | 
| 354 } | 354 } | 
| 355 | 355 | 
| 356 RUNTIME_FUNCTION(Runtime_ClearFunctionTypeFeedback) { | 356 RUNTIME_FUNCTION(Runtime_ClearFunctionTypeFeedback) { | 
| 357   HandleScope scope(isolate); | 357   HandleScope scope(isolate); | 
| 358   DCHECK(args.length() == 1); | 358   DCHECK_EQ(1, args.length()); | 
| 359   CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 359   CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); | 
| 360   function->ClearTypeFeedbackInfo(); | 360   function->ClearTypeFeedbackInfo(); | 
| 361   Code* unoptimized = function->shared()->code(); | 361   Code* unoptimized = function->shared()->code(); | 
| 362   if (unoptimized->kind() == Code::FUNCTION) { | 362   if (unoptimized->kind() == Code::FUNCTION) { | 
| 363     unoptimized->ClearInlineCaches(); | 363     unoptimized->ClearInlineCaches(); | 
| 364   } | 364   } | 
| 365   return isolate->heap()->undefined_value(); | 365   return isolate->heap()->undefined_value(); | 
| 366 } | 366 } | 
| 367 | 367 | 
| 368 RUNTIME_FUNCTION(Runtime_CheckWasmWrapperElision) { | 368 RUNTIME_FUNCTION(Runtime_CheckWasmWrapperElision) { | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 423       ++count; | 423       ++count; | 
| 424       imported_fct = handle(target); | 424       imported_fct = handle(target); | 
| 425     } | 425     } | 
| 426   } | 426   } | 
| 427   CHECK_LE(count, 1); | 427   CHECK_LE(count, 1); | 
| 428   return isolate->heap()->ToBoolean(count == 1); | 428   return isolate->heap()->ToBoolean(count == 1); | 
| 429 } | 429 } | 
| 430 | 430 | 
| 431 RUNTIME_FUNCTION(Runtime_NotifyContextDisposed) { | 431 RUNTIME_FUNCTION(Runtime_NotifyContextDisposed) { | 
| 432   HandleScope scope(isolate); | 432   HandleScope scope(isolate); | 
| 433   DCHECK(args.length() == 0); | 433   DCHECK_EQ(0, args.length()); | 
| 434   isolate->heap()->NotifyContextDisposed(true); | 434   isolate->heap()->NotifyContextDisposed(true); | 
| 435   return isolate->heap()->undefined_value(); | 435   return isolate->heap()->undefined_value(); | 
| 436 } | 436 } | 
| 437 | 437 | 
| 438 | 438 | 
| 439 RUNTIME_FUNCTION(Runtime_SetAllocationTimeout) { | 439 RUNTIME_FUNCTION(Runtime_SetAllocationTimeout) { | 
| 440   SealHandleScope shs(isolate); | 440   SealHandleScope shs(isolate); | 
| 441   DCHECK(args.length() == 2 || args.length() == 3); | 441   DCHECK(args.length() == 2 || args.length() == 3); | 
| 442 #ifdef DEBUG | 442 #ifdef DEBUG | 
| 443   CONVERT_INT32_ARG_CHECKED(interval, 0); | 443   CONVERT_INT32_ARG_CHECKED(interval, 0); | 
| 444   CONVERT_INT32_ARG_CHECKED(timeout, 1); | 444   CONVERT_INT32_ARG_CHECKED(timeout, 1); | 
| 445   isolate->heap()->set_allocation_timeout(timeout); | 445   isolate->heap()->set_allocation_timeout(timeout); | 
| 446   FLAG_gc_interval = interval; | 446   FLAG_gc_interval = interval; | 
| 447   if (args.length() == 3) { | 447   if (args.length() == 3) { | 
| 448     // Enable/disable inline allocation if requested. | 448     // Enable/disable inline allocation if requested. | 
| 449     CONVERT_BOOLEAN_ARG_CHECKED(inline_allocation, 2); | 449     CONVERT_BOOLEAN_ARG_CHECKED(inline_allocation, 2); | 
| 450     if (inline_allocation) { | 450     if (inline_allocation) { | 
| 451       isolate->heap()->EnableInlineAllocation(); | 451       isolate->heap()->EnableInlineAllocation(); | 
| 452     } else { | 452     } else { | 
| 453       isolate->heap()->DisableInlineAllocation(); | 453       isolate->heap()->DisableInlineAllocation(); | 
| 454     } | 454     } | 
| 455   } | 455   } | 
| 456 #endif | 456 #endif | 
| 457   return isolate->heap()->undefined_value(); | 457   return isolate->heap()->undefined_value(); | 
| 458 } | 458 } | 
| 459 | 459 | 
| 460 | 460 | 
| 461 RUNTIME_FUNCTION(Runtime_DebugPrint) { | 461 RUNTIME_FUNCTION(Runtime_DebugPrint) { | 
| 462   SealHandleScope shs(isolate); | 462   SealHandleScope shs(isolate); | 
| 463   DCHECK(args.length() == 1); | 463   DCHECK_EQ(1, args.length()); | 
| 464 | 464 | 
| 465   OFStream os(stdout); | 465   OFStream os(stdout); | 
| 466 #ifdef DEBUG | 466 #ifdef DEBUG | 
| 467   if (args[0]->IsString() && isolate->context() != nullptr) { | 467   if (args[0]->IsString() && isolate->context() != nullptr) { | 
| 468     // If we have a string, assume it's a code "marker" | 468     // If we have a string, assume it's a code "marker" | 
| 469     // and print some interesting cpu debugging info. | 469     // and print some interesting cpu debugging info. | 
| 470     JavaScriptFrameIterator it(isolate); | 470     JavaScriptFrameIterator it(isolate); | 
| 471     JavaScriptFrame* frame = it.frame(); | 471     JavaScriptFrame* frame = it.frame(); | 
| 472     os << "fp = " << static_cast<void*>(frame->fp()) | 472     os << "fp = " << static_cast<void*>(frame->fp()) | 
| 473        << ", sp = " << static_cast<void*>(frame->sp()) | 473        << ", sp = " << static_cast<void*>(frame->sp()) | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 484   os << Brief(args[0]); | 484   os << Brief(args[0]); | 
| 485 #endif | 485 #endif | 
| 486   os << std::endl; | 486   os << std::endl; | 
| 487 | 487 | 
| 488   return args[0];  // return TOS | 488   return args[0];  // return TOS | 
| 489 } | 489 } | 
| 490 | 490 | 
| 491 | 491 | 
| 492 RUNTIME_FUNCTION(Runtime_DebugTrace) { | 492 RUNTIME_FUNCTION(Runtime_DebugTrace) { | 
| 493   SealHandleScope shs(isolate); | 493   SealHandleScope shs(isolate); | 
| 494   DCHECK(args.length() == 0); | 494   DCHECK_EQ(0, args.length()); | 
| 495   isolate->PrintStack(stdout); | 495   isolate->PrintStack(stdout); | 
| 496   return isolate->heap()->undefined_value(); | 496   return isolate->heap()->undefined_value(); | 
| 497 } | 497 } | 
| 498 | 498 | 
| 499 | 499 | 
| 500 // This will not allocate (flatten the string), but it may run | 500 // This will not allocate (flatten the string), but it may run | 
| 501 // very slowly for very deeply nested ConsStrings.  For debugging use only. | 501 // very slowly for very deeply nested ConsStrings.  For debugging use only. | 
| 502 RUNTIME_FUNCTION(Runtime_GlobalPrint) { | 502 RUNTIME_FUNCTION(Runtime_GlobalPrint) { | 
| 503   SealHandleScope shs(isolate); | 503   SealHandleScope shs(isolate); | 
| 504   DCHECK(args.length() == 1); | 504   DCHECK_EQ(1, args.length()); | 
| 505 | 505 | 
| 506   CONVERT_ARG_CHECKED(String, string, 0); | 506   CONVERT_ARG_CHECKED(String, string, 0); | 
| 507   StringCharacterStream stream(string); | 507   StringCharacterStream stream(string); | 
| 508   while (stream.HasMore()) { | 508   while (stream.HasMore()) { | 
| 509     uint16_t character = stream.GetNext(); | 509     uint16_t character = stream.GetNext(); | 
| 510     PrintF("%c", character); | 510     PrintF("%c", character); | 
| 511   } | 511   } | 
| 512   return string; | 512   return string; | 
| 513 } | 513 } | 
| 514 | 514 | 
| 515 | 515 | 
| 516 RUNTIME_FUNCTION(Runtime_SystemBreak) { | 516 RUNTIME_FUNCTION(Runtime_SystemBreak) { | 
| 517   // The code below doesn't create handles, but when breaking here in GDB | 517   // The code below doesn't create handles, but when breaking here in GDB | 
| 518   // having a handle scope might be useful. | 518   // having a handle scope might be useful. | 
| 519   HandleScope scope(isolate); | 519   HandleScope scope(isolate); | 
| 520   DCHECK(args.length() == 0); | 520   DCHECK_EQ(0, args.length()); | 
| 521   base::OS::DebugBreak(); | 521   base::OS::DebugBreak(); | 
| 522   return isolate->heap()->undefined_value(); | 522   return isolate->heap()->undefined_value(); | 
| 523 } | 523 } | 
| 524 | 524 | 
| 525 | 525 | 
| 526 // Sets a v8 flag. | 526 // Sets a v8 flag. | 
| 527 RUNTIME_FUNCTION(Runtime_SetFlags) { | 527 RUNTIME_FUNCTION(Runtime_SetFlags) { | 
| 528   SealHandleScope shs(isolate); | 528   SealHandleScope shs(isolate); | 
| 529   DCHECK(args.length() == 1); | 529   DCHECK_EQ(1, args.length()); | 
| 530   CONVERT_ARG_CHECKED(String, arg, 0); | 530   CONVERT_ARG_CHECKED(String, arg, 0); | 
| 531   std::unique_ptr<char[]> flags = | 531   std::unique_ptr<char[]> flags = | 
| 532       arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); | 532       arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); | 
| 533   FlagList::SetFlagsFromString(flags.get(), StrLength(flags.get())); | 533   FlagList::SetFlagsFromString(flags.get(), StrLength(flags.get())); | 
| 534   return isolate->heap()->undefined_value(); | 534   return isolate->heap()->undefined_value(); | 
| 535 } | 535 } | 
| 536 | 536 | 
| 537 | 537 | 
| 538 RUNTIME_FUNCTION(Runtime_Abort) { | 538 RUNTIME_FUNCTION(Runtime_Abort) { | 
| 539   SealHandleScope shs(isolate); | 539   SealHandleScope shs(isolate); | 
| 540   DCHECK(args.length() == 1); | 540   DCHECK_EQ(1, args.length()); | 
| 541   CONVERT_SMI_ARG_CHECKED(message_id, 0); | 541   CONVERT_SMI_ARG_CHECKED(message_id, 0); | 
| 542   const char* message = | 542   const char* message = | 
| 543       GetBailoutReason(static_cast<BailoutReason>(message_id)); | 543       GetBailoutReason(static_cast<BailoutReason>(message_id)); | 
| 544   base::OS::PrintError("abort: %s\n", message); | 544   base::OS::PrintError("abort: %s\n", message); | 
| 545   isolate->PrintStack(stderr); | 545   isolate->PrintStack(stderr); | 
| 546   base::OS::Abort(); | 546   base::OS::Abort(); | 
| 547   UNREACHABLE(); | 547   UNREACHABLE(); | 
| 548   return NULL; | 548   return NULL; | 
| 549 } | 549 } | 
| 550 | 550 | 
| 551 | 551 | 
| 552 RUNTIME_FUNCTION(Runtime_AbortJS) { | 552 RUNTIME_FUNCTION(Runtime_AbortJS) { | 
| 553   HandleScope scope(isolate); | 553   HandleScope scope(isolate); | 
| 554   DCHECK(args.length() == 1); | 554   DCHECK_EQ(1, args.length()); | 
| 555   CONVERT_ARG_HANDLE_CHECKED(String, message, 0); | 555   CONVERT_ARG_HANDLE_CHECKED(String, message, 0); | 
| 556   base::OS::PrintError("abort: %s\n", message->ToCString().get()); | 556   base::OS::PrintError("abort: %s\n", message->ToCString().get()); | 
| 557   isolate->PrintStack(stderr); | 557   isolate->PrintStack(stderr); | 
| 558   base::OS::Abort(); | 558   base::OS::Abort(); | 
| 559   UNREACHABLE(); | 559   UNREACHABLE(); | 
| 560   return NULL; | 560   return NULL; | 
| 561 } | 561 } | 
| 562 | 562 | 
| 563 | 563 | 
| 564 RUNTIME_FUNCTION(Runtime_NativeScriptsCount) { | 564 RUNTIME_FUNCTION(Runtime_NativeScriptsCount) { | 
| 565   DCHECK(args.length() == 0); | 565   DCHECK_EQ(0, args.length()); | 
| 566   return Smi::FromInt(Natives::GetBuiltinsCount()); | 566   return Smi::FromInt(Natives::GetBuiltinsCount()); | 
| 567 } | 567 } | 
| 568 | 568 | 
| 569 // TODO(5510): remove this. | 569 // TODO(5510): remove this. | 
| 570 RUNTIME_FUNCTION(Runtime_GetV8Version) { | 570 RUNTIME_FUNCTION(Runtime_GetV8Version) { | 
| 571   HandleScope scope(isolate); | 571   HandleScope scope(isolate); | 
| 572   DCHECK(args.length() == 0); | 572   DCHECK_EQ(0, args.length()); | 
| 573 | 573 | 
| 574   const char* version_string = v8::V8::GetVersion(); | 574   const char* version_string = v8::V8::GetVersion(); | 
| 575 | 575 | 
| 576   return *isolate->factory()->NewStringFromAsciiChecked(version_string); | 576   return *isolate->factory()->NewStringFromAsciiChecked(version_string); | 
| 577 } | 577 } | 
| 578 | 578 | 
| 579 | 579 | 
| 580 RUNTIME_FUNCTION(Runtime_DisassembleFunction) { | 580 RUNTIME_FUNCTION(Runtime_DisassembleFunction) { | 
| 581   HandleScope scope(isolate); | 581   HandleScope scope(isolate); | 
| 582 #ifdef DEBUG | 582 #ifdef DEBUG | 
| 583   DCHECK(args.length() == 1); | 583   DCHECK_EQ(1, args.length()); | 
| 584   // Get the function and make sure it is compiled. | 584   // Get the function and make sure it is compiled. | 
| 585   CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); | 585   CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); | 
| 586   if (!Compiler::Compile(func, Compiler::KEEP_EXCEPTION)) { | 586   if (!Compiler::Compile(func, Compiler::KEEP_EXCEPTION)) { | 
| 587     return isolate->heap()->exception(); | 587     return isolate->heap()->exception(); | 
| 588   } | 588   } | 
| 589   OFStream os(stdout); | 589   OFStream os(stdout); | 
| 590   func->code()->Print(os); | 590   func->code()->Print(os); | 
| 591   os << std::endl; | 591   os << std::endl; | 
| 592 #endif  // DEBUG | 592 #endif  // DEBUG | 
| 593   return isolate->heap()->undefined_value(); | 593   return isolate->heap()->undefined_value(); | 
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 637 RUNTIME_FUNCTION(Runtime_TraceTailCall) { | 637 RUNTIME_FUNCTION(Runtime_TraceTailCall) { | 
| 638   SealHandleScope shs(isolate); | 638   SealHandleScope shs(isolate); | 
| 639   DCHECK_EQ(0, args.length()); | 639   DCHECK_EQ(0, args.length()); | 
| 640   PrintIndentation(isolate); | 640   PrintIndentation(isolate); | 
| 641   PrintF("} -> tail call ->\n"); | 641   PrintF("} -> tail call ->\n"); | 
| 642   return isolate->heap()->undefined_value(); | 642   return isolate->heap()->undefined_value(); | 
| 643 } | 643 } | 
| 644 | 644 | 
| 645 RUNTIME_FUNCTION(Runtime_GetExceptionDetails) { | 645 RUNTIME_FUNCTION(Runtime_GetExceptionDetails) { | 
| 646   HandleScope shs(isolate); | 646   HandleScope shs(isolate); | 
| 647   DCHECK(args.length() == 1); | 647   DCHECK_EQ(1, args.length()); | 
| 648   CONVERT_ARG_HANDLE_CHECKED(JSObject, exception_obj, 0); | 648   CONVERT_ARG_HANDLE_CHECKED(JSObject, exception_obj, 0); | 
| 649 | 649 | 
| 650   Factory* factory = isolate->factory(); | 650   Factory* factory = isolate->factory(); | 
| 651   Handle<JSMessageObject> message_obj = | 651   Handle<JSMessageObject> message_obj = | 
| 652       isolate->CreateMessage(exception_obj, nullptr); | 652       isolate->CreateMessage(exception_obj, nullptr); | 
| 653 | 653 | 
| 654   Handle<JSObject> message = factory->NewJSObject(isolate->object_function()); | 654   Handle<JSObject> message = factory->NewJSObject(isolate->object_function()); | 
| 655 | 655 | 
| 656   Handle<String> key; | 656   Handle<String> key; | 
| 657   Handle<Object> value; | 657   Handle<Object> value; | 
| 658 | 658 | 
| 659   key = factory->NewStringFromAsciiChecked("start_pos"); | 659   key = factory->NewStringFromAsciiChecked("start_pos"); | 
| 660   value = handle(Smi::FromInt(message_obj->start_position()), isolate); | 660   value = handle(Smi::FromInt(message_obj->start_position()), isolate); | 
| 661   JSObject::SetProperty(message, key, value, STRICT).Assert(); | 661   JSObject::SetProperty(message, key, value, STRICT).Assert(); | 
| 662 | 662 | 
| 663   key = factory->NewStringFromAsciiChecked("end_pos"); | 663   key = factory->NewStringFromAsciiChecked("end_pos"); | 
| 664   value = handle(Smi::FromInt(message_obj->end_position()), isolate); | 664   value = handle(Smi::FromInt(message_obj->end_position()), isolate); | 
| 665   JSObject::SetProperty(message, key, value, STRICT).Assert(); | 665   JSObject::SetProperty(message, key, value, STRICT).Assert(); | 
| 666 | 666 | 
| 667   return *message; | 667   return *message; | 
| 668 } | 668 } | 
| 669 | 669 | 
| 670 RUNTIME_FUNCTION(Runtime_HaveSameMap) { | 670 RUNTIME_FUNCTION(Runtime_HaveSameMap) { | 
| 671   SealHandleScope shs(isolate); | 671   SealHandleScope shs(isolate); | 
| 672   DCHECK(args.length() == 2); | 672   DCHECK_EQ(2, args.length()); | 
| 673   CONVERT_ARG_CHECKED(JSObject, obj1, 0); | 673   CONVERT_ARG_CHECKED(JSObject, obj1, 0); | 
| 674   CONVERT_ARG_CHECKED(JSObject, obj2, 1); | 674   CONVERT_ARG_CHECKED(JSObject, obj2, 1); | 
| 675   return isolate->heap()->ToBoolean(obj1->map() == obj2->map()); | 675   return isolate->heap()->ToBoolean(obj1->map() == obj2->map()); | 
| 676 } | 676 } | 
| 677 | 677 | 
| 678 | 678 | 
| 679 RUNTIME_FUNCTION(Runtime_InNewSpace) { | 679 RUNTIME_FUNCTION(Runtime_InNewSpace) { | 
| 680   SealHandleScope shs(isolate); | 680   SealHandleScope shs(isolate); | 
| 681   DCHECK(args.length() == 1); | 681   DCHECK_EQ(1, args.length()); | 
| 682   CONVERT_ARG_CHECKED(Object, obj, 0); | 682   CONVERT_ARG_CHECKED(Object, obj, 0); | 
| 683   return isolate->heap()->ToBoolean(isolate->heap()->InNewSpace(obj)); | 683   return isolate->heap()->ToBoolean(isolate->heap()->InNewSpace(obj)); | 
| 684 } | 684 } | 
| 685 | 685 | 
| 686 RUNTIME_FUNCTION(Runtime_IsAsmWasmCode) { | 686 RUNTIME_FUNCTION(Runtime_IsAsmWasmCode) { | 
| 687   SealHandleScope shs(isolate); | 687   SealHandleScope shs(isolate); | 
| 688   DCHECK_EQ(1, args.length()); | 688   DCHECK_EQ(1, args.length()); | 
| 689   CONVERT_ARG_CHECKED(JSFunction, function, 0); | 689   CONVERT_ARG_CHECKED(JSFunction, function, 0); | 
| 690   if (!function->shared()->HasAsmWasmData()) { | 690   if (!function->shared()->HasAsmWasmData()) { | 
| 691     // Doesn't have wasm data. | 691     // Doesn't have wasm data. | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 738 } | 738 } | 
| 739 | 739 | 
| 740 #define CONVERT_ARG_HANDLE_CHECKED_2(Type, name, index) \ | 740 #define CONVERT_ARG_HANDLE_CHECKED_2(Type, name, index) \ | 
| 741   CHECK(Type::Is##Type(args[index]));                   \ | 741   CHECK(Type::Is##Type(args[index]));                   \ | 
| 742   Handle<Type> name = args.at<Type>(index); | 742   Handle<Type> name = args.at<Type>(index); | 
| 743 | 743 | 
| 744 // Take a compiled wasm module, serialize it and copy the buffer into an array | 744 // Take a compiled wasm module, serialize it and copy the buffer into an array | 
| 745 // buffer, which is then returned. | 745 // buffer, which is then returned. | 
| 746 RUNTIME_FUNCTION(Runtime_SerializeWasmModule) { | 746 RUNTIME_FUNCTION(Runtime_SerializeWasmModule) { | 
| 747   HandleScope shs(isolate); | 747   HandleScope shs(isolate); | 
| 748   DCHECK(args.length() == 1); | 748   DCHECK_EQ(1, args.length()); | 
| 749   CONVERT_ARG_HANDLE_CHECKED_2(WasmModuleObject, module_obj, 0); | 749   CONVERT_ARG_HANDLE_CHECKED_2(WasmModuleObject, module_obj, 0); | 
| 750 | 750 | 
| 751   Handle<WasmCompiledModule> orig(module_obj->compiled_module()); | 751   Handle<WasmCompiledModule> orig(module_obj->compiled_module()); | 
| 752   std::unique_ptr<ScriptData> data = | 752   std::unique_ptr<ScriptData> data = | 
| 753       WasmCompiledModuleSerializer::SerializeWasmModule(isolate, orig); | 753       WasmCompiledModuleSerializer::SerializeWasmModule(isolate, orig); | 
| 754   void* buff = isolate->array_buffer_allocator()->Allocate(data->length()); | 754   void* buff = isolate->array_buffer_allocator()->Allocate(data->length()); | 
| 755   Handle<JSArrayBuffer> ret = isolate->factory()->NewJSArrayBuffer(); | 755   Handle<JSArrayBuffer> ret = isolate->factory()->NewJSArrayBuffer(); | 
| 756   JSArrayBuffer::Setup(ret, isolate, false, buff, data->length()); | 756   JSArrayBuffer::Setup(ret, isolate, false, buff, data->length()); | 
| 757   memcpy(buff, data->data(), data->length()); | 757   memcpy(buff, data->data(), data->length()); | 
| 758   return *ret; | 758   return *ret; | 
| 759 } | 759 } | 
| 760 | 760 | 
| 761 // Take an array buffer and attempt to reconstruct a compiled wasm module. | 761 // Take an array buffer and attempt to reconstruct a compiled wasm module. | 
| 762 // Return undefined if unsuccessful. | 762 // Return undefined if unsuccessful. | 
| 763 RUNTIME_FUNCTION(Runtime_DeserializeWasmModule) { | 763 RUNTIME_FUNCTION(Runtime_DeserializeWasmModule) { | 
| 764   HandleScope shs(isolate); | 764   HandleScope shs(isolate); | 
| 765   DCHECK(args.length() == 2); | 765   DCHECK_EQ(2, args.length()); | 
| 766   CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 0); | 766   CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 0); | 
| 767   CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, wire_bytes, 1); | 767   CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, wire_bytes, 1); | 
| 768 | 768 | 
| 769   Address mem_start = static_cast<Address>(buffer->backing_store()); | 769   Address mem_start = static_cast<Address>(buffer->backing_store()); | 
| 770   int mem_size = static_cast<int>(buffer->byte_length()->Number()); | 770   int mem_size = static_cast<int>(buffer->byte_length()->Number()); | 
| 771 | 771 | 
| 772   // DeserializeWasmModule will allocate. We assume JSArrayBuffer doesn't | 772   // DeserializeWasmModule will allocate. We assume JSArrayBuffer doesn't | 
| 773   // get relocated. | 773   // get relocated. | 
| 774   ScriptData sc(mem_start, mem_size); | 774   ScriptData sc(mem_start, mem_size); | 
| 775   bool already_external = wire_bytes->is_external(); | 775   bool already_external = wire_bytes->is_external(); | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 790   Handle<FixedArray> compiled_module; | 790   Handle<FixedArray> compiled_module; | 
| 791   if (!maybe_compiled_module.ToHandle(&compiled_module)) { | 791   if (!maybe_compiled_module.ToHandle(&compiled_module)) { | 
| 792     return isolate->heap()->undefined_value(); | 792     return isolate->heap()->undefined_value(); | 
| 793   } | 793   } | 
| 794   return *WasmModuleObject::New( | 794   return *WasmModuleObject::New( | 
| 795       isolate, Handle<WasmCompiledModule>::cast(compiled_module)); | 795       isolate, Handle<WasmCompiledModule>::cast(compiled_module)); | 
| 796 } | 796 } | 
| 797 | 797 | 
| 798 RUNTIME_FUNCTION(Runtime_ValidateWasmInstancesChain) { | 798 RUNTIME_FUNCTION(Runtime_ValidateWasmInstancesChain) { | 
| 799   HandleScope shs(isolate); | 799   HandleScope shs(isolate); | 
| 800   DCHECK(args.length() == 2); | 800   DCHECK_EQ(2, args.length()); | 
| 801   CONVERT_ARG_HANDLE_CHECKED_2(WasmModuleObject, module_obj, 0); | 801   CONVERT_ARG_HANDLE_CHECKED_2(WasmModuleObject, module_obj, 0); | 
| 802   CONVERT_ARG_HANDLE_CHECKED(Smi, instance_count, 1); | 802   CONVERT_ARG_HANDLE_CHECKED(Smi, instance_count, 1); | 
| 803   wasm::testing::ValidateInstancesChain(isolate, module_obj, | 803   wasm::testing::ValidateInstancesChain(isolate, module_obj, | 
| 804                                         instance_count->value()); | 804                                         instance_count->value()); | 
| 805   return isolate->heap()->ToBoolean(true); | 805   return isolate->heap()->ToBoolean(true); | 
| 806 } | 806 } | 
| 807 | 807 | 
| 808 RUNTIME_FUNCTION(Runtime_ValidateWasmModuleState) { | 808 RUNTIME_FUNCTION(Runtime_ValidateWasmModuleState) { | 
| 809   HandleScope shs(isolate); | 809   HandleScope shs(isolate); | 
| 810   DCHECK(args.length() == 1); | 810   DCHECK_EQ(1, args.length()); | 
| 811   CONVERT_ARG_HANDLE_CHECKED_2(WasmModuleObject, module_obj, 0); | 811   CONVERT_ARG_HANDLE_CHECKED_2(WasmModuleObject, module_obj, 0); | 
| 812   wasm::testing::ValidateModuleState(isolate, module_obj); | 812   wasm::testing::ValidateModuleState(isolate, module_obj); | 
| 813   return isolate->heap()->ToBoolean(true); | 813   return isolate->heap()->ToBoolean(true); | 
| 814 } | 814 } | 
| 815 | 815 | 
| 816 RUNTIME_FUNCTION(Runtime_ValidateWasmOrphanedInstance) { | 816 RUNTIME_FUNCTION(Runtime_ValidateWasmOrphanedInstance) { | 
| 817   HandleScope shs(isolate); | 817   HandleScope shs(isolate); | 
| 818   DCHECK(args.length() == 1); | 818   DCHECK_EQ(1, args.length()); | 
| 819   CONVERT_ARG_HANDLE_CHECKED_2(WasmInstanceObject, instance, 0); | 819   CONVERT_ARG_HANDLE_CHECKED_2(WasmInstanceObject, instance, 0); | 
| 820   wasm::testing::ValidateOrphanedInstance(isolate, instance); | 820   wasm::testing::ValidateOrphanedInstance(isolate, instance); | 
| 821   return isolate->heap()->ToBoolean(true); | 821   return isolate->heap()->ToBoolean(true); | 
| 822 } | 822 } | 
| 823 | 823 | 
| 824 }  // namespace internal | 824 }  // namespace internal | 
| 825 }  // namespace v8 | 825 }  // namespace v8 | 
| OLD | NEW | 
|---|