| Index: src/runtime.cc
|
| ===================================================================
|
| --- src/runtime.cc (revision 6941)
|
| +++ src/runtime.cc (working copy)
|
| @@ -339,13 +339,18 @@
|
| Handle<Object> result;
|
| uint32_t element_index = 0;
|
| if (key->IsSymbol()) {
|
| - // If key is a symbol it is not an array element.
|
| - Handle<String> name(String::cast(*key));
|
| - ASSERT(!name->AsArrayIndex(&element_index));
|
| - result = SetProperty(boilerplate, name, value, NONE);
|
| + if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) {
|
| + // Array index as string (uint32).
|
| + result = SetOwnElement(boilerplate, element_index, value);
|
| + } else {
|
| + Handle<String> name(String::cast(*key));
|
| + ASSERT(!name->AsArrayIndex(&element_index));
|
| + result = SetLocalPropertyIgnoreAttributes(boilerplate, name,
|
| + value, NONE);
|
| + }
|
| } else if (key->ToArrayIndex(&element_index)) {
|
| // Array index (uint32).
|
| - result = SetElement(boilerplate, element_index, value);
|
| + result = SetOwnElement(boilerplate, element_index, value);
|
| } else {
|
| // Non-uint32 number.
|
| ASSERT(key->IsNumber());
|
| @@ -355,7 +360,8 @@
|
| const char* str = DoubleToCString(num, buffer);
|
| Handle<String> name =
|
| isolate->factory()->NewStringFromAscii(CStrVector(str));
|
| - result = SetProperty(boilerplate, name, value, NONE);
|
| + result = SetLocalPropertyIgnoreAttributes(boilerplate, name,
|
| + value, NONE);
|
| }
|
| // If setting the property on the boilerplate throws an
|
| // exception, the exception is converted to an empty handle in
|
| @@ -1033,7 +1039,7 @@
|
| // of callbacks in the prototype chain (this rules out using
|
| // SetProperty). Also, we must use the handle-based version to
|
| // avoid GC issues.
|
| - IgnoreAttributesAndSetLocalProperty(global, name, value, attributes);
|
| + SetLocalPropertyIgnoreAttributes(global, name, value, attributes);
|
| }
|
| }
|
|
|
| @@ -1151,7 +1157,7 @@
|
| // to assign to the property. When adding the property we take
|
| // special precautions to always add it as a local property even in
|
| // case of callbacks in the prototype chain (this rules out using
|
| - // SetProperty). We have IgnoreAttributesAndSetLocalProperty for
|
| + // SetProperty). We have SetLocalPropertyIgnoreAttributes for
|
| // this.
|
| // Note that objects can have hidden prototypes, so we need to traverse
|
| // the whole chain of hidden prototypes to do a 'local' lookup.
|
| @@ -1214,9 +1220,9 @@
|
|
|
| global = isolate->context()->global();
|
| if (assign) {
|
| - return global->IgnoreAttributesAndSetLocalProperty(*name,
|
| - args[1],
|
| - attributes);
|
| + return global->SetLocalPropertyIgnoreAttributes(*name,
|
| + args[1],
|
| + attributes);
|
| }
|
| return isolate->heap()->undefined_value();
|
| }
|
| @@ -1243,13 +1249,13 @@
|
| // there, we add the property and take special precautions to always
|
| // add it as a local property even in case of callbacks in the
|
| // prototype chain (this rules out using SetProperty).
|
| - // We use IgnoreAttributesAndSetLocalProperty instead
|
| + // We use SetLocalPropertyIgnoreAttributes instead
|
| LookupResult lookup;
|
| global->LocalLookup(*name, &lookup);
|
| if (!lookup.IsProperty()) {
|
| - return global->IgnoreAttributesAndSetLocalProperty(*name,
|
| - *value,
|
| - attributes);
|
| + return global->SetLocalPropertyIgnoreAttributes(*name,
|
| + *value,
|
| + attributes);
|
| }
|
|
|
| // Determine if this is a redeclaration of something not
|
| @@ -1525,27 +1531,27 @@
|
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
|
| Heap* heap = isolate->heap();
|
| MaybeObject* result;
|
| - result = regexp->IgnoreAttributesAndSetLocalProperty(heap->source_symbol(),
|
| - source,
|
| - final);
|
| + result = regexp->SetLocalPropertyIgnoreAttributes(heap->source_symbol(),
|
| + source,
|
| + final);
|
| ASSERT(!result->IsFailure());
|
| - result = regexp->IgnoreAttributesAndSetLocalProperty(heap->global_symbol(),
|
| - global,
|
| - final);
|
| + result = regexp->SetLocalPropertyIgnoreAttributes(heap->global_symbol(),
|
| + global,
|
| + final);
|
| ASSERT(!result->IsFailure());
|
| result =
|
| - regexp->IgnoreAttributesAndSetLocalProperty(heap->ignore_case_symbol(),
|
| - ignoreCase,
|
| - final);
|
| + regexp->SetLocalPropertyIgnoreAttributes(heap->ignore_case_symbol(),
|
| + ignoreCase,
|
| + final);
|
| ASSERT(!result->IsFailure());
|
| - result = regexp->IgnoreAttributesAndSetLocalProperty(heap->multiline_symbol(),
|
| - multiline,
|
| - final);
|
| + result = regexp->SetLocalPropertyIgnoreAttributes(heap->multiline_symbol(),
|
| + multiline,
|
| + final);
|
| ASSERT(!result->IsFailure());
|
| result =
|
| - regexp->IgnoreAttributesAndSetLocalProperty(heap->last_index_symbol(),
|
| - Smi::FromInt(0),
|
| - writable);
|
| + regexp->SetLocalPropertyIgnoreAttributes(heap->last_index_symbol(),
|
| + Smi::FromInt(0),
|
| + writable);
|
| ASSERT(!result->IsFailure());
|
| USE(result);
|
| return regexp;
|
| @@ -3731,9 +3737,9 @@
|
| NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0);
|
| // Use IgnoreAttributes version since a readonly property may be
|
| // overridden and SetProperty does not allow this.
|
| - return js_object->IgnoreAttributesAndSetLocalProperty(*name,
|
| - *obj_value,
|
| - attr);
|
| + return js_object->SetLocalPropertyIgnoreAttributes(*name,
|
| + *obj_value,
|
| + attr);
|
| }
|
|
|
| return Runtime::SetObjectProperty(isolate, js_object, name, obj_value, attr);
|
| @@ -3836,9 +3842,9 @@
|
| } else {
|
| Handle<String> key_string = Handle<String>::cast(key);
|
| key_string->TryFlatten();
|
| - return js_object->IgnoreAttributesAndSetLocalProperty(*key_string,
|
| - *value,
|
| - attr);
|
| + return js_object->SetLocalPropertyIgnoreAttributes(*key_string,
|
| + *value,
|
| + attr);
|
| }
|
| }
|
|
|
| @@ -3851,7 +3857,7 @@
|
| if (name->AsArrayIndex(&index)) {
|
| return js_object->SetElement(index, *value);
|
| } else {
|
| - return js_object->IgnoreAttributesAndSetLocalProperty(*name, *value, attr);
|
| + return js_object->SetLocalPropertyIgnoreAttributes(*name, *value, attr);
|
| }
|
| }
|
|
|
| @@ -3937,7 +3943,7 @@
|
| }
|
|
|
| return object->
|
| - IgnoreAttributesAndSetLocalProperty(name, args[2], attributes);
|
| + SetLocalPropertyIgnoreAttributes(name, args[2], attributes);
|
| }
|
|
|
|
|
| @@ -7037,7 +7043,7 @@
|
| Handle<JSFunction> function(JSFunction::cast(frame->function()), isolate);
|
| Handle<Object> arguments;
|
| for (int i = frame->ComputeExpressionsCount() - 1; i >= 0; --i) {
|
| - if (frame->GetExpression(i) == isolate->heap()->the_hole_value()) {
|
| + if (frame->GetExpression(i) == isolate->heap()->arguments_marker()) {
|
| if (arguments.is_null()) {
|
| // FunctionGetArguments can't throw an exception, so cast away the
|
| // doubt with an assert.
|
| @@ -10795,17 +10801,17 @@
|
| return *LiveEdit::CheckAndDropActivations(shared_array, do_drop);
|
| }
|
|
|
| -// Compares 2 strings line-by-line and returns diff in form of JSArray of
|
| -// triplets (pos1, pos1_end, pos2_end) describing list of diff chunks.
|
| -static MaybeObject* Runtime_LiveEditCompareStringsLinewise(
|
| - RUNTIME_CALLING_CONVENTION) {
|
| +// 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.
|
| +static MaybeObject* Runtime_LiveEditCompareStrings(RUNTIME_CALLING_CONVENTION) {
|
| RUNTIME_GET_ISOLATE;
|
| ASSERT(args.length() == 2);
|
| HandleScope scope(isolate);
|
| CONVERT_ARG_CHECKED(String, s1, 0);
|
| CONVERT_ARG_CHECKED(String, s2, 1);
|
|
|
| - return *LiveEdit::CompareStringsLinewise(s1, s2);
|
| + return *LiveEdit::CompareStrings(s1, s2);
|
| }
|
|
|
|
|
| @@ -10877,10 +10883,39 @@
|
| }
|
|
|
|
|
| +// Sets a v8 flag.
|
| +static MaybeObject* Runtime_SetFlags(RUNTIME_CALLING_CONVENTION) {
|
| + RUNTIME_GET_ISOLATE;
|
| + CONVERT_CHECKED(String, arg, args[0]);
|
| + SmartPointer<char> flags =
|
| + arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
|
| + FlagList::SetFlagsFromString(*flags, StrLength(*flags));
|
| + return isolate->heap()->undefined_value();
|
| +}
|
| +
|
| +
|
| +// Performs a GC.
|
| +// Presently, it only does a full GC.
|
| +static MaybeObject* Runtime_CollectGarbage(RUNTIME_CALLING_CONVENTION) {
|
| + RUNTIME_GET_ISOLATE;
|
| + isolate->heap()->CollectAllGarbage(true);
|
| + return isolate->heap()->undefined_value();
|
| +}
|
| +
|
| +
|
| +// Gets the current heap usage.
|
| +static MaybeObject* Runtime_GetHeapUsage(RUNTIME_CALLING_CONVENTION) {
|
| + RUNTIME_GET_ISOLATE;
|
| + int usage = static_cast<int>(isolate->heap()->SizeOfObjects());
|
| + if (!Smi::IsValid(usage)) {
|
| + return *isolate->factory()->NewNumberFromInt(usage);
|
| + }
|
| + return Smi::FromInt(usage);
|
| +}
|
| #endif // ENABLE_DEBUGGER_SUPPORT
|
|
|
| +
|
| #ifdef ENABLE_LOGGING_AND_PROFILING
|
| -
|
| static MaybeObject* Runtime_ProfilerResume(RUNTIME_CALLING_CONVENTION) {
|
| RUNTIME_GET_ISOLATE;
|
| NoHandleAllocation ha;
|
|
|