| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 092e91edc56d87778e09efe300b5f076ab8dfff0..e763d435cc985e80a21f0fe43b4e11439c534e6b 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -554,27 +554,55 @@ static Handle<AllocationSite> GetLiteralAllocationSite(
|
| }
|
|
|
|
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) {
|
| - HandleScope scope(isolate);
|
| - ASSERT(args.length() == 3);
|
| - CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0);
|
| - CONVERT_SMI_ARG_CHECKED(literals_index, 1);
|
| - CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2);
|
| -
|
| +static MaybeObject* CreateArrayLiteralImpl(Isolate* isolate,
|
| + Handle<FixedArray> literals,
|
| + int literals_index,
|
| + Handle<FixedArray> elements,
|
| + int flags) {
|
| Handle<AllocationSite> site = GetLiteralAllocationSite(isolate, literals,
|
| literals_index, elements);
|
| RETURN_IF_EMPTY_HANDLE(isolate, site);
|
|
|
| + bool enable_mementos = (flags & ArrayLiteral::kDisableMementos) == 0;
|
| Handle<JSObject> boilerplate(JSObject::cast(site->transition_info()));
|
| - AllocationSiteUsageContext usage_context(isolate, site, true);
|
| + AllocationSiteUsageContext usage_context(isolate, site, enable_mementos);
|
| usage_context.EnterNewScope();
|
| - Handle<JSObject> copy = JSObject::DeepCopy(boilerplate, &usage_context);
|
| + JSObject::DeepCopyHints hints = (flags & ArrayLiteral::kShallowElements) == 0
|
| + ? JSObject::kNoHints
|
| + : JSObject::kObjectIsShallowArray;
|
| + Handle<JSObject> copy = JSObject::DeepCopy(boilerplate, &usage_context,
|
| + hints);
|
| usage_context.ExitScope(site, boilerplate);
|
| RETURN_IF_EMPTY_HANDLE(isolate, copy);
|
| return *copy;
|
| }
|
|
|
|
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) {
|
| + HandleScope scope(isolate);
|
| + ASSERT(args.length() == 4);
|
| + CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0);
|
| + CONVERT_SMI_ARG_CHECKED(literals_index, 1);
|
| + CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2);
|
| + CONVERT_SMI_ARG_CHECKED(flags, 3);
|
| +
|
| + return CreateArrayLiteralImpl(isolate, literals, literals_index, elements,
|
| + flags);
|
| +}
|
| +
|
| +
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralStubBailout) {
|
| + HandleScope scope(isolate);
|
| + ASSERT(args.length() == 3);
|
| + CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0);
|
| + CONVERT_SMI_ARG_CHECKED(literals_index, 1);
|
| + CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2);
|
| +
|
| + return CreateArrayLiteralImpl(isolate, literals, literals_index, elements,
|
| + ArrayLiteral::kShallowElements);
|
| +}
|
| +
|
| +
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateSymbol) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 1);
|
| @@ -835,20 +863,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayBufferIsView) {
|
| }
|
|
|
|
|
| -enum TypedArrayId {
|
| - // arrayIds below should be synchromized with typedarray.js natives.
|
| - ARRAY_ID_UINT8 = 1,
|
| - ARRAY_ID_INT8 = 2,
|
| - ARRAY_ID_UINT16 = 3,
|
| - ARRAY_ID_INT16 = 4,
|
| - ARRAY_ID_UINT32 = 5,
|
| - ARRAY_ID_INT32 = 6,
|
| - ARRAY_ID_FLOAT32 = 7,
|
| - ARRAY_ID_FLOAT64 = 8,
|
| - ARRAY_ID_UINT8C = 9
|
| -};
|
| -
|
| -static void ArrayIdToTypeAndSize(
|
| +void Runtime::ArrayIdToTypeAndSize(
|
| int arrayId, ExternalArrayType* array_type, size_t* element_size) {
|
| switch (arrayId) {
|
| case ARRAY_ID_UINT8:
|
| @@ -910,7 +925,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) {
|
|
|
| ExternalArrayType array_type = kExternalByteArray; // Bogus initialization.
|
| size_t element_size = 1; // Bogus initialization.
|
| - ArrayIdToTypeAndSize(arrayId, &array_type, &element_size);
|
| + Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &element_size);
|
|
|
| holder->set_buffer(*buffer);
|
| holder->set_byte_offset(*byte_offset_object);
|
| @@ -962,7 +977,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitializeFromArrayLike) {
|
|
|
| ExternalArrayType array_type = kExternalByteArray; // Bogus initialization.
|
| size_t element_size = 1; // Bogus initialization.
|
| - ArrayIdToTypeAndSize(arrayId, &array_type, &element_size);
|
| + Runtime::ArrayIdToTypeAndSize(arrayId, &array_type, &element_size);
|
|
|
| Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer();
|
| size_t length = NumberToSize(isolate, *length_obj);
|
| @@ -2648,6 +2663,14 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SpecialArrayFunctions) {
|
| }
|
|
|
|
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_IsCallable) {
|
| + SealHandleScope shs(isolate);
|
| + ASSERT(args.length() == 1);
|
| + CONVERT_ARG_CHECKED(Object, obj, 0);
|
| + return isolate->heap()->ToBoolean(obj->IsCallable());
|
| +}
|
| +
|
| +
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_IsClassicModeFunction) {
|
| SealHandleScope shs(isolate);
|
| ASSERT(args.length() == 1);
|
| @@ -4448,10 +4471,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SubString) {
|
| RUNTIME_ASSERT(start >= 0);
|
| RUNTIME_ASSERT(end <= value->length());
|
| isolate->counters()->sub_string_runtime()->Increment();
|
| - if (end - start == 1) {
|
| - return isolate->heap()->LookupSingleCharacterStringFromCode(
|
| - value->Get(start));
|
| - }
|
| return value->SubString(start, end);
|
| }
|
|
|
| @@ -7636,7 +7655,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_acos) {
|
| isolate->counters()->math_acos()->Increment();
|
|
|
| CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| - return isolate->transcendental_cache()->Get(TranscendentalCache::ACOS, x);
|
| + return isolate->heap()->AllocateHeapNumber(acos(x));
|
| }
|
|
|
|
|
| @@ -7646,7 +7665,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_asin) {
|
| isolate->counters()->math_asin()->Increment();
|
|
|
| CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| - return isolate->transcendental_cache()->Get(TranscendentalCache::ASIN, x);
|
| + return isolate->heap()->AllocateHeapNumber(asin(x));
|
| }
|
|
|
|
|
| @@ -7656,7 +7675,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_atan) {
|
| isolate->counters()->math_atan()->Increment();
|
|
|
| CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| - return isolate->transcendental_cache()->Get(TranscendentalCache::ATAN, x);
|
| + return isolate->heap()->AllocateHeapNumber(atan(x));
|
| }
|
|
|
|
|
| @@ -7686,26 +7705,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_atan2) {
|
| }
|
|
|
|
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_ceil) {
|
| - SealHandleScope shs(isolate);
|
| - ASSERT(args.length() == 1);
|
| - isolate->counters()->math_ceil()->Increment();
|
| -
|
| - CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| - return isolate->heap()->NumberFromDouble(ceiling(x));
|
| -}
|
| -
|
| -
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_cos) {
|
| - SealHandleScope shs(isolate);
|
| - ASSERT(args.length() == 1);
|
| - isolate->counters()->math_cos()->Increment();
|
| -
|
| - CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| - return isolate->transcendental_cache()->Get(TranscendentalCache::COS, x);
|
| -}
|
| -
|
| -
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_exp) {
|
| SealHandleScope shs(isolate);
|
| ASSERT(args.length() == 1);
|
| @@ -7733,7 +7732,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_log) {
|
| isolate->counters()->math_log()->Increment();
|
|
|
| CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| - return isolate->transcendental_cache()->Get(TranscendentalCache::LOG, x);
|
| + return isolate->heap()->AllocateHeapNumber(fast_log(x));
|
| }
|
|
|
|
|
| @@ -7822,16 +7821,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_RoundNumber) {
|
| }
|
|
|
|
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_sin) {
|
| - SealHandleScope shs(isolate);
|
| - ASSERT(args.length() == 1);
|
| - isolate->counters()->math_sin()->Increment();
|
| -
|
| - CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| - return isolate->transcendental_cache()->Get(TranscendentalCache::SIN, x);
|
| -}
|
| -
|
| -
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_sqrt) {
|
| SealHandleScope shs(isolate);
|
| ASSERT(args.length() == 1);
|
| @@ -7842,16 +7831,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_sqrt) {
|
| }
|
|
|
|
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_tan) {
|
| - SealHandleScope shs(isolate);
|
| - ASSERT(args.length() == 1);
|
| - isolate->counters()->math_tan()->Increment();
|
| -
|
| - CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| - return isolate->transcendental_cache()->Get(TranscendentalCache::TAN, x);
|
| -}
|
| -
|
| -
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_DateMakeDay) {
|
| SealHandleScope shs(isolate);
|
| ASSERT(args.length() == 2);
|
| @@ -8225,7 +8204,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_NewObjectFromBound) {
|
| bool exception = false;
|
| Handle<Object> result =
|
| Execution::New(Handle<JSFunction>::cast(bound_function),
|
| - total_argc, *param_data, &exception);
|
| + total_argc, param_data.get(), &exception);
|
| if (exception) {
|
| return Failure::Exception();
|
| }
|
| @@ -8398,10 +8377,11 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ConcurrentRecompile) {
|
| function->ReplaceCode(function->shared()->code());
|
| return isolate->heap()->undefined_value();
|
| }
|
| - function->shared()->code()->set_profiler_ticks(0);
|
| + Handle<Code> shared_code(function->shared()->code());
|
| + shared_code->set_profiler_ticks(0);
|
| ASSERT(isolate->concurrent_recompilation_enabled());
|
| - if (!Compiler::RecompileConcurrent(function)) {
|
| - function->ReplaceCode(function->shared()->code());
|
| + if (!Compiler::RecompileConcurrent(function, shared_code)) {
|
| + function->ReplaceCode(*shared_code);
|
| }
|
| return isolate->heap()->undefined_value();
|
| }
|
| @@ -8651,20 +8631,27 @@ static bool IsSuitableForOnStackReplacement(Isolate* isolate,
|
|
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileForOnStackReplacement) {
|
| HandleScope scope(isolate);
|
| - ASSERT(args.length() == 2);
|
| + ASSERT(args.length() == 1);
|
| CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
|
| - CONVERT_NUMBER_CHECKED(uint32_t, pc_offset, Uint32, args[1]);
|
| Handle<Code> unoptimized(function->shared()->code(), isolate);
|
|
|
| -#ifdef DEBUG
|
| + // Passing the PC in the javascript frame from the caller directly is
|
| + // not GC safe, so we walk the stack to get it.
|
| JavaScriptFrameIterator it(isolate);
|
| JavaScriptFrame* frame = it.frame();
|
| + if (!unoptimized->contains(frame->pc())) {
|
| + // Code on the stack may not be the code object referenced by the shared
|
| + // function info. It may have been replaced to include deoptimization data.
|
| + unoptimized = Handle<Code>(frame->LookupCode());
|
| + }
|
| +
|
| + uint32_t pc_offset = static_cast<uint32_t>(frame->pc() -
|
| + unoptimized->instruction_start());
|
| +
|
| +#ifdef DEBUG
|
| ASSERT_EQ(frame->function(), *function);
|
| ASSERT_EQ(frame->LookupCode(), *unoptimized);
|
| ASSERT(unoptimized->contains(frame->pc()));
|
| -
|
| - ASSERT(pc_offset ==
|
| - static_cast<uint32_t>(frame->pc() - unoptimized->instruction_start()));
|
| #endif // DEBUG
|
|
|
| // We're not prepared to handle a function with arguments object.
|
| @@ -8690,12 +8677,12 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileForOnStackReplacement) {
|
|
|
| if (job == NULL) {
|
| if (IsSuitableForOnStackReplacement(isolate, function, unoptimized) &&
|
| - Compiler::RecompileConcurrent(function, pc_offset)) {
|
| + Compiler::RecompileConcurrent(function, unoptimized, pc_offset)) {
|
| if (function->IsMarkedForLazyRecompilation() ||
|
| function->IsMarkedForConcurrentRecompilation()) {
|
| // Prevent regular recompilation if we queue this for OSR.
|
| // TODO(yangguo): remove this as soon as OSR becomes one-shot.
|
| - function->ReplaceCode(*unoptimized);
|
| + function->ReplaceCode(function->shared()->code());
|
| }
|
| return NULL;
|
| }
|
| @@ -13551,7 +13538,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFlags) {
|
| CONVERT_ARG_CHECKED(String, arg, 0);
|
| SmartArrayPointer<char> flags =
|
| arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
|
| - FlagList::SetFlagsFromString(*flags, StrLength(*flags));
|
| + FlagList::SetFlagsFromString(flags.get(), StrLength(flags.get()));
|
| return isolate->heap()->undefined_value();
|
| }
|
|
|
| @@ -14322,6 +14309,18 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Abort) {
|
| }
|
|
|
|
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_AbortJS) {
|
| + HandleScope scope(isolate);
|
| + ASSERT(args.length() == 1);
|
| + CONVERT_ARG_HANDLE_CHECKED(String, message, 0);
|
| + OS::PrintError("abort: %s\n", message->ToCString().get());
|
| + isolate->PrintStack(stderr);
|
| + OS::Abort();
|
| + UNREACHABLE();
|
| + return NULL;
|
| +}
|
| +
|
| +
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_FlattenString) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 1);
|
| @@ -14614,11 +14613,13 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SetIsObserved) {
|
| }
|
|
|
|
|
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_SetObserverDeliveryPending) {
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_SetMicrotaskPending) {
|
| SealHandleScope shs(isolate);
|
| - ASSERT(args.length() == 0);
|
| - isolate->set_observer_delivery_pending(true);
|
| - return isolate->heap()->undefined_value();
|
| + ASSERT(args.length() == 1);
|
| + CONVERT_BOOLEAN_ARG_CHECKED(new_state, 0);
|
| + bool old_state = isolate->microtask_pending();
|
| + isolate->set_microtask_pending(new_state);
|
| + return isolate->heap()->ToBoolean(old_state);
|
| }
|
|
|
|
|
|
|