| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 struct Entry { | 69 struct Entry { |
| 70 String* key; | 70 String* key; |
| 71 Code* value; | 71 Code* value; |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 void Initialize(bool create_heap_objects); | 74 void Initialize(bool create_heap_objects); |
| 75 | 75 |
| 76 | 76 |
| 77 // Computes the right stub matching. Inserts the result in the | 77 // Computes the right stub matching. Inserts the result in the |
| 78 // cache before returning. This might compile a stub if needed. | 78 // cache before returning. This might compile a stub if needed. |
| 79 MUST_USE_RESULT MaybeObject* ComputeLoadNonexistent( | 79 Handle<Code> ComputeLoadNonexistent(Handle<String> name, |
| 80 String* name, | 80 Handle<JSObject> receiver); |
| 81 JSObject* receiver); | |
| 82 | 81 |
| 83 MUST_USE_RESULT MaybeObject* ComputeLoadField(String* name, | 82 Handle<Code> ComputeLoadField(Handle<String> name, |
| 84 JSObject* receiver, | 83 Handle<JSObject> receiver, |
| 85 JSObject* holder, | 84 Handle<JSObject> holder, |
| 86 int field_index); | 85 int field_index); |
| 87 | 86 |
| 88 MUST_USE_RESULT MaybeObject* ComputeLoadCallback( | 87 Handle<Code> ComputeLoadCallback(Handle<String> name, |
| 89 String* name, | 88 Handle<JSObject> receiver, |
| 90 JSObject* receiver, | 89 Handle<JSObject> holder, |
| 91 JSObject* holder, | 90 Handle<AccessorInfo> callback); |
| 92 AccessorInfo* callback); | |
| 93 | 91 |
| 94 MUST_USE_RESULT MaybeObject* ComputeLoadConstant(String* name, | 92 Handle<Code> ComputeLoadConstant(Handle<String> name, |
| 95 JSObject* receiver, | 93 Handle<JSObject> receiver, |
| 96 JSObject* holder, | 94 Handle<JSObject> holder, |
| 97 Object* value); | 95 Handle<Object> value); |
| 98 | 96 |
| 99 MUST_USE_RESULT MaybeObject* ComputeLoadInterceptor( | 97 Handle<Code> ComputeLoadInterceptor(Handle<String> name, |
| 100 String* name, | 98 Handle<JSObject> receiver, |
| 101 JSObject* receiver, | 99 Handle<JSObject> holder); |
| 102 JSObject* holder); | |
| 103 | 100 |
| 104 MUST_USE_RESULT MaybeObject* ComputeLoadNormal(); | 101 Handle<Code> ComputeLoadNormal(); |
| 105 | 102 |
| 106 | 103 Handle<Code> ComputeLoadGlobal(Handle<String> name, |
| 107 MUST_USE_RESULT MaybeObject* ComputeLoadGlobal( | 104 Handle<JSObject> receiver, |
| 108 String* name, | 105 Handle<GlobalObject> holder, |
| 109 JSObject* receiver, | 106 Handle<JSGlobalPropertyCell> cell, |
| 110 GlobalObject* holder, | 107 bool is_dont_delete); |
| 111 JSGlobalPropertyCell* cell, | |
| 112 bool is_dont_delete); | |
| 113 | |
| 114 | 108 |
| 115 // --- | 109 // --- |
| 116 | 110 |
| 117 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadField(String* name, | 111 Handle<Code> ComputeKeyedLoadField(Handle<String> name, |
| 118 JSObject* receiver, | 112 Handle<JSObject> receiver, |
| 119 JSObject* holder, | 113 Handle<JSObject> holder, |
| 120 int field_index); | 114 int field_index); |
| 121 | 115 |
| 122 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadCallback( | 116 Handle<Code> ComputeKeyedLoadCallback(Handle<String> name, |
| 123 String* name, | 117 Handle<JSObject> receiver, |
| 124 JSObject* receiver, | 118 Handle<JSObject> holder, |
| 125 JSObject* holder, | 119 Handle<AccessorInfo> callback); |
| 126 AccessorInfo* callback); | |
| 127 | 120 |
| 128 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadConstant( | 121 Handle<Code> ComputeKeyedLoadConstant(Handle<String> name, |
| 129 String* name, | 122 Handle<JSObject> receiver, |
| 130 JSObject* receiver, | 123 Handle<JSObject> holder, |
| 131 JSObject* holder, | 124 Handle<Object> value); |
| 132 Object* value); | |
| 133 | 125 |
| 134 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadInterceptor( | 126 Handle<Code> ComputeKeyedLoadInterceptor(Handle<String> name, |
| 135 String* name, | 127 Handle<JSObject> receiver, |
| 136 JSObject* receiver, | 128 Handle<JSObject> holder); |
| 137 JSObject* holder); | |
| 138 | 129 |
| 139 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadArrayLength( | 130 Handle<Code> ComputeKeyedLoadArrayLength(Handle<String> name, |
| 140 String* name, | 131 Handle<JSArray> receiver); |
| 141 JSArray* receiver); | |
| 142 | 132 |
| 143 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadStringLength( | 133 Handle<Code> ComputeKeyedLoadStringLength(Handle<String> name, |
| 144 String* name, | 134 Handle<String> receiver); |
| 145 String* receiver); | |
| 146 | 135 |
| 147 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadFunctionPrototype( | 136 Handle<Code> ComputeKeyedLoadFunctionPrototype(Handle<String> name, |
| 148 String* name, | 137 Handle<JSFunction> receiver); |
| 149 JSFunction* receiver); | |
| 150 | 138 |
| 151 // --- | 139 // --- |
| 152 | 140 |
| 153 MUST_USE_RESULT MaybeObject* ComputeStoreField( | 141 Handle<Code> ComputeStoreField(Handle<String> name, |
| 154 String* name, | 142 Handle<JSObject> receiver, |
| 155 JSObject* receiver, | 143 int field_index, |
| 156 int field_index, | 144 Handle<Map> transition, |
| 157 Map* transition, | 145 StrictModeFlag strict_mode); |
| 158 StrictModeFlag strict_mode); | |
| 159 | 146 |
| 160 MUST_USE_RESULT MaybeObject* ComputeStoreNormal( | 147 Handle<Code> ComputeStoreNormal(StrictModeFlag strict_mode); |
| 161 StrictModeFlag strict_mode); | |
| 162 | 148 |
| 163 MUST_USE_RESULT MaybeObject* ComputeStoreGlobal( | 149 Handle<Code> ComputeStoreGlobal(Handle<String> name, |
| 164 String* name, | 150 Handle<GlobalObject> receiver, |
| 165 GlobalObject* receiver, | 151 Handle<JSGlobalPropertyCell> cell, |
| 166 JSGlobalPropertyCell* cell, | 152 StrictModeFlag strict_mode); |
| 167 StrictModeFlag strict_mode); | |
| 168 | 153 |
| 169 MUST_USE_RESULT MaybeObject* ComputeStoreCallback( | 154 Handle<Code> ComputeStoreCallback(Handle<String> name, |
| 170 String* name, | 155 Handle<JSObject> receiver, |
| 171 JSObject* receiver, | 156 Handle<AccessorInfo> callback, |
| 172 AccessorInfo* callback, | 157 StrictModeFlag strict_mode); |
| 173 StrictModeFlag strict_mode); | |
| 174 | 158 |
| 175 MUST_USE_RESULT MaybeObject* ComputeStoreInterceptor( | 159 Handle<Code> ComputeStoreInterceptor(Handle<String> name, |
| 176 String* name, | 160 Handle<JSObject> receiver, |
| 177 JSObject* receiver, | 161 StrictModeFlag strict_mode); |
| 178 StrictModeFlag strict_mode); | |
| 179 | 162 |
| 180 // --- | 163 // --- |
| 181 | 164 |
| 182 MUST_USE_RESULT MaybeObject* ComputeKeyedStoreField( | 165 Handle<Code> ComputeKeyedStoreField(Handle<String> name, |
| 183 String* name, | 166 Handle<JSObject> receiver, |
| 184 JSObject* receiver, | 167 int field_index, |
| 185 int field_index, | 168 Handle<Map> transition, |
| 186 Map* transition, | 169 StrictModeFlag strict_mode); |
| 187 StrictModeFlag strict_mode); | |
| 188 | 170 |
| 189 MUST_USE_RESULT MaybeObject* ComputeKeyedLoadOrStoreElement( | 171 Handle<Code> ComputeKeyedLoadOrStoreElement(Handle<JSObject> receiver, |
| 190 JSObject* receiver, | 172 KeyedIC::StubKind stub_kind, |
| 191 KeyedIC::StubKind stub_kind, | 173 StrictModeFlag strict_mode); |
| 192 StrictModeFlag strict_mode); | |
| 193 | 174 |
| 194 // --- | 175 // --- |
| 195 | 176 |
| 196 MUST_USE_RESULT MaybeObject* ComputeCallField( | 177 Handle<Code> ComputeCallField(int argc, |
| 197 int argc, | 178 Code::Kind, |
| 198 Code::Kind, | 179 Code::ExtraICState extra_state, |
| 199 Code::ExtraICState extra_ic_state, | 180 Handle<String> name, |
| 200 String* name, | 181 Handle<Object> object, |
| 201 Object* object, | 182 Handle<JSObject> holder, |
| 202 JSObject* holder, | 183 int index); |
| 203 int index); | |
| 204 | 184 |
| 205 MUST_USE_RESULT MaybeObject* ComputeCallConstant( | 185 Handle<Code> ComputeCallConstant(int argc, |
| 206 int argc, | 186 Code::Kind, |
| 207 Code::Kind, | 187 Code::ExtraICState extra_state, |
| 208 Code::ExtraICState extra_ic_state, | 188 Handle<String> name, |
| 209 String* name, | 189 Handle<Object> object, |
| 210 Object* object, | 190 Handle<JSObject> holder, |
| 211 JSObject* holder, | 191 Handle<JSFunction> function); |
| 212 JSFunction* function); | |
| 213 | 192 |
| 214 MUST_USE_RESULT MaybeObject* ComputeCallNormal( | 193 Handle<Code> ComputeCallInterceptor(int argc, |
| 215 int argc, | 194 Code::Kind, |
| 216 Code::Kind, | 195 Code::ExtraICState extra_state, |
| 217 Code::ExtraICState extra_ic_state, | 196 Handle<String> name, |
| 218 String* name, | 197 Handle<Object> object, |
| 219 JSObject* receiver); | 198 Handle<JSObject> holder); |
| 220 | 199 |
| 221 MUST_USE_RESULT MaybeObject* ComputeCallInterceptor( | 200 Handle<Code> ComputeCallGlobal(int argc, |
| 222 int argc, | 201 Code::Kind, |
| 223 Code::Kind, | 202 Code::ExtraICState extra_state, |
| 224 Code::ExtraICState extra_ic_state, | 203 Handle<String> name, |
| 225 String* name, | 204 Handle<JSObject> receiver, |
| 226 Object* object, | 205 Handle<GlobalObject> holder, |
| 227 JSObject* holder); | 206 Handle<JSGlobalPropertyCell> cell, |
| 228 | 207 Handle<JSFunction> function); |
| 229 MUST_USE_RESULT MaybeObject* ComputeCallGlobal( | |
| 230 int argc, | |
| 231 Code::Kind, | |
| 232 Code::ExtraICState extra_ic_state, | |
| 233 String* name, | |
| 234 JSObject* receiver, | |
| 235 GlobalObject* holder, | |
| 236 JSGlobalPropertyCell* cell, | |
| 237 JSFunction* function); | |
| 238 | 208 |
| 239 // --- | 209 // --- |
| 240 | 210 |
| 241 MUST_USE_RESULT MaybeObject* ComputeCallInitialize(int argc, | 211 Handle<Code> ComputeCallInitialize(int argc, RelocInfo::Mode mode); |
| 242 RelocInfo::Mode mode, | |
| 243 Code::Kind kind); | |
| 244 | |
| 245 Handle<Code> ComputeCallInitialize(int argc, | |
| 246 RelocInfo::Mode mode); | |
| 247 | 212 |
| 248 Handle<Code> ComputeKeyedCallInitialize(int argc); | 213 Handle<Code> ComputeKeyedCallInitialize(int argc); |
| 249 | 214 |
| 250 MUST_USE_RESULT MaybeObject* ComputeCallPreMonomorphic( | 215 Handle<Code> ComputeCallPreMonomorphic(int argc, |
| 251 int argc, | 216 Code::Kind kind, |
| 252 Code::Kind kind, | 217 Code::ExtraICState extra_state); |
| 253 Code::ExtraICState extra_ic_state); | |
| 254 | 218 |
| 255 MUST_USE_RESULT MaybeObject* ComputeCallNormal(int argc, | 219 Handle<Code> ComputeCallNormal(int argc, |
| 256 Code::Kind kind, | 220 Code::Kind kind, |
| 257 Code::ExtraICState state); | 221 Code::ExtraICState state); |
| 258 | 222 |
| 259 MUST_USE_RESULT MaybeObject* ComputeCallArguments(int argc, | 223 Handle<Code> ComputeCallArguments(int argc, Code::Kind kind); |
| 260 Code::Kind kind); | |
| 261 | 224 |
| 262 MUST_USE_RESULT MaybeObject* ComputeCallMegamorphic(int argc, | 225 Handle<Code> ComputeCallMegamorphic(int argc, |
| 263 Code::Kind kind, | 226 Code::Kind kind, |
| 264 Code::ExtraICState state); | 227 Code::ExtraICState state); |
| 265 | 228 |
| 266 MUST_USE_RESULT MaybeObject* ComputeCallMiss(int argc, | 229 Handle<Code> ComputeCallMiss(int argc, |
| 267 Code::Kind kind, | 230 Code::Kind kind, |
| 268 Code::ExtraICState state); | 231 Code::ExtraICState state); |
| 232 |
| 233 MUST_USE_RESULT MaybeObject* TryComputeCallMiss(int argc, |
| 234 Code::Kind kind, |
| 235 Code::ExtraICState state); |
| 269 | 236 |
| 270 // Finds the Code object stored in the Heap::non_monomorphic_cache(). | 237 // Finds the Code object stored in the Heap::non_monomorphic_cache(). |
| 271 MUST_USE_RESULT Code* FindCallInitialize(int argc, | 238 Code* FindCallInitialize(int argc, RelocInfo::Mode mode, Code::Kind kind); |
| 272 RelocInfo::Mode mode, | |
| 273 Code::Kind kind); | |
| 274 | 239 |
| 275 #ifdef ENABLE_DEBUGGER_SUPPORT | 240 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 276 MUST_USE_RESULT MaybeObject* ComputeCallDebugBreak(int argc, Code::Kind kind); | 241 Handle<Code> ComputeCallDebugBreak(int argc, Code::Kind kind); |
| 277 | 242 |
| 278 MUST_USE_RESULT MaybeObject* ComputeCallDebugPrepareStepIn(int argc, | 243 Handle<Code> ComputeCallDebugPrepareStepIn(int argc, Code::Kind kind); |
| 279 Code::Kind kind); | |
| 280 #endif | 244 #endif |
| 281 | 245 |
| 282 // Update cache for entry hash(name, map). | 246 // Update cache for entry hash(name, map). |
| 283 Code* Set(String* name, Map* map, Code* code); | 247 Code* Set(String* name, Map* map, Code* code); |
| 284 | 248 |
| 285 // Clear the lookup table (@ mark compact collection). | 249 // Clear the lookup table (@ mark compact collection). |
| 286 void Clear(); | 250 void Clear(); |
| 287 | 251 |
| 288 // Collect all maps that match the name and flags. | 252 // Collect all maps that match the name and flags. |
| 289 void CollectMatchingMaps(SmallMapList* types, | 253 void CollectMatchingMaps(SmallMapList* types, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 switch (table) { | 287 switch (table) { |
| 324 case StubCache::kPrimary: return StubCache::primary_; | 288 case StubCache::kPrimary: return StubCache::primary_; |
| 325 case StubCache::kSecondary: return StubCache::secondary_; | 289 case StubCache::kSecondary: return StubCache::secondary_; |
| 326 } | 290 } |
| 327 UNREACHABLE(); | 291 UNREACHABLE(); |
| 328 return NULL; | 292 return NULL; |
| 329 } | 293 } |
| 330 | 294 |
| 331 Isolate* isolate() { return isolate_; } | 295 Isolate* isolate() { return isolate_; } |
| 332 Heap* heap() { return isolate()->heap(); } | 296 Heap* heap() { return isolate()->heap(); } |
| 297 Factory* factory() { return isolate()->factory(); } |
| 333 | 298 |
| 334 private: | 299 private: |
| 335 explicit StubCache(Isolate* isolate); | 300 explicit StubCache(Isolate* isolate); |
| 336 | 301 |
| 337 friend class Isolate; | 302 Handle<Code> ComputeCallInitialize(int argc, |
| 338 friend class SCTableReference; | 303 RelocInfo::Mode mode, |
| 339 static const int kPrimaryTableSize = 2048; | 304 Code::Kind kind); |
| 340 static const int kSecondaryTableSize = 512; | |
| 341 Entry primary_[kPrimaryTableSize]; | |
| 342 Entry secondary_[kSecondaryTableSize]; | |
| 343 | 305 |
| 344 // Computes the hashed offsets for primary and secondary caches. | 306 // Computes the hashed offsets for primary and secondary caches. |
| 345 static int PrimaryOffset(String* name, Code::Flags flags, Map* map) { | 307 static int PrimaryOffset(String* name, Code::Flags flags, Map* map) { |
| 346 // This works well because the heap object tag size and the hash | 308 // This works well because the heap object tag size and the hash |
| 347 // shift are equal. Shifting down the length field to get the | 309 // shift are equal. Shifting down the length field to get the |
| 348 // hash code would effectively throw away two bits of the hash | 310 // hash code would effectively throw away two bits of the hash |
| 349 // code. | 311 // code. |
| 350 STATIC_ASSERT(kHeapObjectTagSize == String::kHashShift); | 312 STATIC_ASSERT(kHeapObjectTagSize == String::kHashShift); |
| 351 // Compute the hash of the name (use entire hash field). | 313 // Compute the hash of the name (use entire hash field). |
| 352 ASSERT(name->HasHashCode()); | 314 ASSERT(name->HasHashCode()); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 377 // we do in generated code. We generate an hash code that already | 339 // we do in generated code. We generate an hash code that already |
| 378 // ends in String::kHashShift 0s. Then we shift it so it is a multiple | 340 // ends in String::kHashShift 0s. Then we shift it so it is a multiple |
| 379 // of sizeof(Entry). This makes it easier to avoid making mistakes | 341 // of sizeof(Entry). This makes it easier to avoid making mistakes |
| 380 // in the hashed offset computations. | 342 // in the hashed offset computations. |
| 381 static Entry* entry(Entry* table, int offset) { | 343 static Entry* entry(Entry* table, int offset) { |
| 382 const int shift_amount = kPointerSizeLog2 + 1 - String::kHashShift; | 344 const int shift_amount = kPointerSizeLog2 + 1 - String::kHashShift; |
| 383 return reinterpret_cast<Entry*>( | 345 return reinterpret_cast<Entry*>( |
| 384 reinterpret_cast<Address>(table) + (offset << shift_amount)); | 346 reinterpret_cast<Address>(table) + (offset << shift_amount)); |
| 385 } | 347 } |
| 386 | 348 |
| 349 static const int kPrimaryTableSize = 2048; |
| 350 static const int kSecondaryTableSize = 512; |
| 351 |
| 352 Entry primary_[kPrimaryTableSize]; |
| 353 Entry secondary_[kSecondaryTableSize]; |
| 387 Isolate* isolate_; | 354 Isolate* isolate_; |
| 388 | 355 |
| 356 friend class Isolate; |
| 357 friend class SCTableReference; |
| 358 |
| 389 DISALLOW_COPY_AND_ASSIGN(StubCache); | 359 DISALLOW_COPY_AND_ASSIGN(StubCache); |
| 390 }; | 360 }; |
| 391 | 361 |
| 392 | 362 |
| 393 // ------------------------------------------------------------------------ | 363 // ------------------------------------------------------------------------ |
| 394 | 364 |
| 395 | 365 |
| 396 // Support functions for IC stubs for callbacks. | 366 // Support functions for IC stubs for callbacks. |
| 397 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadCallbackProperty); | 367 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadCallbackProperty); |
| 398 DECLARE_RUNTIME_FUNCTION(MaybeObject*, StoreCallbackProperty); | 368 DECLARE_RUNTIME_FUNCTION(MaybeObject*, StoreCallbackProperty); |
| 399 | 369 |
| 400 | 370 |
| 401 // Support functions for IC stubs for interceptors. | 371 // Support functions for IC stubs for interceptors. |
| 402 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorOnly); | 372 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorOnly); |
| 403 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForLoad); | 373 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForLoad); |
| 404 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForCall); | 374 DECLARE_RUNTIME_FUNCTION(MaybeObject*, LoadPropertyWithInterceptorForCall); |
| 405 DECLARE_RUNTIME_FUNCTION(MaybeObject*, StoreInterceptorProperty); | 375 DECLARE_RUNTIME_FUNCTION(MaybeObject*, StoreInterceptorProperty); |
| 406 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CallInterceptorProperty); | 376 DECLARE_RUNTIME_FUNCTION(MaybeObject*, CallInterceptorProperty); |
| 407 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadPropertyWithInterceptor); | 377 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadPropertyWithInterceptor); |
| 408 | 378 |
| 409 | 379 |
| 410 // The stub compiler compiles stubs for the stub cache. | 380 // The stub compilers compile stubs for the stub cache. |
| 411 class StubCompiler BASE_EMBEDDED { | 381 class StubCompiler BASE_EMBEDDED { |
| 412 public: | 382 public: |
| 413 StubCompiler() | 383 explicit StubCompiler(Isolate* isolate) |
| 414 : scope_(), masm_(Isolate::Current(), NULL, 256), failure_(NULL) { } | 384 : isolate_(isolate), masm_(isolate, NULL, 256), failure_(NULL) { } |
| 415 | 385 |
| 416 MUST_USE_RESULT MaybeObject* CompileCallInitialize(Code::Flags flags); | 386 // Functions to compile either CallIC or KeyedCallIC. The specific kind |
| 417 MUST_USE_RESULT MaybeObject* CompileCallPreMonomorphic(Code::Flags flags); | 387 // is extracted from the code flags. |
| 418 MUST_USE_RESULT MaybeObject* CompileCallNormal(Code::Flags flags); | 388 Handle<Code> CompileCallInitialize(Code::Flags flags); |
| 419 MUST_USE_RESULT MaybeObject* CompileCallMegamorphic(Code::Flags flags); | 389 Handle<Code> CompileCallPreMonomorphic(Code::Flags flags); |
| 420 MUST_USE_RESULT MaybeObject* CompileCallArguments(Code::Flags flags); | 390 Handle<Code> CompileCallNormal(Code::Flags flags); |
| 421 MUST_USE_RESULT MaybeObject* CompileCallMiss(Code::Flags flags); | 391 Handle<Code> CompileCallMegamorphic(Code::Flags flags); |
| 392 Handle<Code> CompileCallArguments(Code::Flags flags); |
| 393 Handle<Code> CompileCallMiss(Code::Flags flags); |
| 394 |
| 395 MUST_USE_RESULT MaybeObject* TryCompileCallMiss(Code::Flags flags); |
| 396 |
| 422 #ifdef ENABLE_DEBUGGER_SUPPORT | 397 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 423 MUST_USE_RESULT MaybeObject* CompileCallDebugBreak(Code::Flags flags); | 398 Handle<Code> CompileCallDebugBreak(Code::Flags flags); |
| 424 MUST_USE_RESULT MaybeObject* CompileCallDebugPrepareStepIn(Code::Flags flags); | 399 Handle<Code> CompileCallDebugPrepareStepIn(Code::Flags flags); |
| 425 #endif | 400 #endif |
| 426 | 401 |
| 427 // Static functions for generating parts of stubs. | 402 // Static functions for generating parts of stubs. |
| 428 static void GenerateLoadGlobalFunctionPrototype(MacroAssembler* masm, | 403 static void GenerateLoadGlobalFunctionPrototype(MacroAssembler* masm, |
| 429 int index, | 404 int index, |
| 430 Register prototype); | 405 Register prototype); |
| 431 | 406 |
| 432 // Generates prototype loading code that uses the objects from the | 407 // Generates prototype loading code that uses the objects from the |
| 433 // context we were in when this function was called. If the context | 408 // context we were in when this function was called. If the context |
| 434 // has changed, a jump to miss is performed. This ties the generated | 409 // has changed, a jump to miss is performed. This ties the generated |
| 435 // code to a particular context and so must not be used in cases | 410 // code to a particular context and so must not be used in cases |
| 436 // where the generated code is not allowed to have references to | 411 // where the generated code is not allowed to have references to |
| 437 // objects from a context. | 412 // objects from a context. |
| 438 static void GenerateDirectLoadGlobalFunctionPrototype(MacroAssembler* masm, | 413 static void GenerateDirectLoadGlobalFunctionPrototype(MacroAssembler* masm, |
| 439 int index, | 414 int index, |
| 440 Register prototype, | 415 Register prototype, |
| 441 Label* miss); | 416 Label* miss); |
| 442 | 417 |
| 443 static void GenerateFastPropertyLoad(MacroAssembler* masm, | 418 static void GenerateFastPropertyLoad(MacroAssembler* masm, |
| 444 Register dst, Register src, | 419 Register dst, |
| 445 JSObject* holder, int index); | 420 Register src, |
| 421 Handle<JSObject> holder, |
| 422 int index); |
| 446 | 423 |
| 447 static void GenerateLoadArrayLength(MacroAssembler* masm, | 424 static void GenerateLoadArrayLength(MacroAssembler* masm, |
| 448 Register receiver, | 425 Register receiver, |
| 449 Register scratch, | 426 Register scratch, |
| 450 Label* miss_label); | 427 Label* miss_label); |
| 451 | 428 |
| 452 static void GenerateLoadStringLength(MacroAssembler* masm, | 429 static void GenerateLoadStringLength(MacroAssembler* masm, |
| 453 Register receiver, | 430 Register receiver, |
| 454 Register scratch1, | 431 Register scratch1, |
| 455 Register scratch2, | 432 Register scratch2, |
| 456 Label* miss_label, | 433 Label* miss_label, |
| 457 bool support_wrappers); | 434 bool support_wrappers); |
| 458 | 435 |
| 459 static void GenerateLoadFunctionPrototype(MacroAssembler* masm, | 436 static void GenerateLoadFunctionPrototype(MacroAssembler* masm, |
| 460 Register receiver, | 437 Register receiver, |
| 461 Register scratch1, | 438 Register scratch1, |
| 462 Register scratch2, | 439 Register scratch2, |
| 463 Label* miss_label); | 440 Label* miss_label); |
| 464 | 441 |
| 465 static void GenerateStoreField(MacroAssembler* masm, | 442 static void GenerateStoreField(MacroAssembler* masm, |
| 466 JSObject* object, | 443 Handle<JSObject> object, |
| 467 int index, | 444 int index, |
| 468 Map* transition, | 445 Handle<Map> transition, |
| 469 Register receiver_reg, | 446 Register receiver_reg, |
| 470 Register name_reg, | 447 Register name_reg, |
| 471 Register scratch, | 448 Register scratch, |
| 472 Label* miss_label); | 449 Label* miss_label); |
| 473 | 450 |
| 474 static void GenerateLoadMiss(MacroAssembler* masm, | 451 static void GenerateLoadMiss(MacroAssembler* masm, |
| 475 Code::Kind kind); | 452 Code::Kind kind); |
| 476 | 453 |
| 477 static void GenerateKeyedLoadMissForceGeneric(MacroAssembler* masm); | 454 static void GenerateKeyedLoadMissForceGeneric(MacroAssembler* masm); |
| 478 | 455 |
| 479 // Generates code that verifies that the property holder has not changed | 456 // Generates code that verifies that the property holder has not changed |
| 480 // (checking maps of objects in the prototype chain for fast and global | 457 // (checking maps of objects in the prototype chain for fast and global |
| 481 // objects or doing negative lookup for slow objects, ensures that the | 458 // objects or doing negative lookup for slow objects, ensures that the |
| 482 // property cells for global objects are still empty) and checks that the map | 459 // property cells for global objects are still empty) and checks that the map |
| 483 // of the holder has not changed. If necessary the function also generates | 460 // of the holder has not changed. If necessary the function also generates |
| 484 // code for security check in case of global object holders. Helps to make | 461 // code for security check in case of global object holders. Helps to make |
| 485 // sure that the current IC is still valid. | 462 // sure that the current IC is still valid. |
| 486 // | 463 // |
| 487 // The scratch and holder registers are always clobbered, but the object | 464 // The scratch and holder registers are always clobbered, but the object |
| 488 // register is only clobbered if it the same as the holder register. The | 465 // register is only clobbered if it the same as the holder register. The |
| 489 // function returns a register containing the holder - either object_reg or | 466 // function returns a register containing the holder - either object_reg or |
| 490 // holder_reg. | 467 // holder_reg. |
| 491 // The function can optionally (when save_at_depth != | 468 // The function can optionally (when save_at_depth != |
| 492 // kInvalidProtoDepth) save the object at the given depth by moving | 469 // kInvalidProtoDepth) save the object at the given depth by moving |
| 493 // it to [esp + kPointerSize]. | 470 // it to [esp + kPointerSize]. |
| 471 Register CheckPrototypes(Handle<JSObject> object, |
| 472 Register object_reg, |
| 473 Handle<JSObject> holder, |
| 474 Register holder_reg, |
| 475 Register scratch1, |
| 476 Register scratch2, |
| 477 Handle<String> name, |
| 478 Label* miss) { |
| 479 return CheckPrototypes(object, object_reg, holder, holder_reg, scratch1, |
| 480 scratch2, name, kInvalidProtoDepth, miss); |
| 481 } |
| 494 | 482 |
| 483 Register CheckPrototypes(Handle<JSObject> object, |
| 484 Register object_reg, |
| 485 Handle<JSObject> holder, |
| 486 Register holder_reg, |
| 487 Register scratch1, |
| 488 Register scratch2, |
| 489 Handle<String> name, |
| 490 int save_at_depth, |
| 491 Label* miss); |
| 492 |
| 493 // TODO(kmillikin): Eliminate this function when the stub cache is fully |
| 494 // handlified. |
| 495 Register CheckPrototypes(JSObject* object, | 495 Register CheckPrototypes(JSObject* object, |
| 496 Register object_reg, | 496 Register object_reg, |
| 497 JSObject* holder, | 497 JSObject* holder, |
| 498 Register holder_reg, | 498 Register holder_reg, |
| 499 Register scratch1, | 499 Register scratch1, |
| 500 Register scratch2, | 500 Register scratch2, |
| 501 String* name, | 501 String* name, |
| 502 Label* miss) { | 502 Label* miss) { |
| 503 return CheckPrototypes(object, object_reg, holder, holder_reg, scratch1, | 503 return CheckPrototypes(object, object_reg, holder, holder_reg, scratch1, |
| 504 scratch2, name, kInvalidProtoDepth, miss); | 504 scratch2, name, kInvalidProtoDepth, miss); |
| 505 } | 505 } |
| 506 | 506 |
| 507 // TODO(kmillikin): Eliminate this function when the stub cache is fully |
| 508 // handlified. |
| 507 Register CheckPrototypes(JSObject* object, | 509 Register CheckPrototypes(JSObject* object, |
| 508 Register object_reg, | 510 Register object_reg, |
| 509 JSObject* holder, | 511 JSObject* holder, |
| 510 Register holder_reg, | 512 Register holder_reg, |
| 511 Register scratch1, | 513 Register scratch1, |
| 512 Register scratch2, | 514 Register scratch2, |
| 513 String* name, | 515 String* name, |
| 514 int save_at_depth, | 516 int save_at_depth, |
| 515 Label* miss); | 517 Label* miss); |
| 516 | 518 |
| 517 protected: | 519 protected: |
| 518 MaybeObject* GetCodeWithFlags(Code::Flags flags, const char* name); | 520 Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name); |
| 519 MaybeObject* GetCodeWithFlags(Code::Flags flags, String* name); | 521 Handle<Code> GetCodeWithFlags(Code::Flags flags, Handle<String> name); |
| 522 |
| 523 MUST_USE_RESULT MaybeObject* TryGetCodeWithFlags(Code::Flags flags, |
| 524 const char* name); |
| 525 MUST_USE_RESULT MaybeObject* TryGetCodeWithFlags(Code::Flags flags, |
| 526 String* name); |
| 520 | 527 |
| 521 MacroAssembler* masm() { return &masm_; } | 528 MacroAssembler* masm() { return &masm_; } |
| 522 void set_failure(Failure* failure) { failure_ = failure; } | 529 void set_failure(Failure* failure) { failure_ = failure; } |
| 523 | 530 |
| 524 void GenerateLoadField(JSObject* object, | 531 void GenerateLoadField(Handle<JSObject> object, |
| 525 JSObject* holder, | 532 Handle<JSObject> holder, |
| 526 Register receiver, | 533 Register receiver, |
| 527 Register scratch1, | 534 Register scratch1, |
| 528 Register scratch2, | 535 Register scratch2, |
| 529 Register scratch3, | 536 Register scratch3, |
| 530 int index, | 537 int index, |
| 531 String* name, | 538 Handle<String> name, |
| 532 Label* miss); | 539 Label* miss); |
| 533 | 540 |
| 534 MaybeObject* GenerateLoadCallback(JSObject* object, | 541 MaybeObject* GenerateLoadCallback(JSObject* object, |
| 535 JSObject* holder, | 542 JSObject* holder, |
| 536 Register receiver, | 543 Register receiver, |
| 537 Register name_reg, | 544 Register name_reg, |
| 538 Register scratch1, | 545 Register scratch1, |
| 539 Register scratch2, | 546 Register scratch2, |
| 540 Register scratch3, | 547 Register scratch3, |
| 541 AccessorInfo* callback, | 548 AccessorInfo* callback, |
| 542 String* name, | 549 String* name, |
| 543 Label* miss); | 550 Label* miss); |
| 544 | 551 |
| 545 void GenerateLoadConstant(JSObject* object, | 552 void GenerateLoadConstant(Handle<JSObject> object, |
| 546 JSObject* holder, | 553 Handle<JSObject> holder, |
| 547 Register receiver, | 554 Register receiver, |
| 548 Register scratch1, | 555 Register scratch1, |
| 549 Register scratch2, | 556 Register scratch2, |
| 550 Register scratch3, | 557 Register scratch3, |
| 551 Object* value, | 558 Handle<Object> value, |
| 552 String* name, | 559 Handle<String> name, |
| 553 Label* miss); | 560 Label* miss); |
| 554 | 561 |
| 555 void GenerateLoadInterceptor(JSObject* object, | 562 void GenerateLoadInterceptor(JSObject* object, |
| 556 JSObject* holder, | 563 JSObject* holder, |
| 557 LookupResult* lookup, | 564 LookupResult* lookup, |
| 558 Register receiver, | 565 Register receiver, |
| 559 Register name_reg, | 566 Register name_reg, |
| 560 Register scratch1, | 567 Register scratch1, |
| 561 Register scratch2, | 568 Register scratch2, |
| 562 Register scratch3, | 569 Register scratch3, |
| 563 String* name, | 570 String* name, |
| 564 Label* miss); | 571 Label* miss); |
| 565 | 572 |
| 566 static void LookupPostInterceptor(JSObject* holder, | 573 static void LookupPostInterceptor(JSObject* holder, |
| 567 String* name, | 574 String* name, |
| 568 LookupResult* lookup); | 575 LookupResult* lookup); |
| 569 | 576 |
| 570 Isolate* isolate() { return scope_.isolate(); } | 577 Isolate* isolate() { return isolate_; } |
| 571 Heap* heap() { return isolate()->heap(); } | 578 Heap* heap() { return isolate()->heap(); } |
| 572 Factory* factory() { return isolate()->factory(); } | 579 Factory* factory() { return isolate()->factory(); } |
| 573 | 580 |
| 574 private: | 581 private: |
| 575 HandleScope scope_; | 582 Isolate* isolate_; |
| 576 MacroAssembler masm_; | 583 MacroAssembler masm_; |
| 577 Failure* failure_; | 584 Failure* failure_; |
| 578 }; | 585 }; |
| 579 | 586 |
| 580 | 587 |
| 581 class LoadStubCompiler: public StubCompiler { | 588 class LoadStubCompiler: public StubCompiler { |
| 582 public: | 589 public: |
| 583 MUST_USE_RESULT MaybeObject* CompileLoadNonexistent(String* name, | 590 explicit LoadStubCompiler(Isolate* isolate) : StubCompiler(isolate) { } |
| 584 JSObject* object, | |
| 585 JSObject* last); | |
| 586 | 591 |
| 587 MUST_USE_RESULT MaybeObject* CompileLoadField(JSObject* object, | 592 Handle<Code> CompileLoadNonexistent(Handle<String> name, |
| 588 JSObject* holder, | 593 Handle<JSObject> object, |
| 589 int index, | 594 Handle<JSObject> last); |
| 590 String* name); | 595 |
| 596 Handle<Code> CompileLoadField(Handle<JSObject> object, |
| 597 Handle<JSObject> holder, |
| 598 int index, |
| 599 Handle<String> name); |
| 600 |
| 601 Handle<Code> CompileLoadCallback(Handle<String> name, |
| 602 Handle<JSObject> object, |
| 603 Handle<JSObject> holder, |
| 604 Handle<AccessorInfo> callback); |
| 591 | 605 |
| 592 MUST_USE_RESULT MaybeObject* CompileLoadCallback(String* name, | 606 MUST_USE_RESULT MaybeObject* CompileLoadCallback(String* name, |
| 593 JSObject* object, | 607 JSObject* object, |
| 594 JSObject* holder, | 608 JSObject* holder, |
| 595 AccessorInfo* callback); | 609 AccessorInfo* callback); |
| 596 | 610 |
| 597 MUST_USE_RESULT MaybeObject* CompileLoadConstant(JSObject* object, | 611 Handle<Code> CompileLoadConstant(Handle<JSObject> object, |
| 598 JSObject* holder, | 612 Handle<JSObject> holder, |
| 599 Object* value, | 613 Handle<Object> value, |
| 600 String* name); | 614 Handle<String> name); |
| 615 |
| 616 Handle<Code> CompileLoadInterceptor(Handle<JSObject> object, |
| 617 Handle<JSObject> holder, |
| 618 Handle<String> name); |
| 601 | 619 |
| 602 MUST_USE_RESULT MaybeObject* CompileLoadInterceptor(JSObject* object, | 620 MUST_USE_RESULT MaybeObject* CompileLoadInterceptor(JSObject* object, |
| 603 JSObject* holder, | 621 JSObject* holder, |
| 604 String* name); | 622 String* name); |
| 605 | 623 |
| 606 MUST_USE_RESULT MaybeObject* CompileLoadGlobal(JSObject* object, | 624 Handle<Code> CompileLoadGlobal(Handle<JSObject> object, |
| 607 GlobalObject* holder, | 625 Handle<GlobalObject> holder, |
| 608 JSGlobalPropertyCell* cell, | 626 Handle<JSGlobalPropertyCell> cell, |
| 609 String* name, | 627 Handle<String> name, |
| 610 bool is_dont_delete); | 628 bool is_dont_delete); |
| 611 | 629 |
| 612 private: | 630 private: |
| 613 MUST_USE_RESULT MaybeObject* GetCode(PropertyType type, String* name); | 631 MUST_USE_RESULT MaybeObject* TryGetCode(PropertyType type, String* name); |
| 632 |
| 633 Handle<Code> GetCode(PropertyType type, Handle<String> name); |
| 614 }; | 634 }; |
| 615 | 635 |
| 616 | 636 |
| 617 class KeyedLoadStubCompiler: public StubCompiler { | 637 class KeyedLoadStubCompiler: public StubCompiler { |
| 618 public: | 638 public: |
| 619 MUST_USE_RESULT MaybeObject* CompileLoadField(String* name, | 639 explicit KeyedLoadStubCompiler(Isolate* isolate) : StubCompiler(isolate) { } |
| 620 JSObject* object, | 640 |
| 621 JSObject* holder, | 641 Handle<Code> CompileLoadField(Handle<String> name, |
| 622 int index); | 642 Handle<JSObject> object, |
| 643 Handle<JSObject> holder, |
| 644 int index); |
| 645 |
| 646 Handle<Code> CompileLoadCallback(Handle<String> name, |
| 647 Handle<JSObject> object, |
| 648 Handle<JSObject> holder, |
| 649 Handle<AccessorInfo> callback); |
| 623 | 650 |
| 624 MUST_USE_RESULT MaybeObject* CompileLoadCallback(String* name, | 651 MUST_USE_RESULT MaybeObject* CompileLoadCallback(String* name, |
| 625 JSObject* object, | 652 JSObject* object, |
| 626 JSObject* holder, | 653 JSObject* holder, |
| 627 AccessorInfo* callback); | 654 AccessorInfo* callback); |
| 628 | 655 |
| 629 MUST_USE_RESULT MaybeObject* CompileLoadConstant(String* name, | 656 Handle<Code> CompileLoadConstant(Handle<String> name, |
| 630 JSObject* object, | 657 Handle<JSObject> object, |
| 631 JSObject* holder, | 658 Handle<JSObject> holder, |
| 632 Object* value); | 659 Handle<Object> value); |
| 660 |
| 661 Handle<Code> CompileLoadInterceptor(Handle<JSObject> object, |
| 662 Handle<JSObject> holder, |
| 663 Handle<String> name); |
| 633 | 664 |
| 634 MUST_USE_RESULT MaybeObject* CompileLoadInterceptor(JSObject* object, | 665 MUST_USE_RESULT MaybeObject* CompileLoadInterceptor(JSObject* object, |
| 635 JSObject* holder, | 666 JSObject* holder, |
| 636 String* name); | 667 String* name); |
| 637 | 668 |
| 638 MUST_USE_RESULT MaybeObject* CompileLoadArrayLength(String* name); | 669 Handle<Code> CompileLoadArrayLength(Handle<String> name); |
| 639 MUST_USE_RESULT MaybeObject* CompileLoadStringLength(String* name); | |
| 640 MUST_USE_RESULT MaybeObject* CompileLoadFunctionPrototype(String* name); | |
| 641 | 670 |
| 642 MUST_USE_RESULT MaybeObject* CompileLoadElement(Map* receiver_map); | 671 Handle<Code> CompileLoadStringLength(Handle<String> name); |
| 643 | 672 |
| 644 MUST_USE_RESULT MaybeObject* CompileLoadPolymorphic( | 673 Handle<Code> CompileLoadFunctionPrototype(Handle<String> name); |
| 645 MapList* receiver_maps, | 674 |
| 646 CodeList* handler_ics); | 675 Handle<Code> CompileLoadElement(Handle<Map> receiver_map); |
| 676 |
| 677 Handle<Code> CompileLoadPolymorphic(MapHandleList* receiver_maps, |
| 678 CodeHandleList* handler_ics); |
| 647 | 679 |
| 648 static void GenerateLoadExternalArray(MacroAssembler* masm, | 680 static void GenerateLoadExternalArray(MacroAssembler* masm, |
| 649 ElementsKind elements_kind); | 681 ElementsKind elements_kind); |
| 650 | 682 |
| 651 static void GenerateLoadFastElement(MacroAssembler* masm); | 683 static void GenerateLoadFastElement(MacroAssembler* masm); |
| 652 | 684 |
| 653 static void GenerateLoadFastDoubleElement(MacroAssembler* masm); | 685 static void GenerateLoadFastDoubleElement(MacroAssembler* masm); |
| 654 | 686 |
| 655 static void GenerateLoadDictionaryElement(MacroAssembler* masm); | 687 static void GenerateLoadDictionaryElement(MacroAssembler* masm); |
| 656 | 688 |
| 657 private: | 689 private: |
| 658 MaybeObject* GetCode(PropertyType type, | 690 MaybeObject* TryGetCode(PropertyType type, |
| 659 String* name, | 691 String* name, |
| 692 InlineCacheState state = MONOMORPHIC); |
| 693 |
| 694 Handle<Code> GetCode(PropertyType type, |
| 695 Handle<String> name, |
| 660 InlineCacheState state = MONOMORPHIC); | 696 InlineCacheState state = MONOMORPHIC); |
| 661 }; | 697 }; |
| 662 | 698 |
| 663 | 699 |
| 664 class StoreStubCompiler: public StubCompiler { | 700 class StoreStubCompiler: public StubCompiler { |
| 665 public: | 701 public: |
| 666 explicit StoreStubCompiler(StrictModeFlag strict_mode) | 702 StoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode) |
| 667 : strict_mode_(strict_mode) { } | 703 : StubCompiler(isolate), strict_mode_(strict_mode) { } |
| 668 | |
| 669 MUST_USE_RESULT MaybeObject* CompileStoreField(JSObject* object, | |
| 670 int index, | |
| 671 Map* transition, | |
| 672 String* name); | |
| 673 | |
| 674 MUST_USE_RESULT MaybeObject* CompileStoreCallback(JSObject* object, | |
| 675 AccessorInfo* callbacks, | |
| 676 String* name); | |
| 677 MUST_USE_RESULT MaybeObject* CompileStoreInterceptor(JSObject* object, | |
| 678 String* name); | |
| 679 MUST_USE_RESULT MaybeObject* CompileStoreGlobal(GlobalObject* object, | |
| 680 JSGlobalPropertyCell* holder, | |
| 681 String* name); | |
| 682 | 704 |
| 683 | 705 |
| 706 Handle<Code> CompileStoreField(Handle<JSObject> object, |
| 707 int index, |
| 708 Handle<Map> transition, |
| 709 Handle<String> name); |
| 710 |
| 711 Handle<Code> CompileStoreCallback(Handle<JSObject> object, |
| 712 Handle<AccessorInfo> callback, |
| 713 Handle<String> name); |
| 714 |
| 715 Handle<Code> CompileStoreInterceptor(Handle<JSObject> object, |
| 716 Handle<String> name); |
| 717 |
| 718 Handle<Code> CompileStoreGlobal(Handle<GlobalObject> object, |
| 719 Handle<JSGlobalPropertyCell> holder, |
| 720 Handle<String> name); |
| 721 |
| 684 private: | 722 private: |
| 685 MaybeObject* GetCode(PropertyType type, String* name); | 723 Handle<Code> GetCode(PropertyType type, Handle<String> name); |
| 686 | 724 |
| 687 StrictModeFlag strict_mode_; | 725 StrictModeFlag strict_mode_; |
| 688 }; | 726 }; |
| 689 | 727 |
| 690 | 728 |
| 691 class KeyedStoreStubCompiler: public StubCompiler { | 729 class KeyedStoreStubCompiler: public StubCompiler { |
| 692 public: | 730 public: |
| 693 explicit KeyedStoreStubCompiler(StrictModeFlag strict_mode) | 731 KeyedStoreStubCompiler(Isolate* isolate, StrictModeFlag strict_mode) |
| 694 : strict_mode_(strict_mode) { } | 732 : StubCompiler(isolate), strict_mode_(strict_mode) { } |
| 695 | 733 |
| 696 MUST_USE_RESULT MaybeObject* CompileStoreField(JSObject* object, | 734 Handle<Code> CompileStoreField(Handle<JSObject> object, |
| 697 int index, | 735 int index, |
| 698 Map* transition, | 736 Handle<Map> transition, |
| 699 String* name); | 737 Handle<String> name); |
| 700 | 738 |
| 701 MUST_USE_RESULT MaybeObject* CompileStoreElement(Map* receiver_map); | 739 Handle<Code> CompileStoreElement(Handle<Map> receiver_map); |
| 702 | 740 |
| 703 MUST_USE_RESULT MaybeObject* CompileStorePolymorphic( | 741 Handle<Code> CompileStorePolymorphic(MapHandleList* receiver_maps, |
| 704 MapList* receiver_maps, | 742 CodeHandleList* handler_stubs, |
| 705 CodeList* handler_stubs, | 743 MapHandleList* transitioned_maps); |
| 706 MapList* transitioned_maps); | |
| 707 | 744 |
| 708 static void GenerateStoreFastElement(MacroAssembler* masm, | 745 static void GenerateStoreFastElement(MacroAssembler* masm, |
| 709 bool is_js_array, | 746 bool is_js_array, |
| 710 ElementsKind element_kind); | 747 ElementsKind element_kind); |
| 711 | 748 |
| 712 static void GenerateStoreFastDoubleElement(MacroAssembler* masm, | 749 static void GenerateStoreFastDoubleElement(MacroAssembler* masm, |
| 713 bool is_js_array); | 750 bool is_js_array); |
| 714 | 751 |
| 715 static void GenerateStoreExternalArray(MacroAssembler* masm, | 752 static void GenerateStoreExternalArray(MacroAssembler* masm, |
| 716 ElementsKind elements_kind); | 753 ElementsKind elements_kind); |
| 717 | 754 |
| 718 static void GenerateStoreDictionaryElement(MacroAssembler* masm); | 755 static void GenerateStoreDictionaryElement(MacroAssembler* masm); |
| 719 | 756 |
| 720 private: | 757 private: |
| 721 MaybeObject* GetCode(PropertyType type, | 758 Handle<Code> GetCode(PropertyType type, |
| 722 String* name, | 759 Handle<String> name, |
| 723 InlineCacheState state = MONOMORPHIC); | 760 InlineCacheState state = MONOMORPHIC); |
| 724 | 761 |
| 725 StrictModeFlag strict_mode_; | 762 StrictModeFlag strict_mode_; |
| 726 }; | 763 }; |
| 727 | 764 |
| 728 | 765 |
| 729 // Subset of FUNCTIONS_WITH_ID_LIST with custom constant/global call | 766 // Subset of FUNCTIONS_WITH_ID_LIST with custom constant/global call |
| 730 // IC stubs. | 767 // IC stubs. |
| 731 #define CUSTOM_CALL_IC_GENERATORS(V) \ | 768 #define CUSTOM_CALL_IC_GENERATORS(V) \ |
| 732 V(ArrayPush) \ | 769 V(ArrayPush) \ |
| 733 V(ArrayPop) \ | 770 V(ArrayPop) \ |
| 734 V(StringCharCodeAt) \ | 771 V(StringCharCodeAt) \ |
| 735 V(StringCharAt) \ | 772 V(StringCharAt) \ |
| 736 V(StringFromCharCode) \ | 773 V(StringFromCharCode) \ |
| 737 V(MathFloor) \ | 774 V(MathFloor) \ |
| 738 V(MathAbs) | 775 V(MathAbs) |
| 739 | 776 |
| 740 | 777 |
| 741 class CallOptimization; | 778 class CallOptimization; |
| 742 | 779 |
| 743 class CallStubCompiler: public StubCompiler { | 780 class CallStubCompiler: public StubCompiler { |
| 744 public: | 781 public: |
| 745 CallStubCompiler(int argc, | 782 CallStubCompiler(Isolate* isolate, |
| 783 int argc, |
| 746 Code::Kind kind, | 784 Code::Kind kind, |
| 747 Code::ExtraICState extra_ic_state, | 785 Code::ExtraICState extra_state, |
| 748 InlineCacheHolderFlag cache_holder); | 786 InlineCacheHolderFlag cache_holder); |
| 749 | 787 |
| 750 MUST_USE_RESULT MaybeObject* CompileCallField( | 788 Handle<Code> CompileCallField(Handle<JSObject> object, |
| 751 JSObject* object, | 789 Handle<JSObject> holder, |
| 752 JSObject* holder, | 790 int index, |
| 753 int index, | 791 Handle<String> name); |
| 754 String* name); | |
| 755 | 792 |
| 756 MUST_USE_RESULT MaybeObject* CompileCallConstant( | 793 Handle<Code> CompileCallConstant(Handle<Object> object, |
| 757 Object* object, | 794 Handle<JSObject> holder, |
| 758 JSObject* holder, | 795 Handle<JSFunction> function, |
| 759 JSFunction* function, | 796 Handle<String> name, |
| 760 String* name, | 797 CheckType check); |
| 761 CheckType check); | |
| 762 | 798 |
| 763 MUST_USE_RESULT MaybeObject* CompileCallInterceptor( | 799 MUST_USE_RESULT MaybeObject* CompileCallConstant(Object* object, |
| 764 JSObject* object, | 800 JSObject* holder, |
| 765 JSObject* holder, | 801 JSFunction* function, |
| 766 String* name); | 802 String* name, |
| 803 CheckType check); |
| 767 | 804 |
| 768 MUST_USE_RESULT MaybeObject* CompileCallGlobal( | 805 Handle<Code> CompileCallInterceptor(Handle<JSObject> object, |
| 769 JSObject* object, | 806 Handle<JSObject> holder, |
| 770 GlobalObject* holder, | 807 Handle<String> name); |
| 771 JSGlobalPropertyCell* cell, | 808 |
| 772 JSFunction* function, | 809 MUST_USE_RESULT MaybeObject* CompileCallInterceptor(JSObject* object, |
| 773 String* name); | 810 JSObject* holder, |
| 811 String* name); |
| 812 |
| 813 Handle<Code> CompileCallGlobal(Handle<JSObject> object, |
| 814 Handle<GlobalObject> holder, |
| 815 Handle<JSGlobalPropertyCell> cell, |
| 816 Handle<JSFunction> function, |
| 817 Handle<String> name); |
| 818 |
| 819 MUST_USE_RESULT MaybeObject* CompileCallGlobal(JSObject* object, |
| 820 GlobalObject* holder, |
| 821 JSGlobalPropertyCell* cell, |
| 822 JSFunction* function, |
| 823 String* name); |
| 774 | 824 |
| 775 static bool HasCustomCallGenerator(JSFunction* function); | 825 static bool HasCustomCallGenerator(JSFunction* function); |
| 776 | 826 |
| 777 private: | 827 private: |
| 778 // Compiles a custom call constant/global IC. For constant calls | 828 // Compiles a custom call constant/global IC. For constant calls |
| 779 // cell is NULL. Returns undefined if there is no custom call code | 829 // cell is NULL. Returns undefined if there is no custom call code |
| 780 // for the given function or it can't be generated. | 830 // for the given function or it can't be generated. |
| 781 MUST_USE_RESULT MaybeObject* CompileCustomCall(Object* object, | 831 MUST_USE_RESULT MaybeObject* CompileCustomCall(Object* object, |
| 782 JSObject* holder, | 832 JSObject* holder, |
| 783 JSGlobalPropertyCell* cell, | 833 JSGlobalPropertyCell* cell, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 796 MUST_USE_RESULT MaybeObject* CompileFastApiCall( | 846 MUST_USE_RESULT MaybeObject* CompileFastApiCall( |
| 797 const CallOptimization& optimization, | 847 const CallOptimization& optimization, |
| 798 Object* object, | 848 Object* object, |
| 799 JSObject* holder, | 849 JSObject* holder, |
| 800 JSGlobalPropertyCell* cell, | 850 JSGlobalPropertyCell* cell, |
| 801 JSFunction* function, | 851 JSFunction* function, |
| 802 String* name); | 852 String* name); |
| 803 | 853 |
| 804 const ParameterCount arguments_; | 854 const ParameterCount arguments_; |
| 805 const Code::Kind kind_; | 855 const Code::Kind kind_; |
| 806 const Code::ExtraICState extra_ic_state_; | 856 const Code::ExtraICState extra_state_; |
| 807 const InlineCacheHolderFlag cache_holder_; | 857 const InlineCacheHolderFlag cache_holder_; |
| 808 | 858 |
| 809 const ParameterCount& arguments() { return arguments_; } | 859 const ParameterCount& arguments() { return arguments_; } |
| 810 | 860 |
| 811 MUST_USE_RESULT MaybeObject* GetCode(PropertyType type, String* name); | 861 Handle<Code> GetCode(PropertyType type, Handle<String> name); |
| 862 Handle<Code> GetCode(Handle<JSFunction> function); |
| 812 | 863 |
| 813 // Convenience function. Calls GetCode above passing | 864 // TODO(kmillikin): Eliminate these functions when the stub cache is fully |
| 814 // CONSTANT_FUNCTION type and the name of the given function. | 865 // handlified. |
| 815 MUST_USE_RESULT MaybeObject* GetCode(JSFunction* function); | 866 MUST_USE_RESULT MaybeObject* TryGetCode(PropertyType type, String* name); |
| 867 MUST_USE_RESULT MaybeObject* TryGetCode(JSFunction* function); |
| 816 | 868 |
| 817 void GenerateNameCheck(String* name, Label* miss); | 869 void GenerateNameCheck(Handle<String> name, Label* miss); |
| 818 | 870 |
| 819 void GenerateGlobalReceiverCheck(JSObject* object, | 871 void GenerateGlobalReceiverCheck(JSObject* object, |
| 820 JSObject* holder, | 872 JSObject* holder, |
| 821 String* name, | 873 String* name, |
| 822 Label* miss); | 874 Label* miss); |
| 823 | 875 |
| 824 // Generates code to load the function from the cell checking that | 876 // Generates code to load the function from the cell checking that |
| 825 // it still contains the same function. | 877 // it still contains the same function. |
| 826 void GenerateLoadFunctionFromCell(JSGlobalPropertyCell* cell, | 878 void GenerateLoadFunctionFromCell(JSGlobalPropertyCell* cell, |
| 827 JSFunction* function, | 879 JSFunction* function, |
| 828 Label* miss); | 880 Label* miss); |
| 829 | 881 |
| 830 // Generates a jump to CallIC miss stub. Returns Failure if the jump cannot | 882 // Generates a jump to CallIC miss stub. |
| 831 // be generated. | 883 void GenerateMissBranch(); |
| 832 MUST_USE_RESULT MaybeObject* GenerateMissBranch(); | 884 |
| 885 // TODO(kmillikin): Eliminate this function when the stub cache is fully |
| 886 // handlified. |
| 887 MUST_USE_RESULT MaybeObject* TryGenerateMissBranch(); |
| 833 }; | 888 }; |
| 834 | 889 |
| 835 | 890 |
| 836 class ConstructStubCompiler: public StubCompiler { | 891 class ConstructStubCompiler: public StubCompiler { |
| 837 public: | 892 public: |
| 838 explicit ConstructStubCompiler() {} | 893 explicit ConstructStubCompiler(Isolate* isolate) : StubCompiler(isolate) { } |
| 839 | 894 |
| 840 MUST_USE_RESULT MaybeObject* CompileConstructStub(JSFunction* function); | 895 MUST_USE_RESULT MaybeObject* CompileConstructStub(JSFunction* function); |
| 841 | 896 |
| 842 private: | 897 private: |
| 843 MaybeObject* GetCode(); | 898 MaybeObject* GetCode(); |
| 844 }; | 899 }; |
| 845 | 900 |
| 846 | 901 |
| 847 // Holds information about possible function call optimizations. | 902 // Holds information about possible function call optimizations. |
| 848 class CallOptimization BASE_EMBEDDED { | 903 class CallOptimization BASE_EMBEDDED { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 889 JSFunction* constant_function_; | 944 JSFunction* constant_function_; |
| 890 bool is_simple_api_call_; | 945 bool is_simple_api_call_; |
| 891 FunctionTemplateInfo* expected_receiver_type_; | 946 FunctionTemplateInfo* expected_receiver_type_; |
| 892 CallHandlerInfo* api_call_info_; | 947 CallHandlerInfo* api_call_info_; |
| 893 }; | 948 }; |
| 894 | 949 |
| 895 | 950 |
| 896 } } // namespace v8::internal | 951 } } // namespace v8::internal |
| 897 | 952 |
| 898 #endif // V8_STUB_CACHE_H_ | 953 #endif // V8_STUB_CACHE_H_ |
| OLD | NEW |