Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: src/objects.cc

Issue 1420413002: Assume that ReportFailedAccessCheck always schedules an exception. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/builtins.cc ('k') | src/runtime/runtime-classes.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 1004
1005 // Cross-Origin [[Get]] of Well-Known Symbols does not throw, and returns 1005 // Cross-Origin [[Get]] of Well-Known Symbols does not throw, and returns
1006 // undefined. 1006 // undefined.
1007 Handle<Name> name = it->GetName(); 1007 Handle<Name> name = it->GetName();
1008 if (name->IsSymbol() && Symbol::cast(*name)->is_well_known_symbol()) { 1008 if (name->IsSymbol() && Symbol::cast(*name)->is_well_known_symbol()) {
1009 return it->factory()->undefined_value(); 1009 return it->factory()->undefined_value();
1010 } 1010 }
1011 1011
1012 it->isolate()->ReportFailedAccessCheck(checked); 1012 it->isolate()->ReportFailedAccessCheck(checked);
1013 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); 1013 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
1014 return it->factory()->undefined_value(); 1014 UNREACHABLE();
1015 return MaybeHandle<Object>();
1015 } 1016 }
1016 1017
1017 1018
1018 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck( 1019 Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck(
1019 LookupIterator* it) { 1020 LookupIterator* it) {
1020 Handle<JSObject> checked = it->GetHolder<JSObject>(); 1021 Handle<JSObject> checked = it->GetHolder<JSObject>();
1021 while (AllCanRead(it)) { 1022 while (AllCanRead(it)) {
1022 if (it->state() == LookupIterator::ACCESSOR) { 1023 if (it->state() == LookupIterator::ACCESSOR) {
1023 return Just(it->property_details().attributes()); 1024 return Just(it->property_details().attributes());
1024 } 1025 }
1025 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state()); 1026 DCHECK_EQ(LookupIterator::INTERCEPTOR, it->state());
1026 auto result = GetPropertyAttributesWithInterceptor(it); 1027 auto result = GetPropertyAttributesWithInterceptor(it);
1027 if (it->isolate()->has_scheduled_exception()) break; 1028 if (it->isolate()->has_scheduled_exception()) break;
1028 if (result.IsJust() && result.FromJust() != ABSENT) return result; 1029 if (result.IsJust() && result.FromJust() != ABSENT) return result;
1029 } 1030 }
1030 it->isolate()->ReportFailedAccessCheck(checked); 1031 it->isolate()->ReportFailedAccessCheck(checked);
1031 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(), 1032 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(),
1032 Nothing<PropertyAttributes>()); 1033 Nothing<PropertyAttributes>());
1033 return Just(ABSENT); 1034 UNREACHABLE();
1035 return Nothing<PropertyAttributes>();
1034 } 1036 }
1035 1037
1036 1038
1037 // static 1039 // static
1038 bool JSObject::AllCanWrite(LookupIterator* it) { 1040 bool JSObject::AllCanWrite(LookupIterator* it) {
1039 for (; it->IsFound(); it->Next()) { 1041 for (; it->IsFound(); it->Next()) {
1040 if (it->state() == LookupIterator::ACCESSOR) { 1042 if (it->state() == LookupIterator::ACCESSOR) {
1041 Handle<Object> accessors = it->GetAccessors(); 1043 Handle<Object> accessors = it->GetAccessors();
1042 if (accessors->IsAccessorInfo()) { 1044 if (accessors->IsAccessorInfo()) {
1043 if (AccessorInfo::cast(*accessors)->all_can_write()) return true; 1045 if (AccessorInfo::cast(*accessors)->all_can_write()) return true;
1044 } 1046 }
1045 } 1047 }
1046 } 1048 }
1047 return false; 1049 return false;
1048 } 1050 }
1049 1051
1050 1052
1051 Maybe<bool> JSObject::SetPropertyWithFailedAccessCheck( 1053 Maybe<bool> JSObject::SetPropertyWithFailedAccessCheck(
1052 LookupIterator* it, Handle<Object> value, ShouldThrow should_throw) { 1054 LookupIterator* it, Handle<Object> value, ShouldThrow should_throw) {
1053 Handle<JSObject> checked = it->GetHolder<JSObject>(); 1055 Handle<JSObject> checked = it->GetHolder<JSObject>();
1054 if (AllCanWrite(it)) { 1056 if (AllCanWrite(it)) {
1055 // The supplied language-mode is ignored by SetPropertyWithAccessor. 1057 // The supplied language-mode is ignored by SetPropertyWithAccessor.
1056 return SetPropertyWithAccessor(it, value, SLOPPY, should_throw); 1058 return SetPropertyWithAccessor(it, value, SLOPPY, should_throw);
1057 } 1059 }
1058 1060
1059 it->isolate()->ReportFailedAccessCheck(checked); 1061 it->isolate()->ReportFailedAccessCheck(checked);
1060 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(), Nothing<bool>()); 1062 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(it->isolate(), Nothing<bool>());
1061 UNREACHABLE(); 1063 UNREACHABLE();
1062 it->isolate()->Throw(
1063 *it->isolate()->factory()->NewTypeError(MessageTemplate::kNoAccess));
1064 return Nothing<bool>(); 1064 return Nothing<bool>();
1065 } 1065 }
1066 1066
1067 1067
1068 void JSObject::SetNormalizedProperty(Handle<JSObject> object, 1068 void JSObject::SetNormalizedProperty(Handle<JSObject> object,
1069 Handle<Name> name, 1069 Handle<Name> name,
1070 Handle<Object> value, 1070 Handle<Object> value,
1071 PropertyDetails details) { 1071 PropertyDetails details) {
1072 DCHECK(!object->HasFastProperties()); 1072 DCHECK(!object->HasFastProperties());
1073 if (!name->IsUniqueName()) { 1073 if (!name->IsUniqueName()) {
(...skipping 3711 matching lines...) Expand 10 before | Expand all | Expand 10 after
4785 switch (it->state()) { 4785 switch (it->state()) {
4786 case LookupIterator::JSPROXY: 4786 case LookupIterator::JSPROXY:
4787 case LookupIterator::NOT_FOUND: 4787 case LookupIterator::NOT_FOUND:
4788 case LookupIterator::TRANSITION: 4788 case LookupIterator::TRANSITION:
4789 UNREACHABLE(); 4789 UNREACHABLE();
4790 4790
4791 case LookupIterator::ACCESS_CHECK: 4791 case LookupIterator::ACCESS_CHECK:
4792 if (!it->HasAccess()) { 4792 if (!it->HasAccess()) {
4793 it->isolate()->ReportFailedAccessCheck(it->GetHolder<JSObject>()); 4793 it->isolate()->ReportFailedAccessCheck(it->GetHolder<JSObject>());
4794 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object); 4794 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(it->isolate(), Object);
4795 return value; 4795 UNREACHABLE();
4796 } 4796 }
4797 break; 4797 break;
4798 4798
4799 // If there's an interceptor, try to store the property with the 4799 // If there's an interceptor, try to store the property with the
4800 // interceptor. 4800 // interceptor.
4801 // In case of success, the attributes will have been reset to the default 4801 // In case of success, the attributes will have been reset to the default
4802 // attributes of the interceptor, rather than the incoming attributes. 4802 // attributes of the interceptor, rather than the incoming attributes.
4803 // 4803 //
4804 // TODO(verwaest): JSProxy afterwards verify the attributes that the 4804 // TODO(verwaest): JSProxy afterwards verify the attributes that the
4805 // JSProxy claims it has, and verifies that they are compatible. If not, 4805 // JSProxy claims it has, and verifies that they are compatible. If not,
(...skipping 1008 matching lines...) Expand 10 before | Expand all | Expand 10 after
5814 for (; it->IsFound(); it->Next()) { 5814 for (; it->IsFound(); it->Next()) {
5815 switch (it->state()) { 5815 switch (it->state()) {
5816 case LookupIterator::JSPROXY: 5816 case LookupIterator::JSPROXY:
5817 case LookupIterator::NOT_FOUND: 5817 case LookupIterator::NOT_FOUND:
5818 case LookupIterator::TRANSITION: 5818 case LookupIterator::TRANSITION:
5819 UNREACHABLE(); 5819 UNREACHABLE();
5820 case LookupIterator::ACCESS_CHECK: 5820 case LookupIterator::ACCESS_CHECK:
5821 if (it->HasAccess()) break; 5821 if (it->HasAccess()) break;
5822 isolate->ReportFailedAccessCheck(it->GetHolder<JSObject>()); 5822 isolate->ReportFailedAccessCheck(it->GetHolder<JSObject>());
5823 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 5823 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
5824 return it->factory()->false_value(); 5824 UNREACHABLE();
5825 case LookupIterator::INTERCEPTOR: { 5825 case LookupIterator::INTERCEPTOR: {
5826 MaybeHandle<Object> maybe_result = 5826 MaybeHandle<Object> maybe_result =
5827 JSObject::DeletePropertyWithInterceptor(it); 5827 JSObject::DeletePropertyWithInterceptor(it);
5828 // Delete with interceptor succeeded. Return result. 5828 // Delete with interceptor succeeded. Return result.
5829 if (!maybe_result.is_null()) return maybe_result; 5829 if (!maybe_result.is_null()) return maybe_result;
5830 // An exception was thrown in the interceptor. Propagate. 5830 // An exception was thrown in the interceptor. Propagate.
5831 if (isolate->has_pending_exception()) return maybe_result; 5831 if (isolate->has_pending_exception()) return maybe_result;
5832 break; 5832 break;
5833 } 5833 }
5834 case LookupIterator::INTEGER_INDEXED_EXOTIC: 5834 case LookupIterator::INTEGER_INDEXED_EXOTIC:
(...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after
6775 6775
6776 if (!object->HasSloppyArgumentsElements() && !object->map()->is_observed()) { 6776 if (!object->HasSloppyArgumentsElements() && !object->map()->is_observed()) {
6777 return PreventExtensionsWithTransition<NONE>(object, should_throw); 6777 return PreventExtensionsWithTransition<NONE>(object, should_throw);
6778 } 6778 }
6779 6779
6780 if (object->IsAccessCheckNeeded() && 6780 if (object->IsAccessCheckNeeded() &&
6781 !isolate->MayAccess(handle(isolate->context()), object)) { 6781 !isolate->MayAccess(handle(isolate->context()), object)) {
6782 isolate->ReportFailedAccessCheck(object); 6782 isolate->ReportFailedAccessCheck(object);
6783 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); 6783 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>());
6784 UNREACHABLE(); 6784 UNREACHABLE();
6785 RETURN_FAILURE(isolate, should_throw,
6786 NewTypeError(MessageTemplate::kNoAccess));
6787 } 6785 }
6788 6786
6789 if (object->IsJSGlobalProxy()) { 6787 if (object->IsJSGlobalProxy()) {
6790 PrototypeIterator iter(isolate, object); 6788 PrototypeIterator iter(isolate, object);
6791 if (iter.IsAtEnd()) return Just(true); 6789 if (iter.IsAtEnd()) return Just(true);
6792 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); 6790 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject());
6793 return PreventExtensions(PrototypeIterator::GetCurrent<JSObject>(iter), 6791 return PreventExtensions(PrototypeIterator::GetCurrent<JSObject>(iter),
6794 should_throw); 6792 should_throw);
6795 } 6793 }
6796 6794
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
6876 // Sealing/freezing sloppy arguments should be handled elsewhere. 6874 // Sealing/freezing sloppy arguments should be handled elsewhere.
6877 DCHECK(!object->HasSloppyArgumentsElements()); 6875 DCHECK(!object->HasSloppyArgumentsElements());
6878 DCHECK(!object->map()->is_observed()); 6876 DCHECK(!object->map()->is_observed());
6879 6877
6880 Isolate* isolate = object->GetIsolate(); 6878 Isolate* isolate = object->GetIsolate();
6881 if (object->IsAccessCheckNeeded() && 6879 if (object->IsAccessCheckNeeded() &&
6882 !isolate->MayAccess(handle(isolate->context()), object)) { 6880 !isolate->MayAccess(handle(isolate->context()), object)) {
6883 isolate->ReportFailedAccessCheck(object); 6881 isolate->ReportFailedAccessCheck(object);
6884 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); 6882 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>());
6885 UNREACHABLE(); 6883 UNREACHABLE();
6886 RETURN_FAILURE(isolate, should_throw,
6887 NewTypeError(MessageTemplate::kNoAccess));
6888 } 6884 }
6889 6885
6890 if (object->IsJSGlobalProxy()) { 6886 if (object->IsJSGlobalProxy()) {
6891 PrototypeIterator iter(isolate, object); 6887 PrototypeIterator iter(isolate, object);
6892 if (iter.IsAtEnd()) return Just(true); 6888 if (iter.IsAtEnd()) return Just(true);
6893 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); 6889 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject());
6894 return PreventExtensionsWithTransition<attrs>( 6890 return PreventExtensionsWithTransition<attrs>(
6895 PrototypeIterator::GetCurrent<JSObject>(iter), should_throw); 6891 PrototypeIterator::GetCurrent<JSObject>(iter), should_throw);
6896 } 6892 }
6897 6893
(...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after
7771 } 7767 }
7772 7768
7773 Handle<JSObject> current = PrototypeIterator::GetCurrent<JSObject>(iter); 7769 Handle<JSObject> current = PrototypeIterator::GetCurrent<JSObject>(iter);
7774 7770
7775 // Check access rights if required. 7771 // Check access rights if required.
7776 if (current->IsAccessCheckNeeded() && 7772 if (current->IsAccessCheckNeeded() &&
7777 !isolate->MayAccess(handle(isolate->context()), current)) { 7773 !isolate->MayAccess(handle(isolate->context()), current)) {
7778 if (iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) { 7774 if (iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) {
7779 isolate->ReportFailedAccessCheck(current); 7775 isolate->ReportFailedAccessCheck(current);
7780 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); 7776 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray);
7777 UNREACHABLE();
7781 } 7778 }
7782 break; 7779 break;
7783 } 7780 }
7784 7781
7785 JSObject::CollectOwnElementKeys(current, &accumulator, 7782 JSObject::CollectOwnElementKeys(current, &accumulator,
7786 static_cast<PropertyAttributes>(DONT_ENUM)); 7783 static_cast<PropertyAttributes>(DONT_ENUM));
7787 7784
7788 // Add the element keys from the interceptor. 7785 // Add the element keys from the interceptor.
7789 if (current->HasIndexedInterceptor()) { 7786 if (current->HasIndexedInterceptor()) {
7790 Handle<JSObject> result; 7787 Handle<JSObject> result;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
7883 MaybeHandle<Object> JSObject::DefineAccessor(LookupIterator* it, 7880 MaybeHandle<Object> JSObject::DefineAccessor(LookupIterator* it,
7884 Handle<Object> getter, 7881 Handle<Object> getter,
7885 Handle<Object> setter, 7882 Handle<Object> setter,
7886 PropertyAttributes attributes) { 7883 PropertyAttributes attributes) {
7887 Isolate* isolate = it->isolate(); 7884 Isolate* isolate = it->isolate();
7888 7885
7889 if (it->state() == LookupIterator::ACCESS_CHECK) { 7886 if (it->state() == LookupIterator::ACCESS_CHECK) {
7890 if (!it->HasAccess()) { 7887 if (!it->HasAccess()) {
7891 isolate->ReportFailedAccessCheck(it->GetHolder<JSObject>()); 7888 isolate->ReportFailedAccessCheck(it->GetHolder<JSObject>());
7892 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 7889 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
7893 return isolate->factory()->undefined_value(); 7890 UNREACHABLE();
7894 } 7891 }
7895 it->Next(); 7892 it->Next();
7896 } 7893 }
7897 7894
7898 Handle<JSObject> object = Handle<JSObject>::cast(it->GetReceiver()); 7895 Handle<JSObject> object = Handle<JSObject>::cast(it->GetReceiver());
7899 // Ignore accessors on typed arrays. 7896 // Ignore accessors on typed arrays.
7900 if (it->IsElement() && object->HasFixedTypedArrayElements()) { 7897 if (it->IsElement() && object->HasFixedTypedArrayElements()) {
7901 return it->factory()->undefined_value(); 7898 return it->factory()->undefined_value();
7902 } 7899 }
7903 7900
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
7948 7945
7949 // Duplicate ACCESS_CHECK outside of GetPropertyAttributes for the case that 7946 // Duplicate ACCESS_CHECK outside of GetPropertyAttributes for the case that
7950 // the FailedAccessCheckCallbackFunction doesn't throw an exception. 7947 // the FailedAccessCheckCallbackFunction doesn't throw an exception.
7951 // 7948 //
7952 // TODO(verwaest): Force throw an exception if the callback doesn't, so we can 7949 // TODO(verwaest): Force throw an exception if the callback doesn't, so we can
7953 // remove reliance on default return values. 7950 // remove reliance on default return values.
7954 if (it.state() == LookupIterator::ACCESS_CHECK) { 7951 if (it.state() == LookupIterator::ACCESS_CHECK) {
7955 if (!it.HasAccess()) { 7952 if (!it.HasAccess()) {
7956 isolate->ReportFailedAccessCheck(object); 7953 isolate->ReportFailedAccessCheck(object);
7957 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 7954 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
7958 return it.factory()->undefined_value(); 7955 UNREACHABLE();
7959 } 7956 }
7960 it.Next(); 7957 it.Next();
7961 } 7958 }
7962 7959
7963 // Ignore accessors on typed arrays. 7960 // Ignore accessors on typed arrays.
7964 if (it.IsElement() && object->HasFixedTypedArrayElements()) { 7961 if (it.IsElement() && object->HasFixedTypedArrayElements()) {
7965 return it.factory()->undefined_value(); 7962 return it.factory()->undefined_value();
7966 } 7963 }
7967 7964
7968 CHECK(GetPropertyAttributes(&it).IsJust()); 7965 CHECK(GetPropertyAttributes(&it).IsJust());
(...skipping 26 matching lines...) Expand all
7995 switch (it.state()) { 7992 switch (it.state()) {
7996 case LookupIterator::INTERCEPTOR: 7993 case LookupIterator::INTERCEPTOR:
7997 case LookupIterator::NOT_FOUND: 7994 case LookupIterator::NOT_FOUND:
7998 case LookupIterator::TRANSITION: 7995 case LookupIterator::TRANSITION:
7999 UNREACHABLE(); 7996 UNREACHABLE();
8000 7997
8001 case LookupIterator::ACCESS_CHECK: 7998 case LookupIterator::ACCESS_CHECK:
8002 if (it.HasAccess()) continue; 7999 if (it.HasAccess()) continue;
8003 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); 8000 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>());
8004 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 8001 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
8005 return isolate->factory()->undefined_value(); 8002 UNREACHABLE();
8006 8003
8007 case LookupIterator::JSPROXY: 8004 case LookupIterator::JSPROXY:
8008 return isolate->factory()->undefined_value(); 8005 return isolate->factory()->undefined_value();
8009 8006
8010 case LookupIterator::INTEGER_INDEXED_EXOTIC: 8007 case LookupIterator::INTEGER_INDEXED_EXOTIC:
8011 return isolate->factory()->undefined_value(); 8008 return isolate->factory()->undefined_value();
8012 case LookupIterator::DATA: 8009 case LookupIterator::DATA:
8013 continue; 8010 continue;
8014 case LookupIterator::ACCESSOR: { 8011 case LookupIterator::ACCESSOR: {
8015 Handle<Object> maybe_pair = it.GetAccessors(); 8012 Handle<Object> maybe_pair = it.GetAccessors();
(...skipping 9831 matching lines...) Expand 10 before | Expand all | Expand 10 after
17847 if (cell->value() != *new_value) { 17844 if (cell->value() != *new_value) {
17848 cell->set_value(*new_value); 17845 cell->set_value(*new_value);
17849 Isolate* isolate = cell->GetIsolate(); 17846 Isolate* isolate = cell->GetIsolate();
17850 cell->dependent_code()->DeoptimizeDependentCodeGroup( 17847 cell->dependent_code()->DeoptimizeDependentCodeGroup(
17851 isolate, DependentCode::kPropertyCellChangedGroup); 17848 isolate, DependentCode::kPropertyCellChangedGroup);
17852 } 17849 }
17853 } 17850 }
17854 17851
17855 } // namespace internal 17852 } // namespace internal
17856 } // namespace v8 17853 } // namespace v8
OLDNEW
« no previous file with comments | « src/builtins.cc ('k') | src/runtime/runtime-classes.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698