| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 081774f21a614d5ea61234735c7789098aa7da2c..6cf8610854f89c55a04b7abe986fc273a060d67c 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -38,6 +38,7 @@
|
| #include "compilation-cache.h"
|
| #include "compiler.h"
|
| #include "cpu.h"
|
| +#include "cpu-profiler.h"
|
| #include "dateparser-inl.h"
|
| #include "debug.h"
|
| #include "deoptimizer.h"
|
| @@ -466,7 +467,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteral) {
|
| constant_properties,
|
| should_have_fast_elements,
|
| has_function_literal);
|
| - if (boilerplate.is_null()) return Failure::Exception();
|
| + RETURN_IF_EMPTY_HANDLE(isolate, boilerplate);
|
| // Update the functions literal and return the boilerplate.
|
| literals->set(literals_index, *boilerplate);
|
| }
|
| @@ -492,7 +493,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteralShallow) {
|
| constant_properties,
|
| should_have_fast_elements,
|
| has_function_literal);
|
| - if (boilerplate.is_null()) return Failure::Exception();
|
| + RETURN_IF_EMPTY_HANDLE(isolate, boilerplate);
|
| // Update the functions literal and return the boilerplate.
|
| literals->set(literals_index, *boilerplate);
|
| }
|
| @@ -500,6 +501,30 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateObjectLiteralShallow) {
|
| }
|
|
|
|
|
| +static Handle<AllocationSite> GetLiteralAllocationSite(
|
| + Isolate* isolate,
|
| + Handle<FixedArray> literals,
|
| + int literals_index,
|
| + Handle<FixedArray> elements) {
|
| + // Check if boilerplate exists. If not, create it first.
|
| + Handle<Object> literal_site(literals->get(literals_index), isolate);
|
| + Handle<AllocationSite> site;
|
| + if (*literal_site == isolate->heap()->undefined_value()) {
|
| + ASSERT(*elements != isolate->heap()->empty_fixed_array());
|
| + Handle<Object> boilerplate =
|
| + Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements);
|
| + if (boilerplate.is_null()) return site;
|
| + site = isolate->factory()->NewAllocationSite();
|
| + site->set_payload(*boilerplate);
|
| + literals->set(literals_index, *site);
|
| + } else {
|
| + site = Handle<AllocationSite>::cast(literal_site);
|
| + }
|
| +
|
| + return site;
|
| +}
|
| +
|
| +
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| @@ -507,17 +532,12 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteral) {
|
| CONVERT_SMI_ARG_CHECKED(literals_index, 1);
|
| CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2);
|
|
|
| - // Check if boilerplate exists. If not, create it first.
|
| - Handle<Object> boilerplate(literals->get(literals_index), isolate);
|
| - if (*boilerplate == isolate->heap()->undefined_value()) {
|
| - ASSERT(*elements != isolate->heap()->empty_fixed_array());
|
| - boilerplate =
|
| - Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements);
|
| - if (boilerplate.is_null()) return Failure::Exception();
|
| - // Update the functions literal and return the boilerplate.
|
| - literals->set(literals_index, *boilerplate);
|
| - }
|
| - return JSObject::cast(*boilerplate)->DeepCopy(isolate);
|
| + Handle<AllocationSite> site = GetLiteralAllocationSite(isolate, literals,
|
| + literals_index, elements);
|
| + RETURN_IF_EMPTY_HANDLE(isolate, site);
|
| +
|
| + JSObject* boilerplate = JSObject::cast(site->payload());
|
| + return boilerplate->DeepCopy(isolate);
|
| }
|
|
|
|
|
| @@ -528,29 +548,24 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CreateArrayLiteralShallow) {
|
| CONVERT_SMI_ARG_CHECKED(literals_index, 1);
|
| CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2);
|
|
|
| - // Check if boilerplate exists. If not, create it first.
|
| - Handle<Object> boilerplate(literals->get(literals_index), isolate);
|
| - if (*boilerplate == isolate->heap()->undefined_value()) {
|
| - ASSERT(*elements != isolate->heap()->empty_fixed_array());
|
| - boilerplate =
|
| - Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements);
|
| - if (boilerplate.is_null()) return Failure::Exception();
|
| - // Update the functions literal and return the boilerplate.
|
| - literals->set(literals_index, *boilerplate);
|
| - }
|
| - if (JSObject::cast(*boilerplate)->elements()->map() ==
|
| + Handle<AllocationSite> site = GetLiteralAllocationSite(isolate, literals,
|
| + literals_index, elements);
|
| + RETURN_IF_EMPTY_HANDLE(isolate, site);
|
| +
|
| + JSObject* boilerplate = JSObject::cast(site->payload());
|
| + if (boilerplate->elements()->map() ==
|
| isolate->heap()->fixed_cow_array_map()) {
|
| isolate->counters()->cow_arrays_created_runtime()->Increment();
|
| }
|
|
|
| - JSObject* boilerplate_object = JSObject::cast(*boilerplate);
|
| - AllocationSiteMode mode = AllocationSiteInfo::GetMode(
|
| - boilerplate_object->GetElementsKind());
|
| + AllocationSiteMode mode = AllocationSite::GetMode(
|
| + boilerplate->GetElementsKind());
|
| if (mode == TRACK_ALLOCATION_SITE) {
|
| - return isolate->heap()->CopyJSObjectWithAllocationSite(boilerplate_object);
|
| + return isolate->heap()->CopyJSObjectWithAllocationSite(
|
| + boilerplate, *site);
|
| }
|
|
|
| - return isolate->heap()->CopyJSObject(boilerplate_object);
|
| + return isolate->heap()->CopyJSObject(boilerplate);
|
| }
|
|
|
|
|
| @@ -795,6 +810,12 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_TypedArrayInitialize) {
|
| CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset_object, 3);
|
| CONVERT_ARG_HANDLE_CHECKED(Object, byte_length_object, 4);
|
|
|
| + ASSERT(holder->GetInternalFieldCount() ==
|
| + v8::ArrayBufferView::kInternalFieldCount);
|
| + for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) {
|
| + holder->SetInternalField(i, Smi::FromInt(0));
|
| + }
|
| +
|
| ExternalArrayType arrayType;
|
| size_t elementSize;
|
| switch (arrayId) {
|
| @@ -1011,6 +1032,12 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DataViewInitialize) {
|
| CONVERT_ARG_HANDLE_CHECKED(Object, byte_offset, 2);
|
| CONVERT_ARG_HANDLE_CHECKED(Object, byte_length, 3);
|
|
|
| + ASSERT(holder->GetInternalFieldCount() ==
|
| + v8::ArrayBufferView::kInternalFieldCount);
|
| + for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) {
|
| + holder->SetInternalField(i, Smi::FromInt(0));
|
| + }
|
| +
|
| holder->set_buffer(*buffer);
|
| ASSERT(byte_offset->IsNumber());
|
| ASSERT(
|
| @@ -1450,31 +1477,29 @@ static inline Object* GetPrototypeSkipHiddenPrototypes(Isolate* isolate,
|
|
|
|
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_SetPrototype) {
|
| - SealHandleScope shs(isolate);
|
| + HandleScope scope(isolate);
|
| ASSERT(args.length() == 2);
|
| - CONVERT_ARG_CHECKED(JSObject, obj, 0);
|
| - CONVERT_ARG_CHECKED(Object, prototype, 1);
|
| + CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
|
| + CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1);
|
| if (FLAG_harmony_observation && obj->map()->is_observed()) {
|
| - HandleScope scope(isolate);
|
| - Handle<JSObject> receiver(obj);
|
| - Handle<Object> value(prototype, isolate);
|
| Handle<Object> old_value(
|
| - GetPrototypeSkipHiddenPrototypes(isolate, *receiver), isolate);
|
| + GetPrototypeSkipHiddenPrototypes(isolate, *obj), isolate);
|
|
|
| - MaybeObject* result = receiver->SetPrototype(*value, true);
|
| - Handle<Object> hresult;
|
| - if (!result->ToHandle(&hresult, isolate)) return result;
|
| + Handle<Object> result = JSObject::SetPrototype(obj, prototype, true);
|
| + RETURN_IF_EMPTY_HANDLE(isolate, result);
|
|
|
| Handle<Object> new_value(
|
| - GetPrototypeSkipHiddenPrototypes(isolate, *receiver), isolate);
|
| + GetPrototypeSkipHiddenPrototypes(isolate, *obj), isolate);
|
| if (!new_value->SameValue(*old_value)) {
|
| - JSObject::EnqueueChangeRecord(receiver, "prototype",
|
| + JSObject::EnqueueChangeRecord(obj, "prototype",
|
| isolate->factory()->proto_string(),
|
| old_value);
|
| }
|
| - return *hresult;
|
| + return *result;
|
| }
|
| - return obj->SetPrototype(prototype, true);
|
| + Handle<Object> result = JSObject::SetPrototype(obj, prototype, true);
|
| + RETURN_IF_EMPTY_HANDLE(isolate, result);
|
| + return *result;
|
| }
|
|
|
|
|
| @@ -1636,7 +1661,7 @@ static MaybeObject* GetOwnProperty(Isolate* isolate,
|
| elms->set(WRITABLE_INDEX, heap->ToBoolean((attrs & READ_ONLY) == 0));
|
| // GetProperty does access check.
|
| Handle<Object> value = GetProperty(isolate, obj, name);
|
| - if (value.is_null()) return Failure::Exception();
|
| + RETURN_IF_EMPTY_HANDLE(isolate, value);
|
| elms->set(VALUE_INDEX, *value);
|
| } else {
|
| // Access checks are performed for both accessors separately.
|
| @@ -1701,7 +1726,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpCompile) {
|
| CONVERT_ARG_HANDLE_CHECKED(String, flags, 2);
|
| Handle<Object> result =
|
| RegExpImpl::Compile(re, pattern, flags);
|
| - if (result.is_null()) return Failure::Exception();
|
| + RETURN_IF_EMPTY_HANDLE(isolate, result);
|
| return *result;
|
| }
|
|
|
| @@ -2110,7 +2135,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstGlobal) {
|
| } else if (lookup.IsNormal()) {
|
| if (global->GetNormalizedProperty(&lookup)->IsTheHole() ||
|
| !lookup.IsReadOnly()) {
|
| - global->SetNormalizedProperty(&lookup, *value);
|
| + HandleScope scope(isolate);
|
| + JSObject::SetNormalizedProperty(Handle<JSObject>(global), &lookup, value);
|
| }
|
| } else {
|
| // Ignore re-initialization of constants that have already been
|
| @@ -2199,7 +2225,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstContextSlot) {
|
| }
|
| } else if (lookup.IsNormal()) {
|
| if (object->GetNormalizedProperty(&lookup)->IsTheHole()) {
|
| - object->SetNormalizedProperty(&lookup, *value);
|
| + JSObject::SetNormalizedProperty(object, &lookup, value);
|
| }
|
| } else {
|
| // We should not reach here. Any real, named property should be
|
| @@ -2251,7 +2277,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpExec) {
|
| subject,
|
| index,
|
| last_match_info);
|
| - if (result.is_null()) return Failure::Exception();
|
| + RETURN_IF_EMPTY_HANDLE(isolate, result);
|
| return *result;
|
| }
|
|
|
| @@ -3600,8 +3626,8 @@ MUST_USE_RESULT static MaybeObject* StringReplaceGlobalAtomRegExpWithString(
|
| ASSERT(subject->IsFlat());
|
| ASSERT(replacement->IsFlat());
|
|
|
| - Zone zone(isolate);
|
| - ZoneList<int> indices(8, &zone);
|
| + ZoneScope zone_scope(isolate->runtime_zone());
|
| + ZoneList<int> indices(8, zone_scope.zone());
|
| ASSERT_EQ(JSRegExp::ATOM, pattern_regexp->TypeTag());
|
| String* pattern =
|
| String::cast(pattern_regexp->DataAt(JSRegExp::kAtomPatternIndex));
|
| @@ -3610,7 +3636,7 @@ MUST_USE_RESULT static MaybeObject* StringReplaceGlobalAtomRegExpWithString(
|
| int replacement_len = replacement->length();
|
|
|
| FindStringIndicesDispatch(
|
| - isolate, *subject, pattern, &indices, 0xffffffff, &zone);
|
| + isolate, *subject, pattern, &indices, 0xffffffff, zone_scope.zone());
|
|
|
| int matches = indices.length();
|
| if (matches == 0) return *subject;
|
| @@ -3686,8 +3712,8 @@ MUST_USE_RESULT static MaybeObject* StringReplaceGlobalRegExpWithString(
|
| int subject_length = subject->length();
|
|
|
| // CompiledReplacement uses zone allocation.
|
| - Zone zone(isolate);
|
| - CompiledReplacement compiled_replacement(&zone);
|
| + ZoneScope zone_scope(isolate->runtime_zone());
|
| + CompiledReplacement compiled_replacement(zone_scope.zone());
|
| bool simple_replace = compiled_replacement.Compile(replacement,
|
| capture_count,
|
| subject_length);
|
| @@ -4069,6 +4095,7 @@ static int StringMatchBackwards(Vector<const schar> subject,
|
| return -1;
|
| }
|
|
|
| +
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLastIndexOf) {
|
| HandleScope scope(isolate);
|
| ASSERT(args.length() == 3);
|
| @@ -4220,14 +4247,14 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringMatch) {
|
|
|
| int capture_count = regexp->CaptureCount();
|
|
|
| - Zone zone(isolate);
|
| - ZoneList<int> offsets(8, &zone);
|
| + ZoneScope zone_scope(isolate->runtime_zone());
|
| + ZoneList<int> offsets(8, zone_scope.zone());
|
|
|
| while (true) {
|
| int32_t* match = global_cache.FetchNext();
|
| if (match == NULL) break;
|
| - offsets.Add(match[0], &zone); // start
|
| - offsets.Add(match[1], &zone); // end
|
| + offsets.Add(match[0], zone_scope.zone()); // start
|
| + offsets.Add(match[1], zone_scope.zone()); // end
|
| }
|
|
|
| if (global_cache.HasException()) return Failure::Exception();
|
| @@ -4790,6 +4817,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineAccessorProperty) {
|
| return isolate->heap()->undefined_value();
|
| }
|
|
|
| +
|
| // Implements part of 8.12.9 DefineOwnProperty.
|
| // There are 3 cases that lead here:
|
| // Step 4a - define a new data property.
|
| @@ -5189,8 +5217,15 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) {
|
| CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 3);
|
| CONVERT_SMI_ARG_CHECKED(literal_index, 4);
|
|
|
| - Object* raw_boilerplate_object = literals->get(literal_index);
|
| - Handle<JSArray> boilerplate_object(JSArray::cast(raw_boilerplate_object));
|
| + Object* raw_literal_cell = literals->get(literal_index);
|
| + JSArray* boilerplate = NULL;
|
| + if (raw_literal_cell->IsAllocationSite()) {
|
| + AllocationSite* site = AllocationSite::cast(raw_literal_cell);
|
| + boilerplate = JSArray::cast(site->payload());
|
| + } else {
|
| + boilerplate = JSArray::cast(raw_literal_cell);
|
| + }
|
| + Handle<JSArray> boilerplate_object(boilerplate);
|
| ElementsKind elements_kind = object->GetElementsKind();
|
| ASSERT(IsFastElementsKind(elements_kind));
|
| // Smis should never trigger transitions.
|
| @@ -6312,18 +6347,18 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringSplit) {
|
|
|
| static const int kMaxInitialListCapacity = 16;
|
|
|
| - Zone zone(isolate);
|
| + ZoneScope zone_scope(isolate->runtime_zone());
|
|
|
| // Find (up to limit) indices of separator and end-of-string in subject
|
| int initial_capacity = Min<uint32_t>(kMaxInitialListCapacity, limit);
|
| - ZoneList<int> indices(initial_capacity, &zone);
|
| + ZoneList<int> indices(initial_capacity, zone_scope.zone());
|
| if (!pattern->IsFlat()) FlattenString(pattern);
|
|
|
| FindStringIndicesDispatch(isolate, *subject, *pattern,
|
| - &indices, limit, &zone);
|
| + &indices, limit, zone_scope.zone());
|
|
|
| if (static_cast<uint32_t>(indices.length()) < limit) {
|
| - indices.Add(subject_length, &zone);
|
| + indices.Add(subject_length, zone_scope.zone());
|
| }
|
|
|
| // The list indices now contains the end of each part to create.
|
| @@ -7464,6 +7499,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_log) {
|
| return isolate->transcendental_cache()->Get(TranscendentalCache::LOG, x);
|
| }
|
|
|
| +
|
| // Slow version of Math.pow. We check for fast paths for special cases.
|
| // Used if SSE2/VFP3 is not available.
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow) {
|
| @@ -7486,6 +7522,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow) {
|
| return isolate->heap()->AllocateHeapNumber(result);
|
| }
|
|
|
| +
|
| // Fast version of Math.pow if we know that y is not an integer and y is not
|
| // -0.5 or 0.5. Used as slow case from full codegen.
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_pow_cfunction) {
|
| @@ -8314,8 +8351,13 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CompleteOptimization) {
|
| ASSERT(args.length() == 1);
|
| CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
|
| if (FLAG_parallel_recompilation && V8::UseCrankshaft()) {
|
| - // While function is in optimization pipeline, it is marked with builtins.
|
| - while (function->code()->kind() == Code::BUILTIN) {
|
| + // While function is in optimization pipeline, it is marked accordingly.
|
| + // Note that if the debugger is activated during parallel recompilation,
|
| + // the function will be marked with the lazy-recompile builtin, which is
|
| + // not related to parallel recompilation.
|
| + while (function->IsMarkedForParallelRecompilation() ||
|
| + function->IsInRecompileQueue() ||
|
| + function->IsMarkedForInstallingRecompiledCode()) {
|
| isolate->optimizing_compiler_thread()->InstallOptimizedFunctions();
|
| OS::Sleep(50);
|
| }
|
| @@ -8848,6 +8890,7 @@ struct ObjectPair {
|
| MaybeObject* y;
|
| };
|
|
|
| +
|
| static inline ObjectPair MakePair(MaybeObject* x, MaybeObject* y) {
|
| ObjectPair result = {x, y};
|
| // Pointers x and y returned in rax and rdx, in AMD-x64-abi.
|
| @@ -9373,7 +9416,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_CompileString) {
|
| ? ONLY_SINGLE_FUNCTION_LITERAL : NO_PARSE_RESTRICTION;
|
| Handle<SharedFunctionInfo> shared = Compiler::CompileEval(
|
| source, context, true, CLASSIC_MODE, restriction, RelocInfo::kNoPosition);
|
| - if (shared.is_null()) return Failure::Exception();
|
| + RETURN_IF_EMPTY_HANDLE(isolate, shared);
|
| Handle<JSFunction> fun =
|
| isolate->factory()->NewFunctionFromSharedFunctionInfo(shared,
|
| context,
|
| @@ -9410,7 +9453,8 @@ static ObjectPair CompileGlobalEval(Isolate* isolate,
|
| language_mode,
|
| NO_PARSE_RESTRICTION,
|
| scope_position);
|
| - if (shared.is_null()) return MakePair(Failure::Exception(), NULL);
|
| + RETURN_IF_EMPTY_HANDLE_VALUE(isolate, shared,
|
| + MakePair(Failure::Exception(), NULL));
|
| Handle<JSFunction> compiled =
|
| isolate->factory()->NewFunctionFromSharedFunctionInfo(
|
| shared, context, NOT_TENURED);
|
| @@ -10229,6 +10273,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalPrint) {
|
| return string;
|
| }
|
|
|
| +
|
| // Moves all own elements of an object, that are below a limit, to positions
|
| // starting at zero. All undefined values are placed after non-undefined values,
|
| // and are followed by non-existing element. Does not change the length
|
| @@ -11846,6 +11891,7 @@ static MaybeObject* MaterializeScopeDetails(Isolate* isolate,
|
| return *isolate->factory()->NewJSArrayWithElements(details);
|
| }
|
|
|
| +
|
| // Return an array with scope details
|
| // args[0]: number: break id
|
| // args[1]: number: frame index
|
| @@ -12097,14 +12143,28 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDisableBreak) {
|
| }
|
|
|
|
|
| +static bool IsPositionAlignmentCodeCorrect(int alignment) {
|
| + return alignment == STATEMENT_ALIGNED || alignment == BREAK_POSITION_ALIGNED;
|
| +}
|
| +
|
| +
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_GetBreakLocations) {
|
| HandleScope scope(isolate);
|
| - ASSERT(args.length() == 1);
|
| + ASSERT(args.length() == 2);
|
|
|
| CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0);
|
| + CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[1]);
|
| +
|
| + if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) {
|
| + return isolate->ThrowIllegalOperation();
|
| + }
|
| + BreakPositionAlignment alignment =
|
| + static_cast<BreakPositionAlignment>(statement_aligned_code);
|
| +
|
| Handle<SharedFunctionInfo> shared(fun->shared());
|
| // Find the number of break points
|
| - Handle<Object> break_locations = Debug::GetSourceBreakLocations(shared);
|
| + Handle<Object> break_locations =
|
| + Debug::GetSourceBreakLocations(shared, alignment);
|
| if (break_locations->IsUndefined()) return isolate->heap()->undefined_value();
|
| // Return array as JS array
|
| return *isolate->factory()->NewJSArrayWithElements(
|
| @@ -12137,14 +12197,22 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFunctionBreakPoint) {
|
| // GetScriptFromScriptData.
|
| // args[0]: script to set break point in
|
| // args[1]: number: break source position (within the script source)
|
| -// args[2]: number: break point object
|
| +// args[2]: number, breakpoint position alignment
|
| +// args[3]: number: break point object
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_SetScriptBreakPoint) {
|
| HandleScope scope(isolate);
|
| - ASSERT(args.length() == 3);
|
| + ASSERT(args.length() == 4);
|
| CONVERT_ARG_HANDLE_CHECKED(JSValue, wrapper, 0);
|
| CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
|
| RUNTIME_ASSERT(source_position >= 0);
|
| - Handle<Object> break_point_object_arg = args.at<Object>(2);
|
| + CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[2]);
|
| + Handle<Object> break_point_object_arg = args.at<Object>(3);
|
| +
|
| + if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) {
|
| + return isolate->ThrowIllegalOperation();
|
| + }
|
| + BreakPositionAlignment alignment =
|
| + static_cast<BreakPositionAlignment>(statement_aligned_code);
|
|
|
| // Get the script from the script wrapper.
|
| RUNTIME_ASSERT(wrapper->value()->IsScript());
|
| @@ -12152,7 +12220,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SetScriptBreakPoint) {
|
|
|
| // Set break point.
|
| if (!isolate->debug()->SetBreakPointForScript(script, break_point_object_arg,
|
| - &source_position)) {
|
| + &source_position,
|
| + alignment)) {
|
| return isolate->heap()->undefined_value();
|
| }
|
|
|
| @@ -12387,7 +12456,7 @@ static MaybeObject* DebugEvaluate(Isolate* isolate,
|
| CLASSIC_MODE,
|
| NO_PARSE_RESTRICTION,
|
| RelocInfo::kNoPosition);
|
| - if (shared.is_null()) return Failure::Exception();
|
| + RETURN_IF_EMPTY_HANDLE(isolate, shared);
|
|
|
| Handle<JSFunction> eval_fun =
|
| isolate->factory()->NewFunctionFromSharedFunctionInfo(
|
| @@ -12929,6 +12998,7 @@ static int FindSharedFunctionInfosForScript(HeapIterator* iterator,
|
| return counter;
|
| }
|
|
|
| +
|
| // For a script finds all SharedFunctionInfo's in the heap that points
|
| // to this script. Returns JSArray of SharedFunctionInfo wrapped
|
| // in OpaqueReferences.
|
| @@ -12974,6 +13044,7 @@ RUNTIME_FUNCTION(MaybeObject*,
|
| return *result;
|
| }
|
|
|
| +
|
| // For a script calculates compilation information about all its functions.
|
| // The script source is explicitly specified by the second argument.
|
| // The source of the actual script is not used, however it is important that
|
| @@ -13000,6 +13071,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditGatherCompileInfo) {
|
| return result;
|
| }
|
|
|
| +
|
| // Changes the source of the script to a new_source.
|
| // If old_script_name is provided (i.e. is a String), also creates a copy of
|
| // the script with its original source and sends notification to debugger.
|
| @@ -13047,6 +13119,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceFunctionCode) {
|
| return LiveEdit::ReplaceFunctionCode(new_compile_info, shared_info);
|
| }
|
|
|
| +
|
| // Connects SharedFunctionInfo to another script.
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditFunctionSetScript) {
|
| HandleScope scope(isolate);
|
| @@ -13121,6 +13194,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCheckAndDropActivations) {
|
| return *LiveEdit::CheckAndDropActivations(shared_array, do_drop);
|
| }
|
|
|
| +
|
| // Compares 2 strings line-by-line, then token-wise and returns diff in form
|
| // of JSArray of triplets (pos1, pos1_end, pos2_end) describing list
|
| // of diff chunks.
|
| @@ -13765,19 +13839,21 @@ static MaybeObject* ArrayConstructorCommon(Isolate* isolate,
|
| MaybeObject* maybe_array;
|
| if (!type_info.is_null() &&
|
| *type_info != isolate->heap()->undefined_value() &&
|
| - Cell::cast(*type_info)->value()->IsSmi() &&
|
| + Cell::cast(*type_info)->value()->IsAllocationSite() &&
|
| can_use_type_feedback) {
|
| - Cell* cell = Cell::cast(*type_info);
|
| - Smi* smi = Smi::cast(cell->value());
|
| - ElementsKind to_kind = static_cast<ElementsKind>(smi->value());
|
| + Handle<Cell> cell = Handle<Cell>::cast(type_info);
|
| + Handle<AllocationSite> site = Handle<AllocationSite>(
|
| + AllocationSite::cast(cell->value()), isolate);
|
| + ASSERT(!site->IsLiteralSite());
|
| + ElementsKind to_kind = site->GetElementsKindPayload();
|
| if (holey && !IsFastHoleyElementsKind(to_kind)) {
|
| to_kind = GetHoleyElementsKind(to_kind);
|
| // Update the allocation site info to reflect the advice alteration.
|
| - cell->set_value(Smi::FromInt(to_kind));
|
| + site->SetElementsKindPayload(to_kind);
|
| }
|
|
|
| maybe_array = isolate->heap()->AllocateJSObjectWithAllocationSite(
|
| - *constructor, type_info);
|
| + *constructor, site);
|
| if (!maybe_array->To(&array)) return maybe_array;
|
| } else {
|
| maybe_array = isolate->heap()->AllocateJSObject(*constructor);
|
|
|