| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 7ad66894fdd8ffe3770ba85ccd7a38c4ff9bb72f..e9b069b436ec766e179788e7d73c3c97c41730dc 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -4259,7 +4259,8 @@ MaybeObject* Runtime::GetObjectPropertyOrFail(
|
|
|
| MaybeObject* Runtime::GetObjectProperty(Isolate* isolate,
|
| Handle<Object> object,
|
| - Handle<Object> key) {
|
| + Handle<Object> key,
|
| + LookupCache* cache) {
|
| HandleScope scope(isolate);
|
|
|
| if (object->IsUndefined() || object->IsNull()) {
|
| @@ -4292,8 +4293,10 @@ MaybeObject* Runtime::GetObjectProperty(Isolate* isolate,
|
| // the element if so.
|
| if (name->AsArrayIndex(&index)) {
|
| return GetElementOrCharAt(isolate, object, index);
|
| - } else {
|
| + } else if (cache == NULL) {
|
| return object->GetProperty(*name);
|
| + } else {
|
| + return cache->GetProperty(object, name);
|
| }
|
| }
|
|
|
| @@ -4557,7 +4560,8 @@ MaybeObject* Runtime::SetObjectProperty(Isolate* isolate,
|
| Handle<Object> key,
|
| Handle<Object> value,
|
| PropertyAttributes attr,
|
| - StrictModeFlag strict_mode) {
|
| + StrictModeFlag strict_mode,
|
| + LookupCache* cache) {
|
| SetPropertyMode set_mode = attr == NONE ? SET_PROPERTY : DEFINE_PROPERTY;
|
| HandleScope scope(isolate);
|
|
|
| @@ -4613,8 +4617,12 @@ MaybeObject* Runtime::SetObjectProperty(Isolate* isolate,
|
| js_object, index, value, attr, strict_mode, set_mode);
|
| } else {
|
| if (name->IsString()) Handle<String>::cast(name)->TryFlatten();
|
| - result = JSReceiver::SetProperty(
|
| - js_object, name, value, attr, strict_mode);
|
| + if (cache == NULL || attr != NONE || strict_mode != kNonStrictMode) {
|
| + result = JSReceiver::SetProperty(
|
| + js_object, name, value, attr, strict_mode);
|
| + } else {
|
| + return cache->SetProperty(js_object, name, value);
|
| + }
|
| }
|
| if (result.is_null()) return Failure::Exception();
|
| return *value;
|
|
|