Index: src/stub-cache.h |
=================================================================== |
--- src/stub-cache.h (revision 7267) |
+++ src/stub-cache.h (working copy) |
@@ -28,6 +28,7 @@ |
#ifndef V8_STUB_CACHE_H_ |
#define V8_STUB_CACHE_H_ |
+#include "arguments.h" |
#include "macro-assembler.h" |
#include "zone-inl.h" |
@@ -43,50 +44,62 @@ |
// invalidate the cache whenever a prototype map is changed. The stub |
// validates the map chain as in the mono-morphic case. |
-class SCTableReference; |
+class StubCache; |
+class SCTableReference { |
+ public: |
+ Address address() const { return address_; } |
-class StubCache : public AllStatic { |
+ private: |
+ explicit SCTableReference(Address address) : address_(address) {} |
+ |
+ Address address_; |
+ |
+ friend class StubCache; |
+}; |
+ |
+ |
+class StubCache { |
public: |
struct Entry { |
String* key; |
Code* value; |
}; |
+ void Initialize(bool create_heap_objects); |
- static void Initialize(bool create_heap_objects); |
// Computes the right stub matching. Inserts the result in the |
// cache before returning. This might compile a stub if needed. |
- MUST_USE_RESULT static MaybeObject* ComputeLoadNonexistent( |
+ MUST_USE_RESULT MaybeObject* ComputeLoadNonexistent( |
String* name, |
JSObject* receiver); |
- MUST_USE_RESULT static MaybeObject* ComputeLoadField(String* name, |
- JSObject* receiver, |
- JSObject* holder, |
- int field_index); |
+ MUST_USE_RESULT MaybeObject* ComputeLoadField(String* name, |
+ JSObject* receiver, |
+ JSObject* holder, |
+ int field_index); |
- MUST_USE_RESULT static MaybeObject* ComputeLoadCallback( |
+ MUST_USE_RESULT MaybeObject* ComputeLoadCallback( |
String* name, |
JSObject* receiver, |
JSObject* holder, |
AccessorInfo* callback); |
- MUST_USE_RESULT static MaybeObject* ComputeLoadConstant(String* name, |
- JSObject* receiver, |
- JSObject* holder, |
- Object* value); |
+ MUST_USE_RESULT MaybeObject* ComputeLoadConstant(String* name, |
+ JSObject* receiver, |
+ JSObject* holder, |
+ Object* value); |
- MUST_USE_RESULT static MaybeObject* ComputeLoadInterceptor( |
+ MUST_USE_RESULT MaybeObject* ComputeLoadInterceptor( |
String* name, |
JSObject* receiver, |
JSObject* holder); |
- MUST_USE_RESULT static MaybeObject* ComputeLoadNormal(); |
+ MUST_USE_RESULT MaybeObject* ComputeLoadNormal(); |
- MUST_USE_RESULT static MaybeObject* ComputeLoadGlobal( |
+ MUST_USE_RESULT MaybeObject* ComputeLoadGlobal( |
String* name, |
JSObject* receiver, |
GlobalObject* holder, |
@@ -96,101 +109,102 @@ |
// --- |
- MUST_USE_RESULT static MaybeObject* ComputeKeyedLoadField(String* name, |
- JSObject* receiver, |
- JSObject* holder, |
- int field_index); |
+ MUST_USE_RESULT MaybeObject* ComputeKeyedLoadField(String* name, |
+ JSObject* receiver, |
+ JSObject* holder, |
+ int field_index); |
- MUST_USE_RESULT static MaybeObject* ComputeKeyedLoadCallback( |
+ MUST_USE_RESULT MaybeObject* ComputeKeyedLoadCallback( |
String* name, |
JSObject* receiver, |
JSObject* holder, |
AccessorInfo* callback); |
- MUST_USE_RESULT static MaybeObject* ComputeKeyedLoadConstant( |
+ MUST_USE_RESULT MaybeObject* ComputeKeyedLoadConstant( |
String* name, |
JSObject* receiver, |
JSObject* holder, |
Object* value); |
- MUST_USE_RESULT static MaybeObject* ComputeKeyedLoadInterceptor( |
+ MUST_USE_RESULT MaybeObject* ComputeKeyedLoadInterceptor( |
String* name, |
JSObject* receiver, |
JSObject* holder); |
- MUST_USE_RESULT static MaybeObject* ComputeKeyedLoadArrayLength( |
+ MUST_USE_RESULT MaybeObject* ComputeKeyedLoadArrayLength( |
String* name, |
JSArray* receiver); |
- MUST_USE_RESULT static MaybeObject* ComputeKeyedLoadStringLength( |
+ MUST_USE_RESULT MaybeObject* ComputeKeyedLoadStringLength( |
String* name, |
String* receiver); |
- MUST_USE_RESULT static MaybeObject* ComputeKeyedLoadFunctionPrototype( |
+ MUST_USE_RESULT MaybeObject* ComputeKeyedLoadFunctionPrototype( |
String* name, |
JSFunction* receiver); |
- MUST_USE_RESULT static MaybeObject* ComputeKeyedLoadSpecialized( |
+ MUST_USE_RESULT MaybeObject* ComputeKeyedLoadSpecialized( |
JSObject* receiver); |
// --- |
- MUST_USE_RESULT static MaybeObject* ComputeStoreField( |
+ MUST_USE_RESULT MaybeObject* ComputeStoreField( |
String* name, |
JSObject* receiver, |
int field_index, |
Map* transition, |
StrictModeFlag strict_mode); |
- MUST_USE_RESULT static MaybeObject* ComputeStoreNormal( |
+ MUST_USE_RESULT MaybeObject* ComputeStoreNormal( |
StrictModeFlag strict_mode); |
- MUST_USE_RESULT static MaybeObject* ComputeStoreGlobal( |
+ MUST_USE_RESULT MaybeObject* ComputeStoreGlobal( |
String* name, |
GlobalObject* receiver, |
JSGlobalPropertyCell* cell, |
StrictModeFlag strict_mode); |
- MUST_USE_RESULT static MaybeObject* ComputeStoreCallback( |
+ MUST_USE_RESULT MaybeObject* ComputeStoreCallback( |
String* name, |
JSObject* receiver, |
AccessorInfo* callback, |
StrictModeFlag strict_mode); |
- MUST_USE_RESULT static MaybeObject* ComputeStoreInterceptor( |
+ MUST_USE_RESULT MaybeObject* ComputeStoreInterceptor( |
String* name, |
JSObject* receiver, |
StrictModeFlag strict_mode); |
// --- |
- MUST_USE_RESULT static MaybeObject* ComputeKeyedStoreField( |
+ MUST_USE_RESULT MaybeObject* ComputeKeyedStoreField( |
String* name, |
JSObject* receiver, |
int field_index, |
Map* transition, |
StrictModeFlag strict_mode); |
- MUST_USE_RESULT static MaybeObject* ComputeKeyedStoreSpecialized( |
+ MUST_USE_RESULT MaybeObject* ComputeKeyedStoreSpecialized( |
JSObject* receiver, |
StrictModeFlag strict_mode); |
- MUST_USE_RESULT static MaybeObject* ComputeKeyedLoadOrStoreExternalArray( |
+ |
+ MUST_USE_RESULT MaybeObject* ComputeKeyedLoadOrStoreExternalArray( |
JSObject* receiver, |
bool is_store, |
StrictModeFlag strict_mode); |
// --- |
- MUST_USE_RESULT static MaybeObject* ComputeCallField(int argc, |
- InLoopFlag in_loop, |
- Code::Kind, |
- String* name, |
- Object* object, |
- JSObject* holder, |
- int index); |
+ MUST_USE_RESULT MaybeObject* ComputeCallField(int argc, |
+ InLoopFlag in_loop, |
+ Code::Kind, |
+ String* name, |
+ Object* object, |
+ JSObject* holder, |
+ int index); |
- MUST_USE_RESULT static MaybeObject* ComputeCallConstant( |
+ MUST_USE_RESULT MaybeObject* ComputeCallConstant( |
int argc, |
InLoopFlag in_loop, |
Code::Kind, |
@@ -200,19 +214,19 @@ |
JSObject* holder, |
JSFunction* function); |
- MUST_USE_RESULT static MaybeObject* ComputeCallNormal(int argc, |
- InLoopFlag in_loop, |
- Code::Kind, |
- String* name, |
- JSObject* receiver); |
+ MUST_USE_RESULT MaybeObject* ComputeCallNormal(int argc, |
+ InLoopFlag in_loop, |
+ Code::Kind, |
+ String* name, |
+ JSObject* receiver); |
- MUST_USE_RESULT static MaybeObject* ComputeCallInterceptor(int argc, |
- Code::Kind, |
- String* name, |
- Object* object, |
- JSObject* holder); |
+ MUST_USE_RESULT MaybeObject* ComputeCallInterceptor(int argc, |
+ Code::Kind, |
+ String* name, |
+ Object* object, |
+ JSObject* holder); |
- MUST_USE_RESULT static MaybeObject* ComputeCallGlobal( |
+ MUST_USE_RESULT MaybeObject* ComputeCallGlobal( |
int argc, |
InLoopFlag in_loop, |
Code::Kind, |
@@ -224,80 +238,103 @@ |
// --- |
- MUST_USE_RESULT static MaybeObject* ComputeCallInitialize(int argc, |
- InLoopFlag in_loop, |
- Code::Kind kind); |
+ MUST_USE_RESULT MaybeObject* ComputeCallInitialize(int argc, |
+ InLoopFlag in_loop, |
+ Code::Kind kind); |
- static Handle<Code> ComputeCallInitialize(int argc, InLoopFlag in_loop); |
+ Handle<Code> ComputeCallInitialize(int argc, InLoopFlag in_loop); |
- static Handle<Code> ComputeKeyedCallInitialize(int argc, InLoopFlag in_loop); |
+ Handle<Code> ComputeKeyedCallInitialize(int argc, InLoopFlag in_loop); |
- MUST_USE_RESULT static MaybeObject* ComputeCallPreMonomorphic( |
+ MUST_USE_RESULT MaybeObject* ComputeCallPreMonomorphic( |
int argc, |
InLoopFlag in_loop, |
Code::Kind kind); |
- MUST_USE_RESULT static MaybeObject* ComputeCallNormal(int argc, |
- InLoopFlag in_loop, |
- Code::Kind kind); |
+ MUST_USE_RESULT MaybeObject* ComputeCallNormal(int argc, |
+ InLoopFlag in_loop, |
+ Code::Kind kind); |
- MUST_USE_RESULT static MaybeObject* ComputeCallMegamorphic(int argc, |
- InLoopFlag in_loop, |
- Code::Kind kind); |
- |
- MUST_USE_RESULT static MaybeObject* ComputeCallMiss(int argc, |
+ MUST_USE_RESULT MaybeObject* ComputeCallMegamorphic(int argc, |
+ InLoopFlag in_loop, |
Code::Kind kind); |
+ MUST_USE_RESULT MaybeObject* ComputeCallMiss(int argc, Code::Kind kind); |
+ |
// Finds the Code object stored in the Heap::non_monomorphic_cache(). |
- MUST_USE_RESULT static Code* FindCallInitialize(int argc, |
- InLoopFlag in_loop, |
- Code::Kind kind); |
+ MUST_USE_RESULT Code* FindCallInitialize(int argc, |
+ InLoopFlag in_loop, |
+ Code::Kind kind); |
#ifdef ENABLE_DEBUGGER_SUPPORT |
- MUST_USE_RESULT static MaybeObject* ComputeCallDebugBreak(int argc, |
- Code::Kind kind); |
+ MUST_USE_RESULT MaybeObject* ComputeCallDebugBreak(int argc, Code::Kind kind); |
- MUST_USE_RESULT static MaybeObject* ComputeCallDebugPrepareStepIn( |
- int argc, |
- Code::Kind kind); |
+ MUST_USE_RESULT MaybeObject* ComputeCallDebugPrepareStepIn(int argc, |
+ Code::Kind kind); |
#endif |
// Update cache for entry hash(name, map). |
- static Code* Set(String* name, Map* map, Code* code); |
+ Code* Set(String* name, Map* map, Code* code); |
// Clear the lookup table (@ mark compact collection). |
- static void Clear(); |
+ void Clear(); |
// Collect all maps that match the name and flags. |
- static void CollectMatchingMaps(ZoneMapList* types, |
- String* name, |
- Code::Flags flags); |
+ void CollectMatchingMaps(ZoneMapList* types, |
+ String* name, |
+ Code::Flags flags); |
// Generate code for probing the stub cache table. |
// Arguments extra and extra2 may be used to pass additional scratch |
// registers. Set to no_reg if not needed. |
- static void GenerateProbe(MacroAssembler* masm, |
- Code::Flags flags, |
- Register receiver, |
- Register name, |
- Register scratch, |
- Register extra, |
- Register extra2 = no_reg); |
+ void GenerateProbe(MacroAssembler* masm, |
+ Code::Flags flags, |
+ Register receiver, |
+ Register name, |
+ Register scratch, |
+ Register extra, |
+ Register extra2 = no_reg); |
enum Table { |
kPrimary, |
kSecondary |
}; |
+ |
+ SCTableReference key_reference(StubCache::Table table) { |
+ return SCTableReference( |
+ reinterpret_cast<Address>(&first_entry(table)->key)); |
+ } |
+ |
+ |
+ SCTableReference value_reference(StubCache::Table table) { |
+ return SCTableReference( |
+ reinterpret_cast<Address>(&first_entry(table)->value)); |
+ } |
+ |
+ |
+ StubCache::Entry* first_entry(StubCache::Table table) { |
+ switch (table) { |
+ case StubCache::kPrimary: return StubCache::primary_; |
+ case StubCache::kSecondary: return StubCache::secondary_; |
+ } |
+ UNREACHABLE(); |
+ return NULL; |
+ } |
+ |
+ |
private: |
+ explicit StubCache(Isolate* isolate); |
+ |
+ friend class Isolate; |
friend class SCTableReference; |
static const int kPrimaryTableSize = 2048; |
static const int kSecondaryTableSize = 512; |
- static Entry primary_[]; |
- static Entry secondary_[]; |
+ Entry primary_[kPrimaryTableSize]; |
+ Entry secondary_[kSecondaryTableSize]; |
// Computes the hashed offsets for primary and secondary caches. |
- static int PrimaryOffset(String* name, Code::Flags flags, Map* map) { |
+ RLYSTC int PrimaryOffset(String* name, Code::Flags flags, Map* map) { |
// This works well because the heap object tag size and the hash |
// shift are equal. Shifting down the length field to get the |
// hash code would effectively throw away two bits of the hash |
@@ -320,7 +357,7 @@ |
return key & ((kPrimaryTableSize - 1) << kHeapObjectTagSize); |
} |
- static int SecondaryOffset(String* name, Code::Flags flags, int seed) { |
+ RLYSTC int SecondaryOffset(String* name, Code::Flags flags, int seed) { |
// Use the seed from the primary cache in the secondary cache. |
uint32_t string_low32bits = |
static_cast<uint32_t>(reinterpret_cast<uintptr_t>(name)); |
@@ -337,59 +374,33 @@ |
// ends in String::kHashShift 0s. Then we shift it so it is a multiple |
// of sizeof(Entry). This makes it easier to avoid making mistakes |
// in the hashed offset computations. |
- static Entry* entry(Entry* table, int offset) { |
+ RLYSTC Entry* entry(Entry* table, int offset) { |
const int shift_amount = kPointerSizeLog2 + 1 - String::kHashShift; |
return reinterpret_cast<Entry*>( |
reinterpret_cast<Address>(table) + (offset << shift_amount)); |
} |
-}; |
+ Isolate* isolate_; |
-class SCTableReference { |
- public: |
- static SCTableReference keyReference(StubCache::Table table) { |
- return SCTableReference( |
- reinterpret_cast<Address>(&first_entry(table)->key)); |
- } |
+ DISALLOW_COPY_AND_ASSIGN(StubCache); |
+}; |
- static SCTableReference valueReference(StubCache::Table table) { |
- return SCTableReference( |
- reinterpret_cast<Address>(&first_entry(table)->value)); |
- } |
- |
- Address address() const { return address_; } |
- |
- private: |
- explicit SCTableReference(Address address) : address_(address) {} |
- |
- static StubCache::Entry* first_entry(StubCache::Table table) { |
- switch (table) { |
- case StubCache::kPrimary: return StubCache::primary_; |
- case StubCache::kSecondary: return StubCache::secondary_; |
- } |
- UNREACHABLE(); |
- return NULL; |
- } |
- |
- Address address_; |
-}; |
- |
// ------------------------------------------------------------------------ |
// Support functions for IC stubs for callbacks. |
-MaybeObject* LoadCallbackProperty(Arguments args); |
-MaybeObject* StoreCallbackProperty(Arguments args); |
+MaybeObject* LoadCallbackProperty(RUNTIME_CALLING_CONVENTION); |
+MaybeObject* StoreCallbackProperty(RUNTIME_CALLING_CONVENTION); |
// Support functions for IC stubs for interceptors. |
-MaybeObject* LoadPropertyWithInterceptorOnly(Arguments args); |
-MaybeObject* LoadPropertyWithInterceptorForLoad(Arguments args); |
-MaybeObject* LoadPropertyWithInterceptorForCall(Arguments args); |
-MaybeObject* StoreInterceptorProperty(Arguments args); |
-MaybeObject* CallInterceptorProperty(Arguments args); |
-MaybeObject* KeyedLoadPropertyWithInterceptor(Arguments args); |
+MaybeObject* LoadPropertyWithInterceptorOnly(RUNTIME_CALLING_CONVENTION); |
+MaybeObject* LoadPropertyWithInterceptorForLoad(RUNTIME_CALLING_CONVENTION); |
+MaybeObject* LoadPropertyWithInterceptorForCall(RUNTIME_CALLING_CONVENTION); |
+MaybeObject* StoreInterceptorProperty(RUNTIME_CALLING_CONVENTION); |
+MaybeObject* CallInterceptorProperty(RUNTIME_CALLING_CONVENTION); |
+MaybeObject* KeyedLoadPropertyWithInterceptor(RUNTIME_CALLING_CONVENTION); |
// The stub compiler compiles stubs for the stub cache. |
@@ -547,6 +558,8 @@ |
String* name, |
LookupResult* lookup); |
+ Isolate* isolate() { return scope_.isolate(); } |
+ |
private: |
HandleScope scope_; |
MacroAssembler masm_; |