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