43 char IC::TransitionMarkFromState(
IC::State state) {
61 void IC::TraceIC(
const char*
type,
67 HEAP->undefined_value(),
68 HEAP->undefined_value());
70 StackFrameIterator it;
71 while (it.frame()->fp() != this->
fp()) it.Advance();
73 if (raw_frame->is_internal()) {
74 Isolate*
isolate = new_target->GetIsolate();
76 Builtins::kFunctionApply);
77 if (raw_frame->unchecked_code() == apply_builtin) {
80 raw_frame = it.frame();
88 TransitionMarkFromState(old_state),
89 TransitionMarkFromState(new_state),
90 new_can_grow ?
".GROW" :
"");
96 #define TRACE_GENERIC_IC(type, reason) \
98 if (FLAG_trace_ic) { \
99 PrintF("[%s patching generic stub in ", type); \
100 JavaScriptFrame::PrintTop(stdout, false, true); \
101 PrintF(" (%s)]\n", reason); \
106 #define TRACE_GENERIC_IC(type, reason)
109 #define TRACE_IC(type, name, old_state, new_target) \
110 ASSERT((TraceIC(type, name, old_state, new_target), true))
113 ASSERT(isolate == Isolate::Current());
127 pc_address =
reinterpret_cast<Address*
>(fp + kCallerPCOffset);
131 StackFrameIterator it;
132 for (
int i = 0; i < depth + 1; i++) it.Advance();
134 ASSERT(fp == frame->fp() && pc_address == frame->pc_address());
137 pc_address_ = pc_address;
141 #ifdef ENABLE_DEBUGGER_SUPPORT
142 Address IC::OriginalCodeAddress()
const {
147 StackFrameIterator it;
148 while (it.frame()->fp() != this->
fp()) it.Advance();
154 Code* code = shared->code();
155 ASSERT(Debug::HasDebugInfo(shared));
156 Code* original_code = Debug::GetDebugInfo(shared)->original_code();
157 ASSERT(original_code->IsCode());
172 static bool HasNormalObjectsInPrototypeChain(
Isolate* isolate,
173 LookupResult* lookup,
175 Object* end = lookup->IsProperty()
176 ? lookup->holder() :
Object::cast(isolate->heap()->null_value());
177 for (
Object* current = receiver;
180 if (current->IsJSObject() &&
182 !current->IsJSGlobalProxy() &&
183 !current->IsJSGlobalObject()) {
192 static bool TryRemoveInvalidPrototypeDependentStub(Code* target,
198 if (cache_holder ==
OWN_MAP && !receiver->IsJSObject()) {
203 receiver->GetPrototype()->IsNull()) {
219 map->RemoveFromCodeCache(
String::cast(name), target, index);
230 if (state !=
MONOMORPHIC || !name->IsString())
return state;
231 if (receiver->IsUndefined() || receiver->IsNull())
return state;
249 TryRemoveInvalidPrototypeDependentStub(target, receiver, name)) {
259 if (receiver->IsJSBuiltinsObject()) {
271 !it.
done(); it.next()) {
272 RelocInfo* info = it.rinfo();
273 if (info->pc() == addr)
return info->rmode();
300 bool was_uninitialized =
302 bool is_uninitialized =
304 return (was_uninitialized && !is_uninitialized) ? 1 :
305 (!was_uninitialized && is_uninitialized) ? -1 : 0;
310 if (FLAG_type_info_threshold == 0 && !FLAG_watch_ic_patching) {
314 inner_pointer_to_code_cache()->GetCacheEntry(address)->code;
317 if (FLAG_type_info_threshold > 0 &&
320 int delta = ComputeTypeInfoCountDelta(old_target->
ic_state(),
323 if (delta != 0 && host->type_feedback_info()->IsTypeFeedbackInfo()) {
330 if (FLAG_watch_ic_patching) {
332 Isolate::Current()->runtime_profiler()->NotifyICChanged();
346 switch (target->
kind()) {
349 return KeyedLoadIC::Clear(address, target);
352 return KeyedStoreIC::Clear(address, target);
371 Isolate::Current()->stub_cache()->FindCallInitialize(
373 contextual ? RelocInfo::CODE_TARGET_CONTEXT : RelocInfo::CODE_TARGET,
379 void KeyedLoadIC::Clear(
Address address,
Code* target) {
388 void LoadIC::Clear(
Address address, Code* target) {
394 void StoreIC::Clear(
Address address, Code* target) {
398 ? initialize_stub_strict()
399 : initialize_stub());
403 void KeyedStoreIC::Clear(
Address address, Code* target) {
407 ? initialize_stub_strict()
408 : initialize_stub());
412 void CompareIC::Clear(
Address address, Code* target) {
414 if (target->major_key() != CodeStub::CompareIC)
return;
423 static bool HasInterceptorGetter(JSObject*
object) {
424 return !
object->GetNamedInterceptor()->getter()->IsUndefined();
428 static void LookupForRead(Handle<Object>
object,
430 LookupResult* lookup) {
434 object->Lookup(*name, lookup);
438 if (!lookup->IsFound()
440 || !lookup->IsCacheable()) {
444 Handle<JSObject> holder(lookup->holder());
445 if (HasInterceptorGetter(*holder)) {
449 holder->LocalLookupRealNamedProperty(*name, lookup);
450 if (lookup->IsProperty()) {
455 Handle<Object> proto(holder->GetPrototype());
456 if (proto->IsNull()) {
469 if (delegate->IsJSFunction() && !
object->IsJSFunctionProxy()) {
473 StackFrameLocator locator;
485 while (callee->IsJSFunctionProxy()) {
489 if (callee->IsJSFunction()) {
491 if (!function->shared()->is_classic_mode() ||
function->IsBuiltin()) {
498 if (object->IsString() ||
object->IsNumber() ||
object->IsBoolean()) {
501 StackFrameLocator locator;
515 if (object->IsUndefined() ||
object->IsNull()) {
516 return TypeError(
"non_object_property_call",
object, name);
522 if (name->AsArrayIndex(&index)) {
525 if (result->IsJSFunction())
return *result;
529 if (result->IsJSFunction())
return *result;
535 LookupResult lookup(
isolate());
536 LookupForRead(
object, name, &lookup);
538 if (!lookup.IsProperty()) {
543 :
TypeError(
"undefined_method",
object, name);
548 UpdateCaches(&lookup, state, extra_ic_state,
object, name);
562 :
TypeError(
"undefined_method",
object, name);
565 ASSERT(!result->IsTheHole());
572 if (result->IsJSFunction()) {
574 #ifdef ENABLE_DEBUGGER_SUPPORT
577 if (debug->StepInActive()) {
580 debug->HandleStepIn(
function,
object,
fp(),
false);
588 if (result->IsJSFunction())
return *result;
590 return TypeError(
"property_not_function",
object, name);
599 JSFunction*
function = lookup->GetConstantFunction();
600 if (!function->shared()->HasBuiltinFunctionId())
return false;
610 switch (function->shared()->builtin_function_id()) {
611 case kStringCharCodeAt:
613 if (object->IsString()) {
620 argc >= 1 && args[1]->IsNumber()) {
622 if (index < 0 || index >= string->
length()) {
645 switch (lookup->type()) {
647 int index = lookup->GetFieldIndex();
649 argc,
kind_, extra_state, name,
object, holder, index);
657 argc,
kind_, extra_state, name,
object, holder,
function);
664 if (holder->IsGlobalObject()) {
670 argc,
kind_, extra_state, name, receiver, global, cell,
function);
678 argc,
kind_, extra_state);
683 ASSERT(HasInterceptorGetter(*holder));
685 argc,
kind_, extra_state, name,
object, holder);
698 if (!lookup->IsProperty() || !lookup->IsCacheable())
return;
700 if (lookup->holder() != *
object &&
701 HasNormalObjectsInPrototypeChain(
702 isolate(), lookup, object->GetPrototype())) {
710 bool had_proto_failure =
false;
717 argc,
kind_, extra_ic_state);
724 TryRemoveInvalidPrototypeDependentStub(
target(),
727 had_proto_failure =
true;
732 argc,
kind_, extra_ic_state);
767 if (key->IsSymbol()) {
774 if (object->IsUndefined() ||
object->IsNull()) {
775 return TypeError(
"non_object_property_call",
object, key);
778 if (FLAG_use_ic && state !=
MEGAMORPHIC && object->IsHeapObject()) {
782 if (object->IsJSObject() &&
788 }
else if (!object->IsAccessCheckNeeded()) {
803 if (result->IsJSFunction())
return *result;
806 if (result->IsJSFunction())
return *result;
808 return TypeError(
"property_not_function",
object, key);
817 if (object->IsUndefined() ||
object->IsNull()) {
818 return TypeError(
"non_object_property_load",
object, name);
826 if ((object->IsString() ||
object->IsStringWrapper()) &&
827 name->Equals(isolate()->heap()->length_symbol())) {
830 stub = pre_monomorphic_stub();
832 stub =
object->IsString()
835 }
else if (state ==
MONOMORPHIC && object->IsStringWrapper()) {
838 stub = megamorphic_stub();
843 if (FLAG_trace_ic)
PrintF(
"[LoadIC : +#length /string]\n");
854 if (object->IsJSArray() &&
855 name->Equals(
isolate()->heap()->length_symbol())) {
858 stub = pre_monomorphic_stub();
862 stub = megamorphic_stub();
867 if (FLAG_trace_ic)
PrintF(
"[LoadIC : +#length /array]\n");
874 if (object->IsJSFunction() &&
875 name->Equals(
isolate()->heap()->prototype_symbol()) &&
879 stub = pre_monomorphic_stub();
883 stub = megamorphic_stub();
888 if (FLAG_trace_ic)
PrintF(
"[LoadIC : +#prototype /function]\n");
898 if (name->AsArrayIndex(&index))
return object->GetElement(index);
901 LookupResult lookup(
isolate());
902 LookupForRead(
object, name, &lookup);
905 if (!lookup.IsProperty()) {
909 LOG(
isolate(), SuspectReadEvent(*name, *
object));
914 UpdateCaches(&lookup, state,
object, name);
918 if (lookup.IsFound() &&
933 return object->GetProperty(*
object, &lookup, *name, &attr);
937 void LoadIC::UpdateCaches(LookupResult* lookup,
942 if (!lookup->IsCacheable())
return;
946 if (!object->IsJSObject())
return;
949 if (HasNormalObjectsInPrototypeChain(
isolate(), lookup, *
object))
return;
957 code = pre_monomorphic_stub();
958 }
else if (!lookup->IsProperty()) {
963 Handle<JSObject> holder(lookup->holder());
964 switch (lookup->type()) {
967 name, receiver, holder, lookup->GetFieldIndex());
970 Handle<JSFunction> constant(lookup->GetConstantFunction());
972 name, receiver, holder, constant);
976 if (holder->IsGlobalObject()) {
978 Handle<JSGlobalPropertyCell> cell(global->GetPropertyCell(lookup));
980 name, receiver, global, cell, lookup->IsDontDelete());
986 if (!holder.is_identical_to(receiver))
return;
991 Handle<Object> callback(lookup->GetCallbackObject());
992 if (callback->IsAccessorInfo()) {
994 if (v8::ToCData<Address>(info->getter()) == 0)
return;
995 if (!info->IsCompatibleReceiver(*receiver))
return;
997 name, receiver, holder, info);
998 }
else if (callback->IsAccessorPair()) {
999 Handle<Object> getter(Handle<AccessorPair>::cast(callback)->getter());
1000 if (!getter->IsJSFunction())
return;
1001 if (holder->IsGlobalObject())
return;
1002 if (!receiver->HasFastProperties())
return;
1004 name, receiver, holder, Handle<JSFunction>::cast(getter));
1006 ASSERT(callback->IsForeign());
1013 ASSERT(HasInterceptorGetter(*holder));
1015 name, receiver, holder);
1062 for (
int i = 0; i < receiver_maps->length(); ++i) {
1065 receiver_map, strict_mode, growth_mode);
1066 handler_ics.Add(cached_stub);
1070 receiver_maps, &handler_ics);
1073 CodeCreateEvent(Logger::KEYED_LOAD_MEGAMORPHIC_IC_TAG, *code, 0));
1081 if (key->IsHeapNumber()) {
1084 key = isolate->
factory()->nan_symbol();
1086 int int_value =
FastD2I(value);
1091 }
else if (key->IsUndefined()) {
1092 key = isolate->
factory()->undefined_symbol();
1101 bool force_generic_stub) {
1104 key = TryConvertKey(key,
isolate());
1106 if (key->IsSymbol()) {
1111 if (object->IsUndefined() ||
object->IsNull()) {
1112 return TypeError(
"non_object_property_load",
object, name);
1119 if (object->IsString() &&
1120 name->Equals(
isolate()->heap()->length_symbol())) {
1131 if (object->IsJSArray() &&
1132 name->Equals(
isolate()->heap()->length_symbol())) {
1139 return array->length();
1143 if (object->IsJSFunction() &&
1144 name->Equals(
isolate()->heap()->prototype_symbol()) &&
1160 if (name->AsArrayIndex(&index)) {
1162 if (FLAG_use_ic)
set_target(*generic_stub());
1167 LookupResult lookup(
isolate());
1168 LookupForRead(
object, name, &lookup);
1176 UpdateCaches(&lookup, state,
object, name);
1180 if (lookup.IsFound() && lookup.type() ==
INTERCEPTOR) {
1193 return object->GetProperty(*
object, &lookup, *name, &attr);
1198 bool use_ic = FLAG_use_ic && !
object->IsAccessCheckNeeded();
1202 if (!force_generic_stub) {
1203 if (object->IsString() && key->IsNumber()) {
1207 }
else if (object->IsJSObject()) {
1209 if (receiver->elements()->map() ==
1210 isolate()->
heap()->non_strict_arguments_elements_map()) {
1211 stub = non_strict_arguments_stub();
1212 }
else if (receiver->HasIndexedInterceptor()) {
1213 stub = indexed_interceptor_stub();
1214 }
else if (key->IsSmi() && (
target() != *non_strict_arguments_stub())) {
1231 void KeyedLoadIC::UpdateCaches(LookupResult* lookup,
1236 if (!lookup->IsProperty() || !lookup->IsCacheable())
return;
1238 if (!object->IsJSObject())
return;
1241 if (HasNormalObjectsInPrototypeChain(
isolate(), lookup, *
object))
return;
1250 code = pre_monomorphic_stub();
1254 switch (lookup->type()) {
1257 name, receiver, holder, lookup->GetFieldIndex());
1262 name, receiver, holder, constant);
1266 Handle<Object> callback_object(lookup->GetCallbackObject());
1267 if (!callback_object->IsAccessorInfo())
return;
1268 Handle<AccessorInfo> callback =
1270 if (v8::ToCData<Address>(callback->getter()) == 0)
return;
1271 if (!callback->IsCompatibleReceiver(*receiver))
return;
1273 name, receiver, holder, callback);
1277 ASSERT(HasInterceptorGetter(lookup->holder()));
1279 name, receiver, holder);
1284 code = generic_stub();
1302 static bool StoreICableLookup(LookupResult* lookup) {
1304 if (!lookup->IsFound() || lookup->type() ==
NULL_DESCRIPTOR)
return false;
1307 if (!lookup->IsCacheable())
return false;
1310 if (lookup->IsReadOnly())
return false;
1316 static bool LookupForWrite(Handle<JSObject> receiver,
1317 Handle<String> name,
1318 LookupResult* lookup) {
1319 receiver->LocalLookup(*name, lookup);
1320 if (!StoreICableLookup(lookup)) {
1325 receiver->GetNamedInterceptor()->setter()->IsUndefined()) {
1326 receiver->LocalLookupRealNamedProperty(*name, lookup);
1327 return StoreICableLookup(lookup);
1339 if (!object->IsJSObject()) {
1341 if (object->IsJSProxy()) {
1348 if (object->IsUndefined() ||
object->IsNull()) {
1349 return TypeError(
"non_object_property_store",
object, name);
1353 if (strict_mode ==
kStrictMode && object->IsString() &&
1354 name->Equals(
isolate()->heap()->length_symbol())) {
1355 return TypeError(
"strict_read_only_property",
object, name);
1366 if (name->AsArrayIndex(&index)) {
1376 if (receiver->IsJSArray() &&
1377 name->Equals(
isolate()->heap()->length_symbol()) &&
1379 receiver->HasFastProperties()) {
1381 if (FLAG_trace_ic)
PrintF(
"[StoreIC : +#length /array]\n");
1387 return receiver->SetProperty(*name, *value,
NONE, strict_mode);
1391 if (FLAG_use_ic && !receiver->IsJSGlobalProxy()) {
1392 LookupResult lookup(
isolate());
1394 if (LookupForWrite(receiver, name, &lookup)) {
1396 UpdateCaches(&lookup, state, strict_mode, receiver, name, value);
1401 if (lookup.IsProperty() && lookup.IsReadOnly()) {
1402 return TypeError(
"strict_read_only_property",
object, name);
1410 if (receiver->IsJSGlobalProxy()) {
1415 ? global_proxy_stub_strict()
1416 : global_proxy_stub();
1424 return receiver->SetProperty(*name,
1432 void StoreIC::UpdateCaches(LookupResult* lookup,
1438 ASSERT(!receiver->IsJSGlobalProxy());
1439 ASSERT(StoreICableLookup(lookup));
1459 lookup->GetFieldIndex(),
1464 if (lookup->GetAttributes() !=
NONE)
return;
1465 Handle<Map> transition(lookup->GetTransitionMap());
1466 int index = transition->PropertyIndexFor(*name);
1468 name, receiver, index, transition, strict_mode);
1472 if (receiver->IsGlobalObject()) {
1479 name, global, cell, strict_mode);
1481 if (!holder.is_identical_to(receiver))
return;
1486 Handle<Object> callback(lookup->GetCallbackObject());
1487 if (callback->IsAccessorInfo()) {
1489 if (v8::ToCData<Address>(info->setter()) == 0)
return;
1490 ASSERT(info->IsCompatibleReceiver(*receiver));
1492 name, receiver, info, strict_mode);
1493 }
else if (callback->IsAccessorPair()) {
1494 Handle<Object> setter(Handle<AccessorPair>::cast(callback)->setter());
1495 if (!setter->IsJSFunction())
return;
1496 if (holder->IsGlobalObject())
return;
1497 if (!receiver->HasFastProperties())
return;
1499 name, receiver, Handle<JSFunction>::cast(setter), strict_mode);
1501 ASSERT(callback->IsForeign());
1508 ASSERT(!receiver->GetNamedInterceptor()->setter()->IsUndefined());
1510 name, receiver, strict_mode);
1528 ? megamorphic_stub_strict()
1529 : megamorphic_stub());
1540 static bool AddOneReceiverMapIfMissing(
MapHandleList* receiver_maps,
1541 Handle<Map> new_receiver_map) {
1542 ASSERT(!new_receiver_map.is_null());
1543 for (
int current = 0; current < receiver_maps->length(); ++current) {
1544 if (!receiver_maps->at(current).is_null() &&
1545 receiver_maps->at(current).is_identical_to(new_receiver_map)) {
1549 receiver_maps->Add(new_receiver_map);
1554 void KeyedIC::GetReceiverMapsForStub(Handle<Code> stub,
1556 ASSERT(stub->is_inline_cache_stub());
1558 return result->Add(
isolate()->factory()->string_map());
1559 }
else if (stub->is_keyed_load_stub() || stub->is_keyed_store_stub()) {
1561 result->Add(Handle<Map>(stub->FindFirstMap()));
1564 AssertNoAllocation no_allocation;
1565 int mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT);
1566 for (RelocIterator it(*stub, mask); !it.done(); it.next()) {
1567 RelocInfo* info = it.rinfo();
1568 Handle<Object> object(info->target_object());
1570 AddOneReceiverMapIfMissing(result, Handle<Map>::cast(
object));
1591 return generic_stub;
1594 bool monomorphic =
false;
1595 bool is_transition_stub = IsTransitionStubKind(stub_kind);
1605 if (ic_state ==
MONOMORPHIC && is_transition_stub) {
1614 target_receiver_maps.
at(0)->elements_kind(),
1615 receiver->GetElementsKind());
1620 if (is_transition_stub) {
1621 monomorphic_map = ComputeTransitionedMap(receiver, stub_kind);
1622 ASSERT(*monomorphic_map != *receiver_map);
1623 stub_kind = GetNoTransitionStubKind(stub_kind);
1625 return ComputeMonomorphicStub(
1626 monomorphic_map, stub_kind, strict_mode, generic_stub);
1633 AddOneReceiverMapIfMissing(&target_receiver_maps, receiver_map);
1634 if (IsTransitionStubKind(stub_kind)) {
1635 Handle<Map> new_map = ComputeTransitionedMap(receiver, stub_kind);
1636 map_added |= AddOneReceiverMapIfMissing(&target_receiver_maps, new_map);
1642 return generic_stub;
1649 return generic_stub;
1662 Handle<Object> probe = cache->Lookup(&target_receiver_maps, flags);
1680 ASSERT(receiver_map->has_dictionary_elements() ||
1681 receiver_map->has_fast_smi_or_object_elements() ||
1682 receiver_map->has_fast_double_elements() ||
1683 receiver_map->has_external_array_elements());
1684 bool is_js_array = receiver_map->instance_type() ==
JS_ARRAY_TYPE;
1686 receiver_map->elements_kind(),
1696 ElementsKind elements_kind = receiver_map->elements_kind();
1701 receiver_map, stub_kind, strict_mode);
1703 return generic_stub;
1708 Handle<Map> KeyedIC::ComputeTransitionedMap(Handle<JSObject> receiver,
1709 StubKind stub_kind) {
1710 switch (stub_kind) {
1754 for (
int i = 0; i < receiver_maps->length(); ++i) {
1758 receiver_map->FindTransitionedMap(receiver_maps);
1759 if (!transitioned_map.
is_null()) {
1761 receiver_map->elements_kind(),
1762 transitioned_map->elements_kind(),
1764 strict_mode, grow_mode).GetCode();
1771 handler_ics.Add(cached_stub);
1772 transitioned_maps.Add(transitioned_map);
1776 receiver_maps, &handler_ics, &transitioned_maps);
1779 CodeCreateEvent(Logger::KEYED_STORE_MEGAMORPHIC_IC_TAG, *code, 0));
1789 bool allow_growth = receiver->IsJSArray() &&
1795 if (receiver->HasFastSmiElements()) {
1796 if (value->IsHeapNumber()) {
1797 if (receiver->HasFastHoleyElements()) {
1803 if (value->IsHeapObject()) {
1804 if (receiver->HasFastHoleyElements()) {
1810 }
else if (receiver->HasFastDoubleElements()) {
1811 if (!value->IsSmi() && !value->IsHeapNumber()) {
1812 if (receiver->HasFastHoleyElements()) {
1822 if (receiver->HasFastSmiElements()) {
1823 if (value->IsHeapNumber()) {
1824 if (receiver->HasFastHoleyElements()) {
1829 }
else if (value->IsHeapObject()) {
1830 if (receiver->HasFastHoleyElements()) {
1836 }
else if (receiver->HasFastDoubleElements()) {
1837 if (!value->IsSmi() && !value->IsHeapNumber()) {
1838 if (receiver->HasFastHoleyElements()) {
1855 bool force_generic) {
1858 key = TryConvertKey(key,
isolate());
1860 if (key->IsSymbol()) {
1864 if (object->IsJSProxy()) {
1866 *name, *value,
NONE, strict_mode);
1871 if (object->IsUndefined() ||
object->IsNull()) {
1872 return TypeError(
"non_object_property_store",
object, name);
1876 if (!object->IsJSObject())
return *value;
1881 if (name->AsArrayIndex(&index)) {
1889 if (FLAG_use_ic && !receiver->IsJSGlobalProxy()) {
1890 LookupResult lookup(
isolate());
1891 if (LookupForWrite(receiver, name, &lookup)) {
1892 UpdateCaches(&lookup, state, strict_mode, receiver, name, value);
1897 return receiver->SetProperty(*name, *value,
NONE, strict_mode);
1902 bool use_ic = FLAG_use_ic && !
object->IsAccessCheckNeeded();
1903 ASSERT(!(use_ic && object->IsJSGlobalProxy()));
1907 ? generic_stub_strict()
1909 if (object->IsJSObject()) {
1911 if (receiver->elements()->map() ==
1912 isolate()->
heap()->non_strict_arguments_elements_map()) {
1913 stub = non_strict_arguments_stub();
1914 }
else if (!force_generic) {
1915 if (key->IsSmi() && (
target() != *non_strict_arguments_stub())) {
1916 StubKind stub_kind = GetStubKind(receiver, key, value);
1917 stub =
ComputeStub(receiver, stub_kind, strict_mode, stub);
1923 if (!stub.
is_null()) set_target(*stub);
1930 isolate(),
object , key, value,
NONE, strict_mode);
1934 void KeyedStoreIC::UpdateCaches(LookupResult* lookup,
1940 ASSERT(!receiver->IsJSGlobalProxy());
1941 ASSERT(StoreICableLookup(lookup));
1960 name, receiver, lookup->GetFieldIndex(),
1964 if (lookup->GetAttributes() ==
NONE) {
1965 Handle<Map> transition(lookup->GetTransitionMap());
1966 int index = transition->PropertyIndexFor(*name);
1968 name, receiver, index, transition, strict_mode);
1980 ? generic_stub_strict()
1998 ? *megamorphic_stub_strict()
1999 : *megamorphic_stub());
2016 ASSERT(args.length() == 2);
2020 MaybeObject* maybe_result = ic.LoadFunction(state,
2025 JSFunction* raw_function =
NULL;
2026 if (!maybe_result->To(&raw_function))
return maybe_result;
2033 if (raw_function->
is_compiled())
return raw_function;
2044 ASSERT(args.length() == 2);
2047 MaybeObject* maybe_result =
2048 ic.LoadFunction(state, args.at<
Object>(0), args.at<
Object>(1));
2050 JSFunction* raw_function =
NULL;
2051 if (!maybe_result->To(&raw_function))
return maybe_result;
2053 if (raw_function->
is_compiled())
return raw_function;
2064 ASSERT(args.length() == 2);
2067 return ic.Load(state, args.at<
Object>(0), args.at<
String>(1));
2074 ASSERT(args.length() == 2);
2077 return ic.Load(state, args.at<
Object>(0), args.at<
Object>(1),
false);
2083 ASSERT(args.length() == 2);
2086 return ic.Load(state, args.at<
Object>(0), args.at<
Object>(1),
true);
2093 ASSERT(args.length() == 3);
2097 return ic.Store(state,
2106 NoHandleAllocation nha;
2108 ASSERT(args.length() == 2);
2117 LookupResult debug_lookup(isolate);
2118 receiver->LocalLookup(isolate->
heap()->length_symbol(), &debug_lookup);
2119 ASSERT(debug_lookup.type() ==
CALLBACKS && !debug_lookup.IsReadOnly());
2123 { MaybeObject* maybe_result = receiver->SetElementsLength(len);
2124 if (!maybe_result->ToObject(&result))
return maybe_result;
2134 NoHandleAllocation na;
2135 ASSERT(args.length() == 3);
2143 ASSERT(object->HasFastProperties());
2144 ASSERT(object->map()->unused_property_fields() == 0);
2147 FixedArray* old_storage =
object->properties();
2149 int new_size = old_storage->length() + new_unused + 1;
2151 { MaybeObject* maybe_result = old_storage->CopySize(new_size);
2152 if (!maybe_result->ToObject(&result))
return maybe_result;
2155 new_storage->
set(old_storage->length(), value);
2158 object->set_properties(new_storage);
2159 object->set_map(transition);
2169 ASSERT(args.length() == 3);
2173 return ic.Store(state,
2183 NoHandleAllocation na;
2184 ASSERT(args.length() == 3);
2202 ASSERT(args.length() == 3);
2206 return ic.Store(state,
2221 switch (type_info) {
2223 case SMI:
return "Smi";
2225 case GENERIC:
return "Generic";
2226 default:
return "Invalid";
2232 switch (type_info) {
2248 if (operand_type.
IsSmi()) {
2250 }
else if (operand_type.
IsNumber()) {
2261 switch (previous_type) {
2263 return current_type;
2286 switch (type_info) {
2288 case SMI:
return "SMI";
2289 case INT32:
return "Int32s";
2291 case ODDBALL:
return "Oddball";
2293 case STRING:
return "Strings";
2294 case GENERIC:
return "Generic";
2295 default:
return "Invalid";
2301 switch (type_info) {
2323 if (x == y)
return x;
2329 if (x > y)
return x;
2341 if (left_type.
IsSmi() && right_type.
IsSmi()) {
2359 }
else if (right_type.
IsString()) {
2364 if (left->IsUndefined() && right->IsNumber())
return ODDBALL;
2365 if (left->IsNumber() && right->IsUndefined())
return ODDBALL;
2372 ASSERT(args.length() == 4);
2387 if (FLAG_trace_ic) {
2388 PrintF(
"[UnaryOpIC (%s->%s)#%s]\n",
2402 builtin = builtins->javascript_builtin(Builtins::UNARY_MINUS);
2404 case Token::BIT_NOT:
2405 builtin = builtins->javascript_builtin(Builtins::BIT_NOT);
2413 bool caught_exception;
2416 if (caught_exception) {
2423 ASSERT(args.length() == 5);
2428 int key = args.smi_at(2);
2463 if (FLAG_trace_ic) {
2464 PrintF(
"[BinaryOpIC (%s->(%s->%s))#%s]\n",
2496 builtin = builtins->javascript_builtin(Builtins::MOD);
2498 case Token::BIT_AND:
2499 builtin = builtins->javascript_builtin(Builtins::BIT_AND);
2502 builtin = builtins->javascript_builtin(Builtins::BIT_OR);
2504 case Token::BIT_XOR:
2505 builtin = builtins->javascript_builtin(Builtins::BIT_XOR);
2508 builtin = builtins->javascript_builtin(Builtins::SHR);
2511 builtin = builtins->javascript_builtin(Builtins::SAR);
2514 builtin = builtins->javascript_builtin(Builtins::SHL);
2522 bool caught_exception;
2529 if (caught_exception) {
2536 Code* CompareIC::GetRawUninitialized(
Token::Value op) {
2539 CHECK(stub.FindCodeInCache(&code));
2546 return stub.GetCode();
2553 ASSERT(key == CodeStub::CompareIC);
2567 case SMIS:
return "SMIS";
2569 case OBJECTS:
return "OBJECTS";
2571 case SYMBOLS:
return "SYMBOLS";
2572 case STRINGS:
return "STRINGS";
2573 case GENERIC:
return "GENERIC";
2582 bool has_inlined_smi_code,
2587 if (x->IsSmi() && y->IsSmi())
return SMIS;
2588 if (x->IsNumber() && y->IsNumber())
return HEAP_NUMBERS;
2592 if ((x->IsNumber() && y->IsUndefined()) ||
2593 (y->IsNumber() && x->IsUndefined())) {
2597 if (x->IsSymbol() && y->IsSymbol()) {
2602 if (x->IsString() && y->IsString())
return STRINGS;
2604 if (x->IsJSObject() && y->IsJSObject()) {
2605 if (Handle<JSObject>::cast(x)->map() ==
2615 return has_inlined_smi_code && x->IsNumber() && y->IsNumber()
2635 NoHandleAllocation na;
2636 ASSERT(args.length() == 3);
2637 CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2)));
2638 ic.UpdateCaches(args.at<
Object>(0), args.at<
Object>(1));
2644 ASSERT(args.length() == 3);
2652 bool to_boolean_value = new_types.Record(
object);
2653 old_types.TraceTransition(new_types);
2668 static const Address IC_utilities[] = {
2669 #define ADDR(name) FUNCTION_ADDR(name),
2677 return IC_utilities[id];
virtual Handle< Code > string_stub()
static const int kCallerFPOffset
int IndexInCodeCache(Object *name, Code *code)
static TypeInfo GetTypeInfo(Handle< Object > operand)
static Handle< Object > SetProperty(Handle< JSReceiver > object, Handle< String > key, Handle< Object > value, PropertyAttributes attributes, StrictModeFlag strict_mode)
Code * builtin(Name name)
static bool CompileLazy(Handle< JSFunction > function, ClearExceptionFlag flag)
Object * function() const
static Object *& Object_at(Address addr)
bool IsExternalArrayElementsKind(ElementsKind kind)
void UpdateCaches(LookupResult *lookup, State state, Code::ExtraICState extra_ic_state, Handle< Object > object, Handle< String > name)
virtual Code::Kind kind() const =0
Handle< Code > ComputeLoadNormal()
Handle< Code > ComputeCallGlobal(int argc, Code::Kind, Code::ExtraICState extra_state, Handle< String > name, Handle< JSObject > receiver, Handle< GlobalObject > holder, Handle< JSGlobalPropertyCell > cell, Handle< JSFunction > function)
void set(int index, Object *value)
void PrintF(const char *format,...)
Handle< Code > ComputeKeyedLoadFunctionPrototype(Handle< String > name, Handle< JSFunction > receiver)
Handle< Code > ComputeStoreField(Handle< String > name, Handle< JSObject > receiver, int field_index, Handle< Map > transition, StrictModeFlag strict_mode)
static TypeFeedbackInfo * cast(Object *obj)
static String * cast(Object *obj)
virtual bool IsGeneric() const
static const char * GetName(TypeInfo type_info)
Code * Set(String *name, Map *map, Code *code)
virtual Handle< Code > GetElementStubWithoutMapCheck(bool is_js_array, ElementsKind elements_kind, KeyedAccessGrowMode grow_mode)
double DoubleToInteger(double x)
int unused_property_fields()
static const char * Name(Value tok)
static Smi * FromInt(int value)
#define LOG(isolate, Call)
MUST_USE_RESULT MaybeObject * LoadFunction(State state, Handle< Object > object, Handle< Object > key)
value format" "after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false, "print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false, "print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") DEFINE_bool(trace_incremental_marking, false, "trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true, "Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false, "Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true, "use inline caching") DEFINE_bool(native_code_counters, false, "generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false, "Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true, "Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false, "Never perform compaction on full GC-testing only") DEFINE_bool(compact_code_space, true, "Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true, "Flush inline caches prior to mark compact collection and" "flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0, "Default seed for initializing random generator" "(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true, "allows verbose printing") DEFINE_bool(allow_natives_syntax, false, "allow natives syntax") DEFINE_bool(trace_sim, false, "Trace simulator execution") DEFINE_bool(check_icache, false, "Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0, "Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8, "Stack alingment in bytes in simulator(4 or 8, 8 is default)") DEFINE_bool(trace_exception, false, "print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false, "preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true, "randomize hashes to avoid predictable hash collisions" "(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0, "Fixed seed to use to hash property keys(0 means random)" "(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false, "activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true, "generate optimized regexp code") DEFINE_bool(testing_bool_flag, true, "testing_bool_flag") DEFINE_int(testing_int_flag, 13, "testing_int_flag") DEFINE_float(testing_float_flag, 2.5, "float-flag") DEFINE_string(testing_string_flag, "Hello, world!", "string-flag") DEFINE_int(testing_prng_seed, 42, "Seed used for threading test randomness") DEFINE_string(testing_serialization_file, "/tmp/serdes", "file in which to serialize heap") DEFINE_bool(help, false, "Print usage message, including flags, on console") DEFINE_bool(dump_counters, false, "Dump counters on exit") DEFINE_string(map_counters, "", "Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT, "Pass all remaining arguments to the script.Alias for\"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#43"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2#define FLAG_MODE_DEFINE_DEFAULTS#1"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flag-definitions.h"1#define FLAG_FULL(ftype, ctype, nam, def, cmt)#define FLAG_READONLY(ftype, ctype, nam, def, cmt)#define DEFINE_implication(whenflag, thenflag)#define DEFINE_bool(nam, def, cmt)#define DEFINE_int(nam, def, cmt)#define DEFINE_float(nam, def, cmt)#define DEFINE_string(nam, def, cmt)#define DEFINE_args(nam, def, cmt)#define FLAG DEFINE_bool(use_strict, false,"enforce strict mode") DEFINE_bool(es5_readonly, false,"activate correct semantics for inheriting readonliness") DEFINE_bool(es52_globals, false,"activate new semantics for global var declarations") DEFINE_bool(harmony_typeof, false,"enable harmony semantics for typeof") DEFINE_bool(harmony_scoping, false,"enable harmony block scoping") DEFINE_bool(harmony_modules, false,"enable harmony modules (implies block scoping)") DEFINE_bool(harmony_proxies, false,"enable harmony proxies") DEFINE_bool(harmony_collections, false,"enable harmony collections (sets, maps, and weak maps)") DEFINE_bool(harmony, false,"enable all harmony features (except typeof)") DEFINE_implication(harmony, harmony_scoping) DEFINE_implication(harmony, harmony_modules) DEFINE_implication(harmony, harmony_proxies) DEFINE_implication(harmony, harmony_collections) DEFINE_implication(harmony_modules, harmony_scoping) DEFINE_bool(packed_arrays, false,"optimizes arrays that have no holes") DEFINE_bool(smi_only_arrays, true,"tracks arrays with only smi values") DEFINE_bool(clever_optimizations, true,"Optimize object size, Array shift, DOM strings and string +") DEFINE_bool(unbox_double_arrays, true,"automatically unbox arrays of doubles") DEFINE_bool(string_slices, true,"use string slices") DEFINE_bool(crankshaft, true,"use crankshaft") DEFINE_string(hydrogen_filter,"","optimization filter") DEFINE_bool(use_range, true,"use hydrogen range analysis") DEFINE_bool(eliminate_dead_phis, true,"eliminate dead phis") DEFINE_bool(use_gvn, true,"use hydrogen global value numbering") DEFINE_bool(use_canonicalizing, true,"use hydrogen instruction canonicalizing") DEFINE_bool(use_inlining, true,"use function inlining") DEFINE_int(max_inlined_source_size, 600,"maximum source size in bytes considered for a single inlining") DEFINE_int(max_inlined_nodes, 196,"maximum number of AST nodes considered for a single inlining") DEFINE_int(max_inlined_nodes_cumulative, 196,"maximum cumulative number of AST nodes considered for inlining") DEFINE_bool(loop_invariant_code_motion, true,"loop invariant code motion") DEFINE_bool(collect_megamorphic_maps_from_stub_cache, true,"crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false,"print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false,"trace generated hydrogen to file") DEFINE_string(trace_phase,"Z","trace generated IR for specified phases") DEFINE_bool(trace_inlining, false,"trace inlining decisions") DEFINE_bool(trace_alloc, false,"trace register allocator") DEFINE_bool(trace_all_uses, false,"trace all use positions") DEFINE_bool(trace_range, false,"trace range analysis") DEFINE_bool(trace_gvn, false,"trace global value numbering") DEFINE_bool(trace_representation, false,"trace representation types") DEFINE_bool(stress_pointer_maps, false,"pointer map for every instruction") DEFINE_bool(stress_environments, false,"environment for every instruction") DEFINE_int(deopt_every_n_times, 0,"deoptimize every n times a deopt point is passed") DEFINE_bool(trap_on_deopt, false,"put a break point before deoptimizing") DEFINE_bool(deoptimize_uncommon_cases, true,"deoptimize uncommon cases") DEFINE_bool(polymorphic_inlining, true,"polymorphic inlining") DEFINE_bool(use_osr, true,"use on-stack replacement") DEFINE_bool(array_bounds_checks_elimination, false,"perform array bounds checks elimination") DEFINE_bool(array_index_dehoisting, false,"perform array index dehoisting") DEFINE_bool(trace_osr, false,"trace on-stack replacement") DEFINE_int(stress_runs, 0,"number of stress runs") DEFINE_bool(optimize_closures, true,"optimize closures") DEFINE_bool(inline_construct, true,"inline constructor calls") DEFINE_bool(inline_arguments, true,"inline functions with arguments object") DEFINE_int(loop_weight, 1,"loop weight for representation inference") DEFINE_bool(optimize_for_in, true,"optimize functions containing for-in loops") DEFINE_bool(experimental_profiler, true,"enable all profiler experiments") DEFINE_bool(watch_ic_patching, false,"profiler considers IC stability") DEFINE_int(frame_count, 1,"number of stack frames inspected by the profiler") DEFINE_bool(self_optimization, false,"primitive functions trigger their own optimization") DEFINE_bool(direct_self_opt, false,"call recompile stub directly when self-optimizing") DEFINE_bool(retry_self_opt, false,"re-try self-optimization if it failed") DEFINE_bool(count_based_interrupts, false,"trigger profiler ticks based on counting instead of timing") DEFINE_bool(interrupt_at_exit, false,"insert an interrupt check at function exit") DEFINE_bool(weighted_back_edges, false,"weight back edges by jump distance for interrupt triggering") DEFINE_int(interrupt_budget, 5900,"execution budget before interrupt is triggered") DEFINE_int(type_info_threshold, 15,"percentage of ICs that must have type info to allow optimization") DEFINE_int(self_opt_count, 130,"call count before self-optimization") DEFINE_implication(experimental_profiler, watch_ic_patching) DEFINE_implication(experimental_profiler, self_optimization) DEFINE_implication(experimental_profiler, retry_self_opt) DEFINE_implication(experimental_profiler, count_based_interrupts) DEFINE_implication(experimental_profiler, interrupt_at_exit) DEFINE_implication(experimental_profiler, weighted_back_edges) DEFINE_bool(trace_opt_verbose, false,"extra verbose compilation tracing") DEFINE_implication(trace_opt_verbose, trace_opt) DEFINE_bool(debug_code, false,"generate extra code (assertions) for debugging") DEFINE_bool(code_comments, false,"emit comments in code disassembly") DEFINE_bool(enable_sse2, true,"enable use of SSE2 instructions if available") DEFINE_bool(enable_sse3, true,"enable use of SSE3 instructions if available") DEFINE_bool(enable_sse4_1, true,"enable use of SSE4.1 instructions if available") DEFINE_bool(enable_cmov, true,"enable use of CMOV instruction if available") DEFINE_bool(enable_rdtsc, true,"enable use of RDTSC instruction if available") DEFINE_bool(enable_sahf, true,"enable use of SAHF instruction if available (X64 only)") DEFINE_bool(enable_vfp3, true,"enable use of VFP3 instructions if available - this implies ""enabling ARMv7 instructions (ARM only)") DEFINE_bool(enable_armv7, true,"enable use of ARMv7 instructions if available (ARM only)") DEFINE_bool(enable_fpu, true,"enable use of MIPS FPU instructions if available (MIPS only)") DEFINE_string(expose_natives_as, NULL,"expose natives in global object") DEFINE_string(expose_debug_as, NULL,"expose debug in global object") DEFINE_bool(expose_gc, false,"expose gc extension") DEFINE_bool(expose_externalize_string, false,"expose externalize string extension") DEFINE_int(stack_trace_limit, 10,"number of stack frames to capture") DEFINE_bool(builtins_in_stack_traces, false,"show built-in functions in stack traces") DEFINE_bool(disable_native_files, false,"disable builtin natives files") DEFINE_bool(inline_new, true,"use fast inline allocation") DEFINE_bool(stack_trace_on_abort, true,"print a stack trace if an assertion failure occurs") DEFINE_bool(trace, false,"trace function calls") DEFINE_bool(mask_constants_with_cookie, true,"use random jit cookie to mask large constants") DEFINE_bool(lazy, true,"use lazy compilation") DEFINE_bool(trace_opt, false,"trace lazy optimization") DEFINE_bool(trace_opt_stats, false,"trace lazy optimization statistics") DEFINE_bool(opt, true,"use adaptive optimizations") DEFINE_bool(always_opt, false,"always try to optimize functions") DEFINE_bool(prepare_always_opt, false,"prepare for turning on always opt") DEFINE_bool(trace_deopt, false,"trace deoptimization") DEFINE_int(min_preparse_length, 1024,"minimum length for automatic enable preparsing") DEFINE_bool(always_full_compiler, false,"try to use the dedicated run-once backend for all code") DEFINE_bool(trace_bailout, false,"print reasons for falling back to using the classic V8 backend") DEFINE_bool(compilation_cache, true,"enable compilation cache") DEFINE_bool(cache_prototype_transitions, true,"cache prototype transitions") DEFINE_bool(trace_debug_json, false,"trace debugging JSON request/response") DEFINE_bool(debugger_auto_break, true,"automatically set the debug break flag when debugger commands are ""in the queue") DEFINE_bool(enable_liveedit, true,"enable liveedit experimental feature") DEFINE_bool(break_on_abort, true,"always cause a debug break before aborting") DEFINE_int(stack_size, kPointerSize *123,"default size of stack region v8 is allowed to use (in kBytes)") DEFINE_int(max_stack_trace_source_length, 300,"maximum length of function source code printed in a stack trace.") DEFINE_bool(always_inline_smi_code, false,"always inline smi code in non-opt code") DEFINE_int(max_new_space_size, 0,"max size of the new generation (in kBytes)") DEFINE_int(max_old_space_size, 0,"max size of the old generation (in Mbytes)") DEFINE_int(max_executable_size, 0,"max size of executable memory (in Mbytes)") DEFINE_bool(gc_global, false,"always perform global GCs") DEFINE_int(gc_interval,-1,"garbage collect after <n> allocations") DEFINE_bool(trace_gc, false,"print one trace line following each garbage collection") DEFINE_bool(trace_gc_nvp, false,"print one detailed trace line in name=value format ""after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false,"print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false,"print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false,"report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true,"garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true,"flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true,"use incremental marking") DEFINE_bool(incremental_marking_steps, true,"do incremental marking steps") DEFINE_bool(trace_incremental_marking, false,"trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true,"Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false,"Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true,"use inline caching") DEFINE_bool(native_code_counters, false,"generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false,"Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true,"Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false,"Never perform compaction on full GC - testing only") DEFINE_bool(compact_code_space, true,"Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true,"Flush inline caches prior to mark compact collection and ""flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0,"Default seed for initializing random generator ""(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true,"allows verbose printing") DEFINE_bool(allow_natives_syntax, false,"allow natives syntax") DEFINE_bool(trace_sim, false,"Trace simulator execution") DEFINE_bool(check_icache, false,"Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0,"Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8,"Stack alingment in bytes in simulator (4 or 8, 8 is default)") DEFINE_bool(trace_exception, false,"print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false,"preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true,"randomize hashes to avoid predictable hash collisions ""(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0,"Fixed seed to use to hash property keys (0 means random)""(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false,"activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true,"generate optimized regexp code") DEFINE_bool(testing_bool_flag, true,"testing_bool_flag") DEFINE_int(testing_int_flag, 13,"testing_int_flag") DEFINE_float(testing_float_flag, 2.5,"float-flag") DEFINE_string(testing_string_flag,"Hello, world!","string-flag") DEFINE_int(testing_prng_seed, 42,"Seed used for threading test randomness") DEFINE_string(testing_serialization_file,"/tmp/serdes","file in which to serialize heap") DEFINE_bool(help, false,"Print usage message, including flags, on console") DEFINE_bool(dump_counters, false,"Dump counters on exit") DEFINE_string(map_counters,"","Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT,"Pass all remaining arguments to the script. Alias for \"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#47"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2 namespace{struct Flag{enum FlagType{TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS} name
MUST_USE_RESULT MaybeObject * Load(State state, Handle< Object > object, Handle< String > name)
static Handle< T > cast(Handle< S > that)
static Map * cast(Object *obj)
static KeyedAccessGrowMode GetKeyedAccessGrowMode(ExtraICState extra_ic_state)
static Failure * Exception()
#define TRACE_IC(type, name, old_state, new_target)
static MUST_USE_RESULT MaybeObject * SetObjectProperty(Isolate *isolate, Handle< Object > object, Handle< Object > key, Handle< Object > value, PropertyAttributes attr, StrictModeFlag strict_mode)
void set_ic_with_type_info_count(int count)
Handle< Code > ComputeLoadCallback(Handle< String > name, Handle< JSObject > receiver, Handle< JSObject > holder, Handle< AccessorInfo > callback)
Handle< Code > ComputeKeyedLoadOrStoreElement(Handle< Map > receiver_map, KeyedIC::StubKind stub_kind, StrictModeFlag strict_mode)
static const int kCallerSPOffset
List< Handle< Map > > MapHandleList
Failure * TypeError(const char *type, Handle< Object > object, Handle< Object > key)
#define ASSERT(condition)
Handle< Code > ComputeCallMegamorphic(int argc, Code::Kind kind, Code::ExtraICState state)
void set_profiler_ticks(int ticks)
int ComputeExpressionsCount() const
#define PROFILE(isolate, Call)
static State StateFrom(Code *target, Object *receiver, Object *name)
Handle< Code > ComputeKeyedLoadInterceptor(Handle< String > name, Handle< JSObject > receiver, Handle< JSObject > holder)
static TypeInfo GetTypeInfo(Handle< Object > left, Handle< Object > right)
static const char * GetName(TypeInfo type_info)
Isolate * isolate() const
static const ExtraICState kNoExtraICState
Handle< Code > ComputeKeyedLoadCallback(Handle< String > name, Handle< JSObject > receiver, Handle< JSObject > holder, Handle< AccessorInfo > callback)
Handle< Object > GetProperty(Handle< JSReceiver > obj, const char *name)
#define RETURN_IF_EMPTY_HANDLE(isolate, call)
bool IsFastElementsKind(ElementsKind kind)
static uint32_t update(uint32_t previous, StringStubFeedbackvalue)
static TypeInfo TypeFromValue(Handle< Object > value)
MUST_USE_RESULT MaybeObject * Store(State state, StrictModeFlag strict_mode, Handle< Object > object, Handle< String > name, Handle< Object > value)
static Code * cast(Object *obj)
static State ToState(TypeInfo type_info)
void ReceiverToObjectIfRequired(Handle< Object > callee, Handle< Object > object)
void PatchInlinedSmiCode(Address address, InlinedSmiCheck check)
static Smi * cast(Object *object)
Handle< Code > ComputeKeyedLoadArrayLength(Handle< String > name, Handle< JSArray > receiver)
Handle< Code > ComputeCallInterceptor(int argc, Code::Kind, Code::ExtraICState extra_state, Handle< String > name, Handle< Object > object, Handle< JSObject > holder)
Handle< Code > ComputeCallArguments(int argc, Code::Kind kind)
Handle< Code > ComputeLoadField(Handle< String > name, Handle< JSObject > receiver, Handle< JSObject > holder, int field_index)
static JSFunctionProxy * cast(Object *obj)
const uint32_t kNotStringTag
HANDLE HANDLE LPSTACKFRAME64 StackFrame
static const int kCallerPCOffset
Handle< Code > ComputeStoreNormal(StrictModeFlag strict_mode)
static void Update(Handle< PolymorphicCodeCache > cache, MapHandleList *maps, Code::Flags flags, Handle< Code > code)
static void PrintTop(FILE *file, bool print_args, bool print_line_number)
static void PostPatching(Address address, Code *target, Code *old_target)
Handle< Code > ComputeCallField(int argc, Code::Kind, Code::ExtraICState extra_state, Handle< String > name, Handle< Object > object, Handle< JSObject > holder, int index)
static Address c_entry_fp(ThreadLocalTop *thread)
static InlineCacheHolderFlag ExtractCacheHolderFromFlags(Flags flags)
IC(FrameDepth depth, Isolate *isolate)
static const int kCallerFPOffset
V8EXPORT Local< Value > GetPrototype()
static bool IsValid(intptr_t value)
byte * instruction_start()
static Handle< Map > GetElementsTransitionMap(Handle< JSObject > object, ElementsKind to_kind)
static StrictModeFlag GetStrictMode(ExtraICState extra_ic_state)
void SetExpression(int index, Object *value)
Handle< Object > SetProperty(Handle< Object > object, Handle< Object > key, Handle< Object > value, PropertyAttributes attributes, StrictModeFlag strict_mode)
int Compare(const T &a, const T &b)
static Code * GetTargetAtAddress(Address address)
static Address & Address_at(Address addr)
Handle< Code > ComputeKeyedLoadStringLength(Handle< String > name, Handle< String > receiver)
bool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, ElementsKind to_kind)
MUST_USE_RESULT MaybeObject * LoadFunction(State state, Code::ExtraICState extra_ic_state, Handle< Object > object, Handle< String > name)
static ExtraICState ComputeExtraICState(KeyedAccessGrowMode grow_mode, StrictModeFlag strict_mode)
static bool decode(uint32_t value)
static Register from_code(int code)
static void Clear(Address address, Code *target)
static State ToState(TypeInfo type_info)
static MUST_USE_RESULT Handle< Object > SetElement(Handle< JSObject > object, uint32_t index, Handle< Object > value, PropertyAttributes attr, StrictModeFlag strict_mode, SetPropertyMode set_mode=SET_PROPERTY)
bool is_inline_cache_stub()
Handle< Code > ComputeStoreGlobal(Handle< String > name, Handle< GlobalObject > receiver, Handle< JSGlobalPropertyCell > cell, StrictModeFlag strict_mode)
static JavaScriptFrame * cast(StackFrame *frame)
virtual Handle< Code > GetElementStubWithoutMapCheck(bool is_js_array, ElementsKind elements_kind, KeyedAccessGrowMode grow_mode)
Failure * Throw(Object *exception, MessageLocation *location=NULL)
InlineCacheState ic_state()
static bool IsEqualityOp(Value op)
static const int kCallTargetAddressOffset
Handle< Code > ComputeStoreInterceptor(Handle< String > name, Handle< JSObject > receiver, StrictModeFlag strict_mode)
static Handle< Object > Call(Handle< Object > callable, Handle< Object > receiver, int argc, Handle< Object > argv[], bool *pending_exception, bool convert_receiver=false)
static JSArray * cast(Object *obj)
virtual Handle< Code > ComputePolymorphicStub(MapHandleList *receiver_maps, StrictModeFlag strict_mode, KeyedAccessGrowMode grow_mode)
Handle< Code > ComputeLoadViaGetter(Handle< String > name, Handle< JSObject > receiver, Handle< JSObject > holder, Handle< JSFunction > getter)
static TypeInfo ComputeNewType(TypeInfo type, TypeInfo previous)
Handle< Object > TryCallAsFunction(Handle< Object > object)
Handle< Code > ComputeKeyedLoadField(Handle< String > name, Handle< JSObject > receiver, Handle< JSObject > holder, int field_index)
MUST_USE_RESULT MaybeObject * Load(State state, Handle< Object > object, Handle< Object > key, bool force_generic_stub)
Handle< Code > ComputeCallNormal(int argc, Code::Kind kind, Code::ExtraICState state)
#define IC_UTIL_LIST(ICU)
Handle< Object > NewReferenceError(const char *type, Vector< Handle< Object > > args)
Handle< Code > ComputeKeyedStoreField(Handle< String > name, Handle< JSObject > receiver, int field_index, Handle< Map > transition, StrictModeFlag strict_mode)
ExtraICState extra_ic_state()
static Object * cast(Object *value)
static MUST_USE_RESULT MaybeObject * FunctionGetPrototype(Object *object, void *)
static Flags ComputeFlags(Kind kind, InlineCacheState ic_state=UNINITIALIZED, ExtraICState extra_ic_state=kNoExtraICState, PropertyType type=NORMAL, int argc=-1, InlineCacheHolderFlag holder=OWN_MAP)
Handle< Object > NewTypeError(const char *type, Vector< Handle< Object > > args)
static Token::Value ComputeOperation(Code *target)
static Handle< Object > GetFunctionDelegate(Handle< Object > object)
static JSValue * cast(Object *obj)
static Handle< T > null()
static const int kCallerPCOffset
virtual Handle< Code > ComputePolymorphicStub(MapHandleList *receiver_maps, StrictModeFlag strict_mode, KeyedAccessGrowMode grow_mode)
static JSObject * GetCodeCacheHolder(Object *object, InlineCacheHolderFlag holder)
static void SetTargetAtAddress(Address address, Code *target)
MUST_USE_RESULT MaybeObject * GetProperty(String *key)
static MUST_USE_RESULT MaybeObject * GetObjectProperty(Isolate *isolate, Handle< Object > object, Handle< Object > key)
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
int ic_with_type_info_count()
virtual Handle< Code > ComputePolymorphicStub(MapHandleList *receiver_maps, StrictModeFlag strict_mode, KeyedAccessGrowMode grow_mode)=0
static JSProxy * cast(Object *obj)
static State ComputeState(Code *target)
virtual Handle< Code > string_stub()
Handle< Code > ComputeMonomorphicStub(LookupResult *lookup, State state, Code::ExtraICState extra_state, Handle< Object > object, Handle< String > name)
Handle< Code > ComputeStub(Handle< JSObject > receiver, StubKind stub_kind, StrictModeFlag strict_mode, Handle< Code > default_stub)
static FixedArray * cast(Object *obj)
#define TRACE_GENERIC_IC(type, reason)
static Handle< Object > GetElement(Handle< Object > object, uint32_t index)
bool TryUpdateExtraICState(LookupResult *lookup, Handle< Object > object, Code::ExtraICState *extra_ic_state)
void set_target(Code *code)
Handle< Code > ComputeCallPreMonomorphic(int argc, Code::Kind kind, Code::ExtraICState extra_state)
virtual Handle< Code > GetElementStubWithoutMapCheck(bool is_js_array, ElementsKind elements_kind, KeyedAccessGrowMode grow_mode)=0
Handle< Code > ComputeLoadNonexistent(Handle< String > name, Handle< JSObject > receiver)
static TypeInfo JoinTypes(TypeInfo x, TypeInfo y)
Handle< Code > ComputeLoadConstant(Handle< String > name, Handle< JSObject > receiver, Handle< JSObject > holder, Handle< JSFunction > value)
Vector< Handle< Object > > HandleVector(v8::internal::Handle< T > *elms, int length)
const int kMaxKeyedPolymorphism
Handle< Code > ComputeLoadInterceptor(Handle< String > name, Handle< JSObject > receiver, Handle< JSObject > holder)
Handle< Code > CompileLoadPolymorphic(MapHandleList *receiver_maps, CodeHandleList *handler_ics)
Handle< Code > ComputeCallConstant(int argc, Code::Kind, Code::ExtraICState extra_state, Handle< String > name, Handle< Object > object, Handle< JSObject > holder, Handle< JSFunction > function)
Handle< Code > CompileStorePolymorphic(MapHandleList *receiver_maps, CodeHandleList *handler_stubs, MapHandleList *transitioned_maps)
static const char * GetStateName(State state)
MUST_USE_RESULT MaybeObject * Store(State state, StrictModeFlag strict_mode, Handle< Object > object, Handle< Object > name, Handle< Object > value, bool force_generic)
ThreadLocalTop * thread_local_top()
RelocInfo::Mode ComputeMode()
static Address AddressFromUtilityId(UtilityId id)
static Handle< Code > GetUninitialized(Token::Value op)
Handle< Code > ComputeKeyedLoadConstant(Handle< String > name, Handle< JSObject > receiver, Handle< JSObject > holder, Handle< JSFunction > value)
bool IsContextual(Handle< Object > receiver)
Failure * ReferenceError(const char *type, Handle< String > name)
Handle< Code > ComputeLoadGlobal(Handle< String > name, Handle< JSObject > receiver, Handle< GlobalObject > holder, Handle< JSGlobalPropertyCell > cell, bool is_dont_delete)
static JSObject * cast(Object *obj)
static MUST_USE_RESULT MaybeObject * GetElementOrCharAt(Isolate *isolate, Handle< Object > object, uint32_t index)
Handle< Code > ComputeMonomorphicStubWithoutMapCheck(Handle< Map > receiver_map, StrictModeFlag strict_mode, KeyedAccessGrowMode grow_mode)
static void Clear(Address address)
bool IsDictionaryElementsKind(ElementsKind kind)
Handle< Code > ComputeStoreCallback(Handle< String > name, Handle< JSObject > receiver, Handle< AccessorInfo > callback, StrictModeFlag strict_mode)
static bool IsOrderedRelationalCompareOp(Value op)
Handle< Code > ComputeStoreViaSetter(Handle< String > name, Handle< JSObject > receiver, Handle< JSFunction > setter, StrictModeFlag strict_mode)
static JSFunction * cast(Object *obj)