| OLD | NEW |
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 // name specific if there are global objects involved. | 119 // name specific if there are global objects involved. |
| 120 Code::Flags flags = | 120 Code::Flags flags = |
| 121 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); | 121 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); |
| 122 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); | 122 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); |
| 123 if (code->IsUndefined()) { | 123 if (code->IsUndefined()) { |
| 124 LoadStubCompiler compiler; | 124 LoadStubCompiler compiler; |
| 125 { MaybeObject* maybe_code = | 125 { MaybeObject* maybe_code = |
| 126 compiler.CompileLoadNonexistent(cache_name, receiver, last); | 126 compiler.CompileLoadNonexistent(cache_name, receiver, last); |
| 127 if (!maybe_code->ToObject(&code)) return maybe_code; | 127 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 128 } | 128 } |
| 129 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cache_name)); | 129 PROFILE(isolate_,CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cach
e_name)); |
| 130 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, cache_name, Code::cast(code))); | 130 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, cache_name, Code::cast(code))); |
| 131 Object* result; | 131 Object* result; |
| 132 { MaybeObject* maybe_result = | 132 { MaybeObject* maybe_result = |
| 133 receiver->UpdateMapCodeCache(cache_name, Code::cast(code)); | 133 receiver->UpdateMapCodeCache(cache_name, Code::cast(code)); |
| 134 if (!maybe_result->ToObject(&result)) return maybe_result; | 134 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 135 } | 135 } |
| 136 } | 136 } |
| 137 return code; | 137 return code; |
| 138 } | 138 } |
| 139 | 139 |
| 140 | 140 |
| 141 MaybeObject* StubCache::ComputeLoadField(String* name, | 141 MaybeObject* StubCache::ComputeLoadField(String* name, |
| 142 JSObject* receiver, | 142 JSObject* receiver, |
| 143 JSObject* holder, | 143 JSObject* holder, |
| 144 int field_index) { | 144 int field_index) { |
| 145 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 145 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 146 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); | 146 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); |
| 147 Object* code = receiver->map()->FindInCodeCache(name, flags); | 147 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 148 if (code->IsUndefined()) { | 148 if (code->IsUndefined()) { |
| 149 LoadStubCompiler compiler; | 149 LoadStubCompiler compiler; |
| 150 { MaybeObject* maybe_code = | 150 { MaybeObject* maybe_code = |
| 151 compiler.CompileLoadField(receiver, holder, field_index, name); | 151 compiler.CompileLoadField(receiver, holder, field_index, name); |
| 152 if (!maybe_code->ToObject(&code)) return maybe_code; | 152 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 153 } | 153 } |
| 154 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 154 PROFILE(isolate_,CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name
)); |
| 155 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 155 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
| 156 Object* result; | 156 Object* result; |
| 157 { MaybeObject* maybe_result = | 157 { MaybeObject* maybe_result = |
| 158 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 158 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 159 if (!maybe_result->ToObject(&result)) return maybe_result; | 159 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 160 } | 160 } |
| 161 } | 161 } |
| 162 return code; | 162 return code; |
| 163 } | 163 } |
| 164 | 164 |
| 165 | 165 |
| 166 MaybeObject* StubCache::ComputeLoadCallback(String* name, | 166 MaybeObject* StubCache::ComputeLoadCallback(String* name, |
| 167 JSObject* receiver, | 167 JSObject* receiver, |
| 168 JSObject* holder, | 168 JSObject* holder, |
| 169 AccessorInfo* callback) { | 169 AccessorInfo* callback) { |
| 170 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 170 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
| 171 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 171 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 172 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); | 172 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); |
| 173 Object* code = receiver->map()->FindInCodeCache(name, flags); | 173 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 174 if (code->IsUndefined()) { | 174 if (code->IsUndefined()) { |
| 175 LoadStubCompiler compiler; | 175 LoadStubCompiler compiler; |
| 176 { MaybeObject* maybe_code = | 176 { MaybeObject* maybe_code = |
| 177 compiler.CompileLoadCallback(name, receiver, holder, callback); | 177 compiler.CompileLoadCallback(name, receiver, holder, callback); |
| 178 if (!maybe_code->ToObject(&code)) return maybe_code; | 178 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 179 } | 179 } |
| 180 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 180 PROFILE(isolate_,CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name
)); |
| 181 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 181 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
| 182 Object* result; | 182 Object* result; |
| 183 { MaybeObject* maybe_result = | 183 { MaybeObject* maybe_result = |
| 184 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 184 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 185 if (!maybe_result->ToObject(&result)) return maybe_result; | 185 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 186 } | 186 } |
| 187 } | 187 } |
| 188 return code; | 188 return code; |
| 189 } | 189 } |
| 190 | 190 |
| 191 | 191 |
| 192 MaybeObject* StubCache::ComputeLoadConstant(String* name, | 192 MaybeObject* StubCache::ComputeLoadConstant(String* name, |
| 193 JSObject* receiver, | 193 JSObject* receiver, |
| 194 JSObject* holder, | 194 JSObject* holder, |
| 195 Object* value) { | 195 Object* value) { |
| 196 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 196 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 197 Code::Flags flags = | 197 Code::Flags flags = |
| 198 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); | 198 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); |
| 199 Object* code = receiver->map()->FindInCodeCache(name, flags); | 199 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 200 if (code->IsUndefined()) { | 200 if (code->IsUndefined()) { |
| 201 LoadStubCompiler compiler; | 201 LoadStubCompiler compiler; |
| 202 { MaybeObject* maybe_code = | 202 { MaybeObject* maybe_code = |
| 203 compiler.CompileLoadConstant(receiver, holder, value, name); | 203 compiler.CompileLoadConstant(receiver, holder, value, name); |
| 204 if (!maybe_code->ToObject(&code)) return maybe_code; | 204 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 205 } | 205 } |
| 206 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 206 PROFILE(isolate_,CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name
)); |
| 207 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 207 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
| 208 Object* result; | 208 Object* result; |
| 209 { MaybeObject* maybe_result = | 209 { MaybeObject* maybe_result = |
| 210 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 210 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 211 if (!maybe_result->ToObject(&result)) return maybe_result; | 211 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 212 } | 212 } |
| 213 } | 213 } |
| 214 return code; | 214 return code; |
| 215 } | 215 } |
| 216 | 216 |
| 217 | 217 |
| 218 MaybeObject* StubCache::ComputeLoadInterceptor(String* name, | 218 MaybeObject* StubCache::ComputeLoadInterceptor(String* name, |
| 219 JSObject* receiver, | 219 JSObject* receiver, |
| 220 JSObject* holder) { | 220 JSObject* holder) { |
| 221 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 221 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 222 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); | 222 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); |
| 223 Object* code = receiver->map()->FindInCodeCache(name, flags); | 223 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 224 if (code->IsUndefined()) { | 224 if (code->IsUndefined()) { |
| 225 LoadStubCompiler compiler; | 225 LoadStubCompiler compiler; |
| 226 { MaybeObject* maybe_code = | 226 { MaybeObject* maybe_code = |
| 227 compiler.CompileLoadInterceptor(receiver, holder, name); | 227 compiler.CompileLoadInterceptor(receiver, holder, name); |
| 228 if (!maybe_code->ToObject(&code)) return maybe_code; | 228 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 229 } | 229 } |
| 230 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 230 PROFILE(isolate_,CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name
)); |
| 231 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 231 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
| 232 Object* result; | 232 Object* result; |
| 233 { MaybeObject* maybe_result = | 233 { MaybeObject* maybe_result = |
| 234 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 234 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 235 if (!maybe_result->ToObject(&result)) return maybe_result; | 235 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 236 } | 236 } |
| 237 } | 237 } |
| 238 return code; | 238 return code; |
| 239 } | 239 } |
| 240 | 240 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 254 Object* code = receiver->map()->FindInCodeCache(name, flags); | 254 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 255 if (code->IsUndefined()) { | 255 if (code->IsUndefined()) { |
| 256 LoadStubCompiler compiler; | 256 LoadStubCompiler compiler; |
| 257 { MaybeObject* maybe_code = compiler.CompileLoadGlobal(receiver, | 257 { MaybeObject* maybe_code = compiler.CompileLoadGlobal(receiver, |
| 258 holder, | 258 holder, |
| 259 cell, | 259 cell, |
| 260 name, | 260 name, |
| 261 is_dont_delete); | 261 is_dont_delete); |
| 262 if (!maybe_code->ToObject(&code)) return maybe_code; | 262 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 263 } | 263 } |
| 264 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 264 PROFILE(isolate_,CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name
)); |
| 265 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 265 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
| 266 Object* result; | 266 Object* result; |
| 267 { MaybeObject* maybe_result = | 267 { MaybeObject* maybe_result = |
| 268 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 268 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 269 if (!maybe_result->ToObject(&result)) return maybe_result; | 269 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 270 } | 270 } |
| 271 } | 271 } |
| 272 return code; | 272 return code; |
| 273 } | 273 } |
| 274 | 274 |
| 275 | 275 |
| 276 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, | 276 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, |
| 277 JSObject* receiver, | 277 JSObject* receiver, |
| 278 JSObject* holder, | 278 JSObject* holder, |
| 279 int field_index) { | 279 int field_index) { |
| 280 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 280 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 281 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); | 281 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); |
| 282 Object* code = receiver->map()->FindInCodeCache(name, flags); | 282 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 283 if (code->IsUndefined()) { | 283 if (code->IsUndefined()) { |
| 284 KeyedLoadStubCompiler compiler; | 284 KeyedLoadStubCompiler compiler; |
| 285 { MaybeObject* maybe_code = | 285 { MaybeObject* maybe_code = |
| 286 compiler.CompileLoadField(name, receiver, holder, field_index); | 286 compiler.CompileLoadField(name, receiver, holder, field_index); |
| 287 if (!maybe_code->ToObject(&code)) return maybe_code; | 287 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 288 } | 288 } |
| 289 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 289 PROFILE(isolate_,CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code)
, name)); |
| 290 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 290 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 291 Object* result; | 291 Object* result; |
| 292 { MaybeObject* maybe_result = | 292 { MaybeObject* maybe_result = |
| 293 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 293 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 294 if (!maybe_result->ToObject(&result)) return maybe_result; | 294 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 295 } | 295 } |
| 296 } | 296 } |
| 297 return code; | 297 return code; |
| 298 } | 298 } |
| 299 | 299 |
| 300 | 300 |
| 301 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, | 301 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, |
| 302 JSObject* receiver, | 302 JSObject* receiver, |
| 303 JSObject* holder, | 303 JSObject* holder, |
| 304 Object* value) { | 304 Object* value) { |
| 305 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 305 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 306 Code::Flags flags = | 306 Code::Flags flags = |
| 307 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); | 307 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); |
| 308 Object* code = receiver->map()->FindInCodeCache(name, flags); | 308 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 309 if (code->IsUndefined()) { | 309 if (code->IsUndefined()) { |
| 310 KeyedLoadStubCompiler compiler; | 310 KeyedLoadStubCompiler compiler; |
| 311 { MaybeObject* maybe_code = | 311 { MaybeObject* maybe_code = |
| 312 compiler.CompileLoadConstant(name, receiver, holder, value); | 312 compiler.CompileLoadConstant(name, receiver, holder, value); |
| 313 if (!maybe_code->ToObject(&code)) return maybe_code; | 313 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 314 } | 314 } |
| 315 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 315 PROFILE(isolate_,CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code)
, name)); |
| 316 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 316 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 317 Object* result; | 317 Object* result; |
| 318 { MaybeObject* maybe_result = | 318 { MaybeObject* maybe_result = |
| 319 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 319 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 320 if (!maybe_result->ToObject(&result)) return maybe_result; | 320 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 321 } | 321 } |
| 322 } | 322 } |
| 323 return code; | 323 return code; |
| 324 } | 324 } |
| 325 | 325 |
| 326 | 326 |
| 327 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, | 327 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, |
| 328 JSObject* receiver, | 328 JSObject* receiver, |
| 329 JSObject* holder) { | 329 JSObject* holder) { |
| 330 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 330 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 331 Code::Flags flags = | 331 Code::Flags flags = |
| 332 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); | 332 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); |
| 333 Object* code = receiver->map()->FindInCodeCache(name, flags); | 333 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 334 if (code->IsUndefined()) { | 334 if (code->IsUndefined()) { |
| 335 KeyedLoadStubCompiler compiler; | 335 KeyedLoadStubCompiler compiler; |
| 336 { MaybeObject* maybe_code = | 336 { MaybeObject* maybe_code = |
| 337 compiler.CompileLoadInterceptor(receiver, holder, name); | 337 compiler.CompileLoadInterceptor(receiver, holder, name); |
| 338 if (!maybe_code->ToObject(&code)) return maybe_code; | 338 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 339 } | 339 } |
| 340 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 340 PROFILE(isolate_,CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code)
, name)); |
| 341 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 341 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 342 Object* result; | 342 Object* result; |
| 343 { MaybeObject* maybe_result = | 343 { MaybeObject* maybe_result = |
| 344 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 344 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 345 if (!maybe_result->ToObject(&result)) return maybe_result; | 345 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 346 } | 346 } |
| 347 } | 347 } |
| 348 return code; | 348 return code; |
| 349 } | 349 } |
| 350 | 350 |
| 351 | 351 |
| 352 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, | 352 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, |
| 353 JSObject* receiver, | 353 JSObject* receiver, |
| 354 JSObject* holder, | 354 JSObject* holder, |
| 355 AccessorInfo* callback) { | 355 AccessorInfo* callback) { |
| 356 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 356 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
| 357 Code::Flags flags = | 357 Code::Flags flags = |
| 358 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 358 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 359 Object* code = receiver->map()->FindInCodeCache(name, flags); | 359 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 360 if (code->IsUndefined()) { | 360 if (code->IsUndefined()) { |
| 361 KeyedLoadStubCompiler compiler; | 361 KeyedLoadStubCompiler compiler; |
| 362 { MaybeObject* maybe_code = | 362 { MaybeObject* maybe_code = |
| 363 compiler.CompileLoadCallback(name, receiver, holder, callback); | 363 compiler.CompileLoadCallback(name, receiver, holder, callback); |
| 364 if (!maybe_code->ToObject(&code)) return maybe_code; | 364 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 365 } | 365 } |
| 366 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 366 PROFILE(isolate_,CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code)
, name)); |
| 367 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 367 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 368 Object* result; | 368 Object* result; |
| 369 { MaybeObject* maybe_result = | 369 { MaybeObject* maybe_result = |
| 370 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 370 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 371 if (!maybe_result->ToObject(&result)) return maybe_result; | 371 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 372 } | 372 } |
| 373 } | 373 } |
| 374 return code; | 374 return code; |
| 375 } | 375 } |
| 376 | 376 |
| 377 | 377 |
| 378 | 378 |
| 379 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, | 379 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, |
| 380 JSArray* receiver) { | 380 JSArray* receiver) { |
| 381 Code::Flags flags = | 381 Code::Flags flags = |
| 382 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 382 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 383 ASSERT(receiver->IsJSObject()); | 383 ASSERT(receiver->IsJSObject()); |
| 384 Object* code = receiver->map()->FindInCodeCache(name, flags); | 384 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 385 if (code->IsUndefined()) { | 385 if (code->IsUndefined()) { |
| 386 KeyedLoadStubCompiler compiler; | 386 KeyedLoadStubCompiler compiler; |
| 387 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); | 387 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); |
| 388 if (!maybe_code->ToObject(&code)) return maybe_code; | 388 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 389 } | 389 } |
| 390 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 390 PROFILE(isolate_,CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code)
, name)); |
| 391 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 391 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 392 Object* result; | 392 Object* result; |
| 393 { MaybeObject* maybe_result = | 393 { MaybeObject* maybe_result = |
| 394 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 394 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 395 if (!maybe_result->ToObject(&result)) return maybe_result; | 395 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 396 } | 396 } |
| 397 } | 397 } |
| 398 return code; | 398 return code; |
| 399 } | 399 } |
| 400 | 400 |
| 401 | 401 |
| 402 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, | 402 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, |
| 403 String* receiver) { | 403 String* receiver) { |
| 404 Code::Flags flags = | 404 Code::Flags flags = |
| 405 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 405 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 406 Map* map = receiver->map(); | 406 Map* map = receiver->map(); |
| 407 Object* code = map->FindInCodeCache(name, flags); | 407 Object* code = map->FindInCodeCache(name, flags); |
| 408 if (code->IsUndefined()) { | 408 if (code->IsUndefined()) { |
| 409 KeyedLoadStubCompiler compiler; | 409 KeyedLoadStubCompiler compiler; |
| 410 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); | 410 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); |
| 411 if (!maybe_code->ToObject(&code)) return maybe_code; | 411 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 412 } | 412 } |
| 413 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 413 PROFILE(isolate_,CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code)
, name)); |
| 414 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 414 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 415 Object* result; | 415 Object* result; |
| 416 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); | 416 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); |
| 417 if (!maybe_result->ToObject(&result)) return maybe_result; | 417 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 418 } | 418 } |
| 419 } | 419 } |
| 420 return code; | 420 return code; |
| 421 } | 421 } |
| 422 | 422 |
| 423 | 423 |
| 424 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( | 424 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( |
| 425 String* name, | 425 String* name, |
| 426 JSFunction* receiver) { | 426 JSFunction* receiver) { |
| 427 Code::Flags flags = | 427 Code::Flags flags = |
| 428 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 428 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
| 429 Object* code = receiver->map()->FindInCodeCache(name, flags); | 429 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 430 if (code->IsUndefined()) { | 430 if (code->IsUndefined()) { |
| 431 KeyedLoadStubCompiler compiler; | 431 KeyedLoadStubCompiler compiler; |
| 432 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); | 432 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); |
| 433 if (!maybe_code->ToObject(&code)) return maybe_code; | 433 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 434 } | 434 } |
| 435 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 435 PROFILE(isolate_,CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code)
, name)); |
| 436 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 436 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
| 437 Object* result; | 437 Object* result; |
| 438 { MaybeObject* maybe_result = | 438 { MaybeObject* maybe_result = |
| 439 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 439 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 440 if (!maybe_result->ToObject(&result)) return maybe_result; | 440 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 441 } | 441 } |
| 442 } | 442 } |
| 443 return code; | 443 return code; |
| 444 } | 444 } |
| 445 | 445 |
| 446 | 446 |
| 447 MaybeObject* StubCache::ComputeKeyedLoadSpecialized(JSObject* receiver) { | 447 MaybeObject* StubCache::ComputeKeyedLoadSpecialized(JSObject* receiver) { |
| 448 // Using NORMAL as the PropertyType for array element loads is a misuse. The | 448 // Using NORMAL as the PropertyType for array element loads is a misuse. The |
| 449 // generated stub always accesses fast elements, not slow-mode fields, but | 449 // generated stub always accesses fast elements, not slow-mode fields, but |
| 450 // some property type is required for the stub lookup. Note that overloading | 450 // some property type is required for the stub lookup. Note that overloading |
| 451 // the NORMAL PropertyType is only safe as long as no stubs are generated for | 451 // the NORMAL PropertyType is only safe as long as no stubs are generated for |
| 452 // other keyed field loads. This is guaranteed to be the case since all field | 452 // other keyed field loads. This is guaranteed to be the case since all field |
| 453 // keyed loads that are not array elements go through a generic builtin stub. | 453 // keyed loads that are not array elements go through a generic builtin stub. |
| 454 Code::Flags flags = | 454 Code::Flags flags = |
| 455 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, NORMAL); | 455 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, NORMAL); |
| 456 String* name = isolate_->heap()->KeyedLoadSpecialized_symbol(); | 456 String* name = isolate_->heap()->KeyedLoadSpecialized_symbol(); |
| 457 Object* code = receiver->map()->FindInCodeCache(name, flags); | 457 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 458 if (code->IsUndefined()) { | 458 if (code->IsUndefined()) { |
| 459 KeyedLoadStubCompiler compiler; | 459 KeyedLoadStubCompiler compiler; |
| 460 { MaybeObject* maybe_code = compiler.CompileLoadSpecialized(receiver); | 460 { MaybeObject* maybe_code = compiler.CompileLoadSpecialized(receiver); |
| 461 if (!maybe_code->ToObject(&code)) return maybe_code; | 461 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 462 } | 462 } |
| 463 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), 0)); | 463 PROFILE(isolate_,CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code)
, 0)); |
| 464 Object* result; | 464 Object* result; |
| 465 { MaybeObject* maybe_result = | 465 { MaybeObject* maybe_result = |
| 466 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 466 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 467 if (!maybe_result->ToObject(&result)) return maybe_result; | 467 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 468 } | 468 } |
| 469 } | 469 } |
| 470 return code; | 470 return code; |
| 471 } | 471 } |
| 472 | 472 |
| 473 | 473 |
| 474 MaybeObject* StubCache::ComputeStoreField(String* name, | 474 MaybeObject* StubCache::ComputeStoreField(String* name, |
| 475 JSObject* receiver, | 475 JSObject* receiver, |
| 476 int field_index, | 476 int field_index, |
| 477 Map* transition, | 477 Map* transition, |
| 478 StrictModeFlag strict_mode) { | 478 StrictModeFlag strict_mode) { |
| 479 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 479 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
| 480 Code::Flags flags = Code::ComputeMonomorphicFlags( | 480 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 481 Code::STORE_IC, type, strict_mode); | 481 Code::STORE_IC, type, strict_mode); |
| 482 Object* code = receiver->map()->FindInCodeCache(name, flags); | 482 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 483 if (code->IsUndefined()) { | 483 if (code->IsUndefined()) { |
| 484 StoreStubCompiler compiler(strict_mode); | 484 StoreStubCompiler compiler(strict_mode); |
| 485 { MaybeObject* maybe_code = | 485 { MaybeObject* maybe_code = |
| 486 compiler.CompileStoreField(receiver, field_index, transition, name); | 486 compiler.CompileStoreField(receiver, field_index, transition, name); |
| 487 if (!maybe_code->ToObject(&code)) return maybe_code; | 487 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 488 } | 488 } |
| 489 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 489 PROFILE(isolate_,CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), nam
e)); |
| 490 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 490 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 491 Object* result; | 491 Object* result; |
| 492 { MaybeObject* maybe_result = | 492 { MaybeObject* maybe_result = |
| 493 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 493 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 494 if (!maybe_result->ToObject(&result)) return maybe_result; | 494 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 495 } | 495 } |
| 496 } | 496 } |
| 497 return code; | 497 return code; |
| 498 } | 498 } |
| 499 | 499 |
| 500 | 500 |
| 501 MaybeObject* StubCache::ComputeKeyedStoreSpecialized( | 501 MaybeObject* StubCache::ComputeKeyedStoreSpecialized( |
| 502 JSObject* receiver, | 502 JSObject* receiver, |
| 503 StrictModeFlag strict_mode) { | 503 StrictModeFlag strict_mode) { |
| 504 Code::Flags flags = | 504 Code::Flags flags = |
| 505 Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode); | 505 Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode); |
| 506 String* name = isolate_->heap()->KeyedStoreSpecialized_symbol(); | 506 String* name = isolate_->heap()->KeyedStoreSpecialized_symbol(); |
| 507 Object* code = receiver->map()->FindInCodeCache(name, flags); | 507 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 508 if (code->IsUndefined()) { | 508 if (code->IsUndefined()) { |
| 509 KeyedStoreStubCompiler compiler(strict_mode); | 509 KeyedStoreStubCompiler compiler(strict_mode); |
| 510 { MaybeObject* maybe_code = compiler.CompileStoreSpecialized(receiver); | 510 { MaybeObject* maybe_code = compiler.CompileStoreSpecialized(receiver); |
| 511 if (!maybe_code->ToObject(&code)) return maybe_code; | 511 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 512 } | 512 } |
| 513 PROFILE(CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, Code::cast(code), 0)); | 513 PROFILE(isolate_,CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, Code::cast(code
), 0)); |
| 514 Object* result; | 514 Object* result; |
| 515 { MaybeObject* maybe_result = | 515 { MaybeObject* maybe_result = |
| 516 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 516 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 517 if (!maybe_result->ToObject(&result)) return maybe_result; | 517 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 518 } | 518 } |
| 519 } | 519 } |
| 520 return code; | 520 return code; |
| 521 } | 521 } |
| 522 | 522 |
| 523 | 523 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 if (code->IsUndefined()) { | 616 if (code->IsUndefined()) { |
| 617 ExternalArrayStubCompiler compiler; | 617 ExternalArrayStubCompiler compiler; |
| 618 { MaybeObject* maybe_code = | 618 { MaybeObject* maybe_code = |
| 619 is_store ? | 619 is_store ? |
| 620 compiler.CompileKeyedStoreStub(receiver, array_type, flags) : | 620 compiler.CompileKeyedStoreStub(receiver, array_type, flags) : |
| 621 compiler.CompileKeyedLoadStub(receiver, array_type, flags); | 621 compiler.CompileKeyedLoadStub(receiver, array_type, flags); |
| 622 if (!maybe_code->ToObject(&code)) return maybe_code; | 622 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 623 } | 623 } |
| 624 Code::cast(code)->set_external_array_type(array_type); | 624 Code::cast(code)->set_external_array_type(array_type); |
| 625 if (is_store) { | 625 if (is_store) { |
| 626 PROFILE( | 626 PROFILE(isolate_, |
| 627 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_STORE_IC_TAG, | 627 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_STORE_IC_TAG, |
| 628 Code::cast(code), 0)); | 628 Code::cast(code), 0)); |
| 629 } else { | 629 } else { |
| 630 PROFILE( | 630 PROFILE(isolate_, |
| 631 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_LOAD_IC_TAG, | 631 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_LOAD_IC_TAG, |
| 632 Code::cast(code), 0)); | 632 Code::cast(code), 0)); |
| 633 } | 633 } |
| 634 Object* result; | 634 Object* result; |
| 635 { MaybeObject* maybe_result = | 635 { MaybeObject* maybe_result = |
| 636 receiver->map()->UpdateCodeCache(name, Code::cast(code)); | 636 receiver->map()->UpdateCodeCache(name, Code::cast(code)); |
| 637 if (!maybe_result->ToObject(&result)) return maybe_result; | 637 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 638 } | 638 } |
| 639 } | 639 } |
| 640 return code; | 640 return code; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 654 StrictModeFlag strict_mode) { | 654 StrictModeFlag strict_mode) { |
| 655 Code::Flags flags = Code::ComputeMonomorphicFlags( | 655 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 656 Code::STORE_IC, NORMAL, strict_mode); | 656 Code::STORE_IC, NORMAL, strict_mode); |
| 657 Object* code = receiver->map()->FindInCodeCache(name, flags); | 657 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 658 if (code->IsUndefined()) { | 658 if (code->IsUndefined()) { |
| 659 StoreStubCompiler compiler(strict_mode); | 659 StoreStubCompiler compiler(strict_mode); |
| 660 { MaybeObject* maybe_code = | 660 { MaybeObject* maybe_code = |
| 661 compiler.CompileStoreGlobal(receiver, cell, name); | 661 compiler.CompileStoreGlobal(receiver, cell, name); |
| 662 if (!maybe_code->ToObject(&code)) return maybe_code; | 662 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 663 } | 663 } |
| 664 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 664 PROFILE(isolate_,CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), nam
e)); |
| 665 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 665 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 666 Object* result; | 666 Object* result; |
| 667 { MaybeObject* maybe_result = | 667 { MaybeObject* maybe_result = |
| 668 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 668 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 669 if (!maybe_result->ToObject(&result)) return maybe_result; | 669 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 670 } | 670 } |
| 671 } | 671 } |
| 672 return code; | 672 return code; |
| 673 } | 673 } |
| 674 | 674 |
| 675 | 675 |
| 676 MaybeObject* StubCache::ComputeStoreCallback( | 676 MaybeObject* StubCache::ComputeStoreCallback( |
| 677 String* name, | 677 String* name, |
| 678 JSObject* receiver, | 678 JSObject* receiver, |
| 679 AccessorInfo* callback, | 679 AccessorInfo* callback, |
| 680 StrictModeFlag strict_mode) { | 680 StrictModeFlag strict_mode) { |
| 681 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); | 681 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
| 682 Code::Flags flags = Code::ComputeMonomorphicFlags( | 682 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 683 Code::STORE_IC, CALLBACKS, strict_mode); | 683 Code::STORE_IC, CALLBACKS, strict_mode); |
| 684 Object* code = receiver->map()->FindInCodeCache(name, flags); | 684 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 685 if (code->IsUndefined()) { | 685 if (code->IsUndefined()) { |
| 686 StoreStubCompiler compiler(strict_mode); | 686 StoreStubCompiler compiler(strict_mode); |
| 687 { MaybeObject* maybe_code = | 687 { MaybeObject* maybe_code = |
| 688 compiler.CompileStoreCallback(receiver, callback, name); | 688 compiler.CompileStoreCallback(receiver, callback, name); |
| 689 if (!maybe_code->ToObject(&code)) return maybe_code; | 689 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 690 } | 690 } |
| 691 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 691 PROFILE(isolate_,CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), nam
e)); |
| 692 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 692 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 693 Object* result; | 693 Object* result; |
| 694 { MaybeObject* maybe_result = | 694 { MaybeObject* maybe_result = |
| 695 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 695 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 696 if (!maybe_result->ToObject(&result)) return maybe_result; | 696 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 697 } | 697 } |
| 698 } | 698 } |
| 699 return code; | 699 return code; |
| 700 } | 700 } |
| 701 | 701 |
| 702 | 702 |
| 703 MaybeObject* StubCache::ComputeStoreInterceptor( | 703 MaybeObject* StubCache::ComputeStoreInterceptor( |
| 704 String* name, | 704 String* name, |
| 705 JSObject* receiver, | 705 JSObject* receiver, |
| 706 StrictModeFlag strict_mode) { | 706 StrictModeFlag strict_mode) { |
| 707 Code::Flags flags = Code::ComputeMonomorphicFlags( | 707 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 708 Code::STORE_IC, INTERCEPTOR, strict_mode); | 708 Code::STORE_IC, INTERCEPTOR, strict_mode); |
| 709 Object* code = receiver->map()->FindInCodeCache(name, flags); | 709 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 710 if (code->IsUndefined()) { | 710 if (code->IsUndefined()) { |
| 711 StoreStubCompiler compiler(strict_mode); | 711 StoreStubCompiler compiler(strict_mode); |
| 712 { MaybeObject* maybe_code = | 712 { MaybeObject* maybe_code = |
| 713 compiler.CompileStoreInterceptor(receiver, name); | 713 compiler.CompileStoreInterceptor(receiver, name); |
| 714 if (!maybe_code->ToObject(&code)) return maybe_code; | 714 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 715 } | 715 } |
| 716 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 716 PROFILE(isolate_,CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), nam
e)); |
| 717 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 717 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
| 718 Object* result; | 718 Object* result; |
| 719 { MaybeObject* maybe_result = | 719 { MaybeObject* maybe_result = |
| 720 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 720 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 721 if (!maybe_result->ToObject(&result)) return maybe_result; | 721 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 722 } | 722 } |
| 723 } | 723 } |
| 724 return code; | 724 return code; |
| 725 } | 725 } |
| 726 | 726 |
| 727 | 727 |
| 728 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, | 728 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, |
| 729 JSObject* receiver, | 729 JSObject* receiver, |
| 730 int field_index, | 730 int field_index, |
| 731 Map* transition, | 731 Map* transition, |
| 732 StrictModeFlag strict_mode) { | 732 StrictModeFlag strict_mode) { |
| 733 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 733 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
| 734 Code::Flags flags = Code::ComputeMonomorphicFlags( | 734 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 735 Code::KEYED_STORE_IC, type, strict_mode); | 735 Code::KEYED_STORE_IC, type, strict_mode); |
| 736 Object* code = receiver->map()->FindInCodeCache(name, flags); | 736 Object* code = receiver->map()->FindInCodeCache(name, flags); |
| 737 if (code->IsUndefined()) { | 737 if (code->IsUndefined()) { |
| 738 KeyedStoreStubCompiler compiler(strict_mode); | 738 KeyedStoreStubCompiler compiler(strict_mode); |
| 739 { MaybeObject* maybe_code = | 739 { MaybeObject* maybe_code = |
| 740 compiler.CompileStoreField(receiver, field_index, transition, name); | 740 compiler.CompileStoreField(receiver, field_index, transition, name); |
| 741 if (!maybe_code->ToObject(&code)) return maybe_code; | 741 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 742 } | 742 } |
| 743 PROFILE(CodeCreateEvent( | 743 PROFILE(isolate_, |
| 744 Logger::KEYED_STORE_IC_TAG, Code::cast(code), name)); | 744 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
| 745 Code::cast(code), name)); |
| 745 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); | 746 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); |
| 746 Object* result; | 747 Object* result; |
| 747 { MaybeObject* maybe_result = | 748 { MaybeObject* maybe_result = |
| 748 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 749 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
| 749 if (!maybe_result->ToObject(&result)) return maybe_result; | 750 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 750 } | 751 } |
| 751 } | 752 } |
| 752 return code; | 753 return code; |
| 753 } | 754 } |
| 754 | 755 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 if (!function->is_compiled()) return Failure::InternalError(); | 794 if (!function->is_compiled()) return Failure::InternalError(); |
| 794 // Compile the stub - only create stubs for fully compiled functions. | 795 // Compile the stub - only create stubs for fully compiled functions. |
| 795 CallStubCompiler compiler( | 796 CallStubCompiler compiler( |
| 796 argc, in_loop, kind, extra_ic_state, cache_holder); | 797 argc, in_loop, kind, extra_ic_state, cache_holder); |
| 797 { MaybeObject* maybe_code = | 798 { MaybeObject* maybe_code = |
| 798 compiler.CompileCallConstant(object, holder, function, name, check); | 799 compiler.CompileCallConstant(object, holder, function, name, check); |
| 799 if (!maybe_code->ToObject(&code)) return maybe_code; | 800 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 800 } | 801 } |
| 801 Code::cast(code)->set_check_type(check); | 802 Code::cast(code)->set_check_type(check); |
| 802 ASSERT_EQ(flags, Code::cast(code)->flags()); | 803 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 803 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 804 PROFILE(isolate_, |
| 805 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| 804 Code::cast(code), name)); | 806 Code::cast(code), name)); |
| 805 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 807 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
| 806 Object* result; | 808 Object* result; |
| 807 { MaybeObject* maybe_result = | 809 { MaybeObject* maybe_result = |
| 808 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 810 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
| 809 if (!maybe_result->ToObject(&result)) return maybe_result; | 811 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 810 } | 812 } |
| 811 } | 813 } |
| 812 return code; | 814 return code; |
| 813 } | 815 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 843 CallStubCompiler compiler( | 845 CallStubCompiler compiler( |
| 844 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); | 846 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); |
| 845 { MaybeObject* maybe_code = | 847 { MaybeObject* maybe_code = |
| 846 compiler.CompileCallField(JSObject::cast(object), | 848 compiler.CompileCallField(JSObject::cast(object), |
| 847 holder, | 849 holder, |
| 848 index, | 850 index, |
| 849 name); | 851 name); |
| 850 if (!maybe_code->ToObject(&code)) return maybe_code; | 852 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 851 } | 853 } |
| 852 ASSERT_EQ(flags, Code::cast(code)->flags()); | 854 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 853 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 855 PROFILE(isolate_, |
| 856 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| 854 Code::cast(code), name)); | 857 Code::cast(code), name)); |
| 855 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 858 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
| 856 Object* result; | 859 Object* result; |
| 857 { MaybeObject* maybe_result = | 860 { MaybeObject* maybe_result = |
| 858 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 861 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
| 859 if (!maybe_result->ToObject(&result)) return maybe_result; | 862 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 860 } | 863 } |
| 861 } | 864 } |
| 862 return code; | 865 return code; |
| 863 } | 866 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 888 argc); | 891 argc); |
| 889 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 892 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
| 890 if (code->IsUndefined()) { | 893 if (code->IsUndefined()) { |
| 891 CallStubCompiler compiler( | 894 CallStubCompiler compiler( |
| 892 argc, NOT_IN_LOOP, kind, Code::kNoExtraICState, cache_holder); | 895 argc, NOT_IN_LOOP, kind, Code::kNoExtraICState, cache_holder); |
| 893 { MaybeObject* maybe_code = | 896 { MaybeObject* maybe_code = |
| 894 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); | 897 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); |
| 895 if (!maybe_code->ToObject(&code)) return maybe_code; | 898 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 896 } | 899 } |
| 897 ASSERT_EQ(flags, Code::cast(code)->flags()); | 900 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 898 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 901 PROFILE(isolate_, |
| 902 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| 899 Code::cast(code), name)); | 903 Code::cast(code), name)); |
| 900 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 904 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
| 901 Object* result; | 905 Object* result; |
| 902 { MaybeObject* maybe_result = | 906 { MaybeObject* maybe_result = |
| 903 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 907 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
| 904 if (!maybe_result->ToObject(&result)) return maybe_result; | 908 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 905 } | 909 } |
| 906 } | 910 } |
| 907 return code; | 911 return code; |
| 908 } | 912 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 // internal error which will make sure we do not update any | 949 // internal error which will make sure we do not update any |
| 946 // caches. | 950 // caches. |
| 947 if (!function->is_compiled()) return Failure::InternalError(); | 951 if (!function->is_compiled()) return Failure::InternalError(); |
| 948 CallStubCompiler compiler( | 952 CallStubCompiler compiler( |
| 949 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); | 953 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); |
| 950 { MaybeObject* maybe_code = | 954 { MaybeObject* maybe_code = |
| 951 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 955 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
| 952 if (!maybe_code->ToObject(&code)) return maybe_code; | 956 if (!maybe_code->ToObject(&code)) return maybe_code; |
| 953 } | 957 } |
| 954 ASSERT_EQ(flags, Code::cast(code)->flags()); | 958 ASSERT_EQ(flags, Code::cast(code)->flags()); |
| 955 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 959 PROFILE(isolate_, |
| 960 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
| 956 Code::cast(code), name)); | 961 Code::cast(code), name)); |
| 957 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 962 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
| 958 Object* result; | 963 Object* result; |
| 959 { MaybeObject* maybe_result = | 964 { MaybeObject* maybe_result = |
| 960 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 965 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
| 961 if (!maybe_result->ToObject(&result)) return maybe_result; | 966 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 962 } | 967 } |
| 963 } | 968 } |
| 964 return code; | 969 return code; |
| 965 } | 970 } |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1279 MaybeObject* StoreCallbackProperty(RUNTIME_CALLING_CONVENTION) { | 1284 MaybeObject* StoreCallbackProperty(RUNTIME_CALLING_CONVENTION) { |
| 1280 RUNTIME_GET_ISOLATE; | 1285 RUNTIME_GET_ISOLATE; |
| 1281 JSObject* recv = JSObject::cast(args[0]); | 1286 JSObject* recv = JSObject::cast(args[0]); |
| 1282 AccessorInfo* callback = AccessorInfo::cast(args[1]); | 1287 AccessorInfo* callback = AccessorInfo::cast(args[1]); |
| 1283 Address setter_address = v8::ToCData<Address>(callback->setter()); | 1288 Address setter_address = v8::ToCData<Address>(callback->setter()); |
| 1284 v8::AccessorSetter fun = FUNCTION_CAST<v8::AccessorSetter>(setter_address); | 1289 v8::AccessorSetter fun = FUNCTION_CAST<v8::AccessorSetter>(setter_address); |
| 1285 ASSERT(fun != NULL); | 1290 ASSERT(fun != NULL); |
| 1286 Handle<String> name = args.at<String>(2); | 1291 Handle<String> name = args.at<String>(2); |
| 1287 Handle<Object> value = args.at<Object>(3); | 1292 Handle<Object> value = args.at<Object>(3); |
| 1288 HandleScope scope(isolate); | 1293 HandleScope scope(isolate); |
| 1289 LOG(ApiNamedPropertyAccess("store", recv, *name)); | 1294 LOG(isolate,ApiNamedPropertyAccess("store", recv, *name)); |
| 1290 CustomArguments custom_args(isolate, callback->data(), recv, recv); | 1295 CustomArguments custom_args(isolate, callback->data(), recv, recv); |
| 1291 v8::AccessorInfo info(custom_args.end()); | 1296 v8::AccessorInfo info(custom_args.end()); |
| 1292 { | 1297 { |
| 1293 // Leaving JavaScript. | 1298 // Leaving JavaScript. |
| 1294 VMState state(isolate, EXTERNAL); | 1299 VMState state(isolate, EXTERNAL); |
| 1295 ExternalCallbackScope call_scope(isolate, setter_address); | 1300 ExternalCallbackScope call_scope(isolate, setter_address); |
| 1296 fun(v8::Utils::ToLocal(name), v8::Utils::ToLocal(value), info); | 1301 fun(v8::Utils::ToLocal(name), v8::Utils::ToLocal(value), info); |
| 1297 } | 1302 } |
| 1298 RETURN_IF_SCHEDULED_EXCEPTION(isolate); | 1303 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
| 1299 return *value; | 1304 return *value; |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1456 MaybeObject* KeyedLoadPropertyWithInterceptor(RUNTIME_CALLING_CONVENTION) { | 1461 MaybeObject* KeyedLoadPropertyWithInterceptor(RUNTIME_CALLING_CONVENTION) { |
| 1457 RUNTIME_GET_ISOLATE; | 1462 RUNTIME_GET_ISOLATE; |
| 1458 JSObject* receiver = JSObject::cast(args[0]); | 1463 JSObject* receiver = JSObject::cast(args[0]); |
| 1459 ASSERT(Smi::cast(args[1])->value() >= 0); | 1464 ASSERT(Smi::cast(args[1])->value() >= 0); |
| 1460 uint32_t index = Smi::cast(args[1])->value(); | 1465 uint32_t index = Smi::cast(args[1])->value(); |
| 1461 return receiver->GetElementWithInterceptor(receiver, index); | 1466 return receiver->GetElementWithInterceptor(receiver, index); |
| 1462 } | 1467 } |
| 1463 | 1468 |
| 1464 | 1469 |
| 1465 MaybeObject* StubCompiler::CompileCallInitialize(Code::Flags flags) { | 1470 MaybeObject* StubCompiler::CompileCallInitialize(Code::Flags flags) { |
| 1466 HandleScope scope; | 1471 HandleScope scope(isolate()); |
| 1467 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1472 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1468 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1473 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1469 if (kind == Code::CALL_IC) { | 1474 if (kind == Code::CALL_IC) { |
| 1470 CallIC::GenerateInitialize(masm(), argc); | 1475 CallIC::GenerateInitialize(masm(), argc); |
| 1471 } else { | 1476 } else { |
| 1472 KeyedCallIC::GenerateInitialize(masm(), argc); | 1477 KeyedCallIC::GenerateInitialize(masm(), argc); |
| 1473 } | 1478 } |
| 1474 Object* result; | 1479 Object* result; |
| 1475 { MaybeObject* maybe_result = | 1480 { MaybeObject* maybe_result = |
| 1476 GetCodeWithFlags(flags, "CompileCallInitialize"); | 1481 GetCodeWithFlags(flags, "CompileCallInitialize"); |
| 1477 if (!maybe_result->ToObject(&result)) return maybe_result; | 1482 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 1478 } | 1483 } |
| 1479 COUNTERS->call_initialize_stubs()->Increment(); | 1484 COUNTERS->call_initialize_stubs()->Increment(); |
| 1480 Code* code = Code::cast(result); | 1485 Code* code = Code::cast(result); |
| 1481 USE(code); | 1486 USE(code); |
| 1482 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_INITIALIZE_TAG), | 1487 PROFILE(isolate(), |
| 1488 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_INITIALIZE_TAG), |
| 1483 code, code->arguments_count())); | 1489 code, code->arguments_count())); |
| 1484 GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, Code::cast(code))); | 1490 GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, Code::cast(code))); |
| 1485 return result; | 1491 return result; |
| 1486 } | 1492 } |
| 1487 | 1493 |
| 1488 | 1494 |
| 1489 MaybeObject* StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { | 1495 MaybeObject* StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { |
| 1490 HandleScope scope; | 1496 HandleScope scope(isolate()); |
| 1491 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1497 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1492 // The code of the PreMonomorphic stub is the same as the code | 1498 // The code of the PreMonomorphic stub is the same as the code |
| 1493 // of the Initialized stub. They just differ on the code object flags. | 1499 // of the Initialized stub. They just differ on the code object flags. |
| 1494 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1500 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1495 if (kind == Code::CALL_IC) { | 1501 if (kind == Code::CALL_IC) { |
| 1496 CallIC::GenerateInitialize(masm(), argc); | 1502 CallIC::GenerateInitialize(masm(), argc); |
| 1497 } else { | 1503 } else { |
| 1498 KeyedCallIC::GenerateInitialize(masm(), argc); | 1504 KeyedCallIC::GenerateInitialize(masm(), argc); |
| 1499 } | 1505 } |
| 1500 Object* result; | 1506 Object* result; |
| 1501 { MaybeObject* maybe_result = | 1507 { MaybeObject* maybe_result = |
| 1502 GetCodeWithFlags(flags, "CompileCallPreMonomorphic"); | 1508 GetCodeWithFlags(flags, "CompileCallPreMonomorphic"); |
| 1503 if (!maybe_result->ToObject(&result)) return maybe_result; | 1509 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 1504 } | 1510 } |
| 1505 COUNTERS->call_premonomorphic_stubs()->Increment(); | 1511 COUNTERS->call_premonomorphic_stubs()->Increment(); |
| 1506 Code* code = Code::cast(result); | 1512 Code* code = Code::cast(result); |
| 1507 USE(code); | 1513 USE(code); |
| 1508 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_PRE_MONOMORPHIC_TAG), | 1514 PROFILE(isolate(), |
| 1515 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_PRE_MONOMORPHIC_TAG), |
| 1509 code, code->arguments_count())); | 1516 code, code->arguments_count())); |
| 1510 GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, Code::cast(code))); | 1517 GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, Code::cast(code))); |
| 1511 return result; | 1518 return result; |
| 1512 } | 1519 } |
| 1513 | 1520 |
| 1514 | 1521 |
| 1515 MaybeObject* StubCompiler::CompileCallNormal(Code::Flags flags) { | 1522 MaybeObject* StubCompiler::CompileCallNormal(Code::Flags flags) { |
| 1516 HandleScope scope; | 1523 HandleScope scope(isolate()); |
| 1517 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1524 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1518 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1525 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1519 if (kind == Code::CALL_IC) { | 1526 if (kind == Code::CALL_IC) { |
| 1520 CallIC::GenerateNormal(masm(), argc); | 1527 CallIC::GenerateNormal(masm(), argc); |
| 1521 } else { | 1528 } else { |
| 1522 KeyedCallIC::GenerateNormal(masm(), argc); | 1529 KeyedCallIC::GenerateNormal(masm(), argc); |
| 1523 } | 1530 } |
| 1524 Object* result; | 1531 Object* result; |
| 1525 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallNormal"); | 1532 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallNormal"); |
| 1526 if (!maybe_result->ToObject(&result)) return maybe_result; | 1533 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 1527 } | 1534 } |
| 1528 COUNTERS->call_normal_stubs()->Increment(); | 1535 COUNTERS->call_normal_stubs()->Increment(); |
| 1529 Code* code = Code::cast(result); | 1536 Code* code = Code::cast(result); |
| 1530 USE(code); | 1537 USE(code); |
| 1531 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_NORMAL_TAG), | 1538 PROFILE(isolate(), |
| 1539 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_NORMAL_TAG), |
| 1532 code, code->arguments_count())); | 1540 code, code->arguments_count())); |
| 1533 GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, Code::cast(code))); | 1541 GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, Code::cast(code))); |
| 1534 return result; | 1542 return result; |
| 1535 } | 1543 } |
| 1536 | 1544 |
| 1537 | 1545 |
| 1538 MaybeObject* StubCompiler::CompileCallMegamorphic(Code::Flags flags) { | 1546 MaybeObject* StubCompiler::CompileCallMegamorphic(Code::Flags flags) { |
| 1539 HandleScope scope; | 1547 HandleScope scope(isolate()); |
| 1540 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1548 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1541 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1549 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1542 if (kind == Code::CALL_IC) { | 1550 if (kind == Code::CALL_IC) { |
| 1543 CallIC::GenerateMegamorphic(masm(), argc); | 1551 CallIC::GenerateMegamorphic(masm(), argc); |
| 1544 } else { | 1552 } else { |
| 1545 KeyedCallIC::GenerateMegamorphic(masm(), argc); | 1553 KeyedCallIC::GenerateMegamorphic(masm(), argc); |
| 1546 } | 1554 } |
| 1547 Object* result; | 1555 Object* result; |
| 1548 { MaybeObject* maybe_result = | 1556 { MaybeObject* maybe_result = |
| 1549 GetCodeWithFlags(flags, "CompileCallMegamorphic"); | 1557 GetCodeWithFlags(flags, "CompileCallMegamorphic"); |
| 1550 if (!maybe_result->ToObject(&result)) return maybe_result; | 1558 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 1551 } | 1559 } |
| 1552 COUNTERS->call_megamorphic_stubs()->Increment(); | 1560 COUNTERS->call_megamorphic_stubs()->Increment(); |
| 1553 Code* code = Code::cast(result); | 1561 Code* code = Code::cast(result); |
| 1554 USE(code); | 1562 USE(code); |
| 1555 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MEGAMORPHIC_TAG), | 1563 PROFILE(isolate(), |
| 1564 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MEGAMORPHIC_TAG), |
| 1556 code, code->arguments_count())); | 1565 code, code->arguments_count())); |
| 1557 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, Code::cast(code))); | 1566 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, Code::cast(code))); |
| 1558 return result; | 1567 return result; |
| 1559 } | 1568 } |
| 1560 | 1569 |
| 1561 | 1570 |
| 1562 MaybeObject* StubCompiler::CompileCallMiss(Code::Flags flags) { | 1571 MaybeObject* StubCompiler::CompileCallMiss(Code::Flags flags) { |
| 1563 HandleScope scope; | 1572 HandleScope scope(isolate()); |
| 1564 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1573 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1565 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1574 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1566 if (kind == Code::CALL_IC) { | 1575 if (kind == Code::CALL_IC) { |
| 1567 CallIC::GenerateMiss(masm(), argc); | 1576 CallIC::GenerateMiss(masm(), argc); |
| 1568 } else { | 1577 } else { |
| 1569 KeyedCallIC::GenerateMiss(masm(), argc); | 1578 KeyedCallIC::GenerateMiss(masm(), argc); |
| 1570 } | 1579 } |
| 1571 Object* result; | 1580 Object* result; |
| 1572 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallMiss"); | 1581 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallMiss"); |
| 1573 if (!maybe_result->ToObject(&result)) return maybe_result; | 1582 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 1574 } | 1583 } |
| 1575 COUNTERS->call_megamorphic_stubs()->Increment(); | 1584 COUNTERS->call_megamorphic_stubs()->Increment(); |
| 1576 Code* code = Code::cast(result); | 1585 Code* code = Code::cast(result); |
| 1577 USE(code); | 1586 USE(code); |
| 1578 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MISS_TAG), | 1587 PROFILE(isolate(), |
| 1588 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MISS_TAG), |
| 1579 code, code->arguments_count())); | 1589 code, code->arguments_count())); |
| 1580 GDBJIT(AddCode(GDBJITInterface::CALL_MISS, Code::cast(code))); | 1590 GDBJIT(AddCode(GDBJITInterface::CALL_MISS, Code::cast(code))); |
| 1581 return result; | 1591 return result; |
| 1582 } | 1592 } |
| 1583 | 1593 |
| 1584 | 1594 |
| 1585 #ifdef ENABLE_DEBUGGER_SUPPORT | 1595 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 1586 MaybeObject* StubCompiler::CompileCallDebugBreak(Code::Flags flags) { | 1596 MaybeObject* StubCompiler::CompileCallDebugBreak(Code::Flags flags) { |
| 1587 HandleScope scope; | 1597 HandleScope scope(isolate()); |
| 1588 Debug::GenerateCallICDebugBreak(masm()); | 1598 Debug::GenerateCallICDebugBreak(masm()); |
| 1589 Object* result; | 1599 Object* result; |
| 1590 { MaybeObject* maybe_result = | 1600 { MaybeObject* maybe_result = |
| 1591 GetCodeWithFlags(flags, "CompileCallDebugBreak"); | 1601 GetCodeWithFlags(flags, "CompileCallDebugBreak"); |
| 1592 if (!maybe_result->ToObject(&result)) return maybe_result; | 1602 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 1593 } | 1603 } |
| 1594 Code* code = Code::cast(result); | 1604 Code* code = Code::cast(result); |
| 1595 USE(code); | 1605 USE(code); |
| 1596 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1606 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1597 USE(kind); | 1607 USE(kind); |
| 1598 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_DEBUG_BREAK_TAG), | 1608 PROFILE(isolate(), |
| 1609 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_DEBUG_BREAK_TAG), |
| 1599 code, code->arguments_count())); | 1610 code, code->arguments_count())); |
| 1600 return result; | 1611 return result; |
| 1601 } | 1612 } |
| 1602 | 1613 |
| 1603 | 1614 |
| 1604 MaybeObject* StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { | 1615 MaybeObject* StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { |
| 1605 HandleScope scope; | 1616 HandleScope scope(isolate()); |
| 1606 // Use the same code for the the step in preparations as we do for | 1617 // Use the same code for the the step in preparations as we do for |
| 1607 // the miss case. | 1618 // the miss case. |
| 1608 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1619 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
| 1609 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1620 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
| 1610 if (kind == Code::CALL_IC) { | 1621 if (kind == Code::CALL_IC) { |
| 1611 CallIC::GenerateMiss(masm(), argc); | 1622 CallIC::GenerateMiss(masm(), argc); |
| 1612 } else { | 1623 } else { |
| 1613 KeyedCallIC::GenerateMiss(masm(), argc); | 1624 KeyedCallIC::GenerateMiss(masm(), argc); |
| 1614 } | 1625 } |
| 1615 Object* result; | 1626 Object* result; |
| 1616 { MaybeObject* maybe_result = | 1627 { MaybeObject* maybe_result = |
| 1617 GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn"); | 1628 GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn"); |
| 1618 if (!maybe_result->ToObject(&result)) return maybe_result; | 1629 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 1619 } | 1630 } |
| 1620 Code* code = Code::cast(result); | 1631 Code* code = Code::cast(result); |
| 1621 USE(code); | 1632 USE(code); |
| 1622 PROFILE(CodeCreateEvent( | 1633 PROFILE(isolate(), |
| 1634 CodeCreateEvent( |
| 1623 CALL_LOGGER_TAG(kind, CALL_DEBUG_PREPARE_STEP_IN_TAG), | 1635 CALL_LOGGER_TAG(kind, CALL_DEBUG_PREPARE_STEP_IN_TAG), |
| 1624 code, | 1636 code, |
| 1625 code->arguments_count())); | 1637 code->arguments_count())); |
| 1626 return result; | 1638 return result; |
| 1627 } | 1639 } |
| 1628 #endif | 1640 #endif |
| 1629 | 1641 |
| 1630 #undef CALL_LOGGER_TAG | 1642 #undef CALL_LOGGER_TAG |
| 1631 | 1643 |
| 1632 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, | 1644 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1667 } | 1679 } |
| 1668 } | 1680 } |
| 1669 } | 1681 } |
| 1670 | 1682 |
| 1671 | 1683 |
| 1672 | 1684 |
| 1673 MaybeObject* LoadStubCompiler::GetCode(PropertyType type, String* name) { | 1685 MaybeObject* LoadStubCompiler::GetCode(PropertyType type, String* name) { |
| 1674 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); | 1686 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); |
| 1675 MaybeObject* result = GetCodeWithFlags(flags, name); | 1687 MaybeObject* result = GetCodeWithFlags(flags, name); |
| 1676 if (!result->IsFailure()) { | 1688 if (!result->IsFailure()) { |
| 1677 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, | 1689 PROFILE(isolate(), |
| 1690 CodeCreateEvent(Logger::LOAD_IC_TAG, |
| 1678 Code::cast(result->ToObjectUnchecked()), | 1691 Code::cast(result->ToObjectUnchecked()), |
| 1679 name)); | 1692 name)); |
| 1680 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, | 1693 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, |
| 1681 name, | 1694 name, |
| 1682 Code::cast(result->ToObjectUnchecked()))); | 1695 Code::cast(result->ToObjectUnchecked()))); |
| 1683 } | 1696 } |
| 1684 return result; | 1697 return result; |
| 1685 } | 1698 } |
| 1686 | 1699 |
| 1687 | 1700 |
| 1688 MaybeObject* KeyedLoadStubCompiler::GetCode(PropertyType type, String* name) { | 1701 MaybeObject* KeyedLoadStubCompiler::GetCode(PropertyType type, String* name) { |
| 1689 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, type); | 1702 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, type); |
| 1690 MaybeObject* result = GetCodeWithFlags(flags, name); | 1703 MaybeObject* result = GetCodeWithFlags(flags, name); |
| 1691 if (!result->IsFailure()) { | 1704 if (!result->IsFailure()) { |
| 1692 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, | 1705 PROFILE(isolate(), |
| 1706 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, |
| 1693 Code::cast(result->ToObjectUnchecked()), | 1707 Code::cast(result->ToObjectUnchecked()), |
| 1694 name)); | 1708 name)); |
| 1695 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, | 1709 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, |
| 1696 name, | 1710 name, |
| 1697 Code::cast(result->ToObjectUnchecked()))); | 1711 Code::cast(result->ToObjectUnchecked()))); |
| 1698 } | 1712 } |
| 1699 return result; | 1713 return result; |
| 1700 } | 1714 } |
| 1701 | 1715 |
| 1702 | 1716 |
| 1703 MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) { | 1717 MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) { |
| 1704 Code::Flags flags = Code::ComputeMonomorphicFlags( | 1718 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 1705 Code::STORE_IC, type, strict_mode_); | 1719 Code::STORE_IC, type, strict_mode_); |
| 1706 MaybeObject* result = GetCodeWithFlags(flags, name); | 1720 MaybeObject* result = GetCodeWithFlags(flags, name); |
| 1707 if (!result->IsFailure()) { | 1721 if (!result->IsFailure()) { |
| 1708 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, | 1722 PROFILE(isolate(), |
| 1723 CodeCreateEvent(Logger::STORE_IC_TAG, |
| 1709 Code::cast(result->ToObjectUnchecked()), | 1724 Code::cast(result->ToObjectUnchecked()), |
| 1710 name)); | 1725 name)); |
| 1711 GDBJIT(AddCode(GDBJITInterface::STORE_IC, | 1726 GDBJIT(AddCode(GDBJITInterface::STORE_IC, |
| 1712 name, | 1727 name, |
| 1713 Code::cast(result->ToObjectUnchecked()))); | 1728 Code::cast(result->ToObjectUnchecked()))); |
| 1714 } | 1729 } |
| 1715 return result; | 1730 return result; |
| 1716 } | 1731 } |
| 1717 | 1732 |
| 1718 | 1733 |
| 1719 MaybeObject* KeyedStoreStubCompiler::GetCode(PropertyType type, String* name) { | 1734 MaybeObject* KeyedStoreStubCompiler::GetCode(PropertyType type, String* name) { |
| 1720 Code::Flags flags = Code::ComputeMonomorphicFlags( | 1735 Code::Flags flags = Code::ComputeMonomorphicFlags( |
| 1721 Code::KEYED_STORE_IC, type, strict_mode_); | 1736 Code::KEYED_STORE_IC, type, strict_mode_); |
| 1722 MaybeObject* result = GetCodeWithFlags(flags, name); | 1737 MaybeObject* result = GetCodeWithFlags(flags, name); |
| 1723 if (!result->IsFailure()) { | 1738 if (!result->IsFailure()) { |
| 1724 PROFILE(CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, | 1739 PROFILE(isolate(), |
| 1740 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
| 1725 Code::cast(result->ToObjectUnchecked()), | 1741 Code::cast(result->ToObjectUnchecked()), |
| 1726 name)); | 1742 name)); |
| 1727 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, | 1743 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, |
| 1728 name, | 1744 name, |
| 1729 Code::cast(result->ToObjectUnchecked()))); | 1745 Code::cast(result->ToObjectUnchecked()))); |
| 1730 } | 1746 } |
| 1731 return result; | 1747 return result; |
| 1732 } | 1748 } |
| 1733 | 1749 |
| 1734 | 1750 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1796 | 1812 |
| 1797 | 1813 |
| 1798 MaybeObject* ConstructStubCompiler::GetCode() { | 1814 MaybeObject* ConstructStubCompiler::GetCode() { |
| 1799 Code::Flags flags = Code::ComputeFlags(Code::STUB); | 1815 Code::Flags flags = Code::ComputeFlags(Code::STUB); |
| 1800 Object* result; | 1816 Object* result; |
| 1801 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ConstructStub"); | 1817 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ConstructStub"); |
| 1802 if (!maybe_result->ToObject(&result)) return maybe_result; | 1818 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 1803 } | 1819 } |
| 1804 Code* code = Code::cast(result); | 1820 Code* code = Code::cast(result); |
| 1805 USE(code); | 1821 USE(code); |
| 1806 PROFILE(CodeCreateEvent(Logger::STUB_TAG, code, "ConstructStub")); | 1822 PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, code, "ConstructStub")); |
| 1807 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", Code::cast(code))); | 1823 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", Code::cast(code))); |
| 1808 return result; | 1824 return result; |
| 1809 } | 1825 } |
| 1810 | 1826 |
| 1811 | 1827 |
| 1812 CallOptimization::CallOptimization(LookupResult* lookup) { | 1828 CallOptimization::CallOptimization(LookupResult* lookup) { |
| 1813 if (!lookup->IsProperty() || !lookup->IsCacheable() || | 1829 if (!lookup->IsProperty() || !lookup->IsCacheable() || |
| 1814 lookup->type() != CONSTANT_FUNCTION) { | 1830 lookup->type() != CONSTANT_FUNCTION) { |
| 1815 Initialize(NULL); | 1831 Initialize(NULL); |
| 1816 } else { | 1832 } else { |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1876 } | 1892 } |
| 1877 | 1893 |
| 1878 | 1894 |
| 1879 MaybeObject* ExternalArrayStubCompiler::GetCode(Code::Flags flags) { | 1895 MaybeObject* ExternalArrayStubCompiler::GetCode(Code::Flags flags) { |
| 1880 Object* result; | 1896 Object* result; |
| 1881 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ExternalArrayStub"); | 1897 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ExternalArrayStub"); |
| 1882 if (!maybe_result->ToObject(&result)) return maybe_result; | 1898 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 1883 } | 1899 } |
| 1884 Code* code = Code::cast(result); | 1900 Code* code = Code::cast(result); |
| 1885 USE(code); | 1901 USE(code); |
| 1886 PROFILE(CodeCreateEvent(Logger::STUB_TAG, code, "ExternalArrayStub")); | 1902 PROFILE(isolate(),CodeCreateEvent(Logger::STUB_TAG, code, "ExternalArrayStub")
); |
| 1887 return result; | 1903 return result; |
| 1888 } | 1904 } |
| 1889 | 1905 |
| 1890 | 1906 |
| 1891 } } // namespace v8::internal | 1907 } } // namespace v8::internal |
| OLD | NEW |