| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/interpreter/interpreter.h" | 5 #include "src/interpreter/interpreter.h" |
| 6 | 6 |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 #include "src/compiler.h" | 8 #include "src/compiler.h" |
| 9 #include "src/compiler/interpreter-assembler.h" | 9 #include "src/compiler/interpreter-assembler.h" |
| 10 #include "src/factory.h" | 10 #include "src/factory.h" |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 // | 177 // |
| 178 // Store accumulator to register <dst>. | 178 // Store accumulator to register <dst>. |
| 179 void Interpreter::DoStar(compiler::InterpreterAssembler* assembler) { | 179 void Interpreter::DoStar(compiler::InterpreterAssembler* assembler) { |
| 180 Node* reg_index = __ BytecodeOperandReg8(0); | 180 Node* reg_index = __ BytecodeOperandReg8(0); |
| 181 Node* accumulator = __ GetAccumulator(); | 181 Node* accumulator = __ GetAccumulator(); |
| 182 __ StoreRegister(accumulator, reg_index); | 182 __ StoreRegister(accumulator, reg_index); |
| 183 __ Dispatch(); | 183 __ Dispatch(); |
| 184 } | 184 } |
| 185 | 185 |
| 186 | 186 |
| 187 // LdaGlobal <slot_index> | 187 void Interpreter::DoLoadGlobal(Callable ic, |
| 188 // | 188 compiler::InterpreterAssembler* assembler) { |
| 189 // Load the global at |slot_index| into the accumulator. | 189 // Get the global object. |
| 190 void Interpreter::DoLdaGlobal(compiler::InterpreterAssembler* assembler) { | 190 Node* context = __ GetContext(); |
| 191 Node* slot_index = __ BytecodeOperandIdx8(0); | 191 Node* global = __ LoadContextSlot(context, Context::GLOBAL_OBJECT_INDEX); |
| 192 Node* smi_slot_index = __ SmiTag(slot_index); | 192 |
| 193 Node* result = __ CallRuntime(Runtime::kLoadGlobalViaContext, smi_slot_index); | 193 // Load the global via the LoadIC. |
| 194 Node* code_target = __ HeapConstant(ic.code()); |
| 195 Node* constant_index = __ BytecodeOperandIdx8(0); |
| 196 Node* name = __ LoadConstantPoolEntry(constant_index); |
| 197 Node* raw_slot = __ BytecodeOperandIdx8(1); |
| 198 Node* smi_slot = __ SmiTag(raw_slot); |
| 199 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
| 200 Node* result = __ CallIC(ic.descriptor(), code_target, global, name, smi_slot, |
| 201 type_feedback_vector); |
| 194 __ SetAccumulator(result); | 202 __ SetAccumulator(result); |
| 203 |
| 195 __ Dispatch(); | 204 __ Dispatch(); |
| 196 } | 205 } |
| 197 | 206 |
| 198 | 207 |
| 199 // StaGlobalSloppy <slot_index> | 208 // LdaGlobalSloppy <name> <slot> |
| 200 // | 209 // |
| 201 // Store the global at |slot_index| with the value in the the accumulator in | 210 // Load the global with name in constant pool entry <name> into the accumulator |
| 202 // sloppy mode. | 211 // using FeedBackVector slot <slot> in sloppy mode. |
| 203 void Interpreter::DoStaGlobalSloppy(compiler::InterpreterAssembler* assembler) { | 212 void Interpreter::DoLdaGlobalSloppy(compiler::InterpreterAssembler* assembler) { |
| 204 Node* slot_index = __ BytecodeOperandIdx8(0); | 213 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
| 205 Node* smi_slot_index = __ SmiTag(slot_index); | 214 SLOPPY, UNINITIALIZED); |
| 215 DoLoadGlobal(ic, assembler); |
| 216 } |
| 217 |
| 218 |
| 219 // LdaGlobalSloppy <name> <slot> |
| 220 // |
| 221 // Load the global with name in constant pool entry <name> into the accumulator |
| 222 // using FeedBackVector slot <slot> in strict mode. |
| 223 void Interpreter::DoLdaGlobalStrict(compiler::InterpreterAssembler* assembler) { |
| 224 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
| 225 STRICT, UNINITIALIZED); |
| 226 DoLoadGlobal(ic, assembler); |
| 227 } |
| 228 |
| 229 |
| 230 void Interpreter::DoStoreGlobal(Callable ic, |
| 231 compiler::InterpreterAssembler* assembler) { |
| 232 // Get the global object. |
| 233 Node* context = __ GetContext(); |
| 234 Node* global = __ LoadContextSlot(context, Context::GLOBAL_OBJECT_INDEX); |
| 235 |
| 236 // Store the global via the StoreIC. |
| 237 Node* code_target = __ HeapConstant(ic.code()); |
| 238 Node* constant_index = __ BytecodeOperandIdx8(0); |
| 239 Node* name = __ LoadConstantPoolEntry(constant_index); |
| 206 Node* value = __ GetAccumulator(); | 240 Node* value = __ GetAccumulator(); |
| 207 __ CallRuntime(Runtime::kStoreGlobalViaContext_Sloppy, smi_slot_index, value); | 241 Node* raw_slot = __ BytecodeOperandIdx8(1); |
| 242 Node* smi_slot = __ SmiTag(raw_slot); |
| 243 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
| 244 __ CallIC(ic.descriptor(), code_target, global, name, value, smi_slot, |
| 245 type_feedback_vector); |
| 246 |
| 208 __ Dispatch(); | 247 __ Dispatch(); |
| 209 } | 248 } |
| 210 | 249 |
| 211 | 250 |
| 212 // StaGlobalStrict <slot_index> | 251 // StaGlobalSloppy <name> <slot> |
| 213 // | 252 // |
| 214 // Store the global at |slot_index| with the value in the the accumulator in | 253 // Store the value in the accumulator into the global with name in constant pool |
| 215 // strict mode. | 254 // entry <name> using FeedBackVector slot <slot> in sloppy mode. |
| 216 void Interpreter::DoStaGlobalStrict(compiler::InterpreterAssembler* assembler) { | 255 void Interpreter::DoStaGlobalSloppy(compiler::InterpreterAssembler* assembler) { |
| 217 Node* slot_index = __ BytecodeOperandIdx8(0); | 256 Callable ic = |
| 218 Node* smi_slot_index = __ SmiTag(slot_index); | 257 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
| 219 Node* value = __ GetAccumulator(); | 258 DoStoreGlobal(ic, assembler); |
| 220 __ CallRuntime(Runtime::kStoreGlobalViaContext_Strict, smi_slot_index, value); | |
| 221 __ Dispatch(); | |
| 222 } | 259 } |
| 223 | 260 |
| 224 | 261 |
| 262 // StaGlobalStrict <name> <slot> |
| 263 // |
| 264 // Store the value in the accumulator into the global with name in constant pool |
| 265 // entry <name> using FeedBackVector slot <slot> in strict mode. |
| 266 void Interpreter::DoStaGlobalStrict(compiler::InterpreterAssembler* assembler) { |
| 267 Callable ic = |
| 268 CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
| 269 DoStoreGlobal(ic, assembler); |
| 270 } |
| 271 |
| 272 |
| 225 // LdaContextSlot <context> <slot_index> | 273 // LdaContextSlot <context> <slot_index> |
| 226 // | 274 // |
| 227 // Load the object in |slot_index| of |context| into the accumulator. | 275 // Load the object in |slot_index| of |context| into the accumulator. |
| 228 void Interpreter::DoLdaContextSlot(compiler::InterpreterAssembler* assembler) { | 276 void Interpreter::DoLdaContextSlot(compiler::InterpreterAssembler* assembler) { |
| 229 Node* reg_index = __ BytecodeOperandReg8(0); | 277 Node* reg_index = __ BytecodeOperandReg8(0); |
| 230 Node* context = __ LoadRegister(reg_index); | 278 Node* context = __ LoadRegister(reg_index); |
| 231 Node* slot_index = __ BytecodeOperandIdx8(1); | 279 Node* slot_index = __ BytecodeOperandIdx8(1); |
| 232 Node* result = __ LoadContextSlot(context, slot_index); | 280 Node* result = __ LoadContextSlot(context, slot_index); |
| 233 __ SetAccumulator(result); | 281 __ SetAccumulator(result); |
| 234 __ Dispatch(); | 282 __ Dispatch(); |
| 235 } | 283 } |
| 236 | 284 |
| 237 | 285 |
| 238 // StaContextSlot <context> <slot_index> | 286 // StaContextSlot <context> <slot_index> |
| 239 // | 287 // |
| 240 // Stores the object in the accumulator into |slot_index| of |context|. | 288 // Stores the object in the accumulator into |slot_index| of |context|. |
| 241 void Interpreter::DoStaContextSlot(compiler::InterpreterAssembler* assembler) { | 289 void Interpreter::DoStaContextSlot(compiler::InterpreterAssembler* assembler) { |
| 242 Node* value = __ GetAccumulator(); | 290 Node* value = __ GetAccumulator(); |
| 243 Node* reg_index = __ BytecodeOperandReg8(0); | 291 Node* reg_index = __ BytecodeOperandReg8(0); |
| 244 Node* context = __ LoadRegister(reg_index); | 292 Node* context = __ LoadRegister(reg_index); |
| 245 Node* slot_index = __ BytecodeOperandIdx8(1); | 293 Node* slot_index = __ BytecodeOperandIdx8(1); |
| 246 __ StoreContextSlot(context, slot_index, value); | 294 __ StoreContextSlot(context, slot_index, value); |
| 247 __ Dispatch(); | 295 __ Dispatch(); |
| 248 } | 296 } |
| 249 | 297 |
| 250 | 298 |
| 251 void Interpreter::DoPropertyLoadIC(Callable ic, | 299 void Interpreter::DoLoadIC(Callable ic, |
| 252 compiler::InterpreterAssembler* assembler) { | 300 compiler::InterpreterAssembler* assembler) { |
| 253 Node* code_target = __ HeapConstant(ic.code()); | 301 Node* code_target = __ HeapConstant(ic.code()); |
| 254 Node* reg_index = __ BytecodeOperandReg8(0); | 302 Node* register_index = __ BytecodeOperandReg8(0); |
| 255 Node* object = __ LoadRegister(reg_index); | 303 Node* object = __ LoadRegister(register_index); |
| 256 Node* name = __ GetAccumulator(); | 304 Node* constant_index = __ BytecodeOperandIdx8(1); |
| 257 Node* raw_slot = __ BytecodeOperandIdx8(1); | 305 Node* name = __ LoadConstantPoolEntry(constant_index); |
| 306 Node* raw_slot = __ BytecodeOperandIdx8(2); |
| 258 Node* smi_slot = __ SmiTag(raw_slot); | 307 Node* smi_slot = __ SmiTag(raw_slot); |
| 259 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 308 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
| 260 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, smi_slot, | 309 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, smi_slot, |
| 261 type_feedback_vector); | 310 type_feedback_vector); |
| 262 __ SetAccumulator(result); | 311 __ SetAccumulator(result); |
| 263 __ Dispatch(); | 312 __ Dispatch(); |
| 264 } | 313 } |
| 265 | 314 |
| 266 | 315 |
| 267 // LoadICSloppy <object> <slot> | 316 // LoadICSloppy <object> <name> <slot> |
| 268 // | 317 // |
| 269 // Calls the sloppy mode LoadIC at FeedBackVector slot <slot> for <object> and | 318 // Calls the sloppy mode LoadIC at FeedBackVector slot <slot> for <object> and |
| 270 // the name in the accumulator. | 319 // the name at constant pool entry <name>. |
| 271 void Interpreter::DoLoadICSloppy(compiler::InterpreterAssembler* assembler) { | 320 void Interpreter::DoLoadICSloppy(compiler::InterpreterAssembler* assembler) { |
| 272 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, | 321 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
| 273 SLOPPY, UNINITIALIZED); | 322 SLOPPY, UNINITIALIZED); |
| 274 DoPropertyLoadIC(ic, assembler); | 323 DoLoadIC(ic, assembler); |
| 275 } | 324 } |
| 276 | 325 |
| 277 | 326 |
| 278 // LoadICStrict <object> <slot> | 327 // LoadICStrict <object> <name> <slot> |
| 279 // | 328 // |
| 280 // Calls the strict mode LoadIC at FeedBackVector slot <slot> for <object> and | 329 // Calls the sloppy mode LoadIC at FeedBackVector slot <slot> for <object> and |
| 281 // the name in the accumulator. | 330 // the name at constant pool entry <name>. |
| 282 void Interpreter::DoLoadICStrict(compiler::InterpreterAssembler* assembler) { | 331 void Interpreter::DoLoadICStrict(compiler::InterpreterAssembler* assembler) { |
| 283 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, | 332 Callable ic = CodeFactory::LoadICInOptimizedCode(isolate_, NOT_INSIDE_TYPEOF, |
| 284 STRICT, UNINITIALIZED); | 333 STRICT, UNINITIALIZED); |
| 285 DoPropertyLoadIC(ic, assembler); | 334 DoLoadIC(ic, assembler); |
| 286 } | 335 } |
| 287 | 336 |
| 288 | 337 |
| 338 void Interpreter::DoKeyedLoadIC(Callable ic, |
| 339 compiler::InterpreterAssembler* assembler) { |
| 340 Node* code_target = __ HeapConstant(ic.code()); |
| 341 Node* reg_index = __ BytecodeOperandReg8(0); |
| 342 Node* object = __ LoadRegister(reg_index); |
| 343 Node* name = __ GetAccumulator(); |
| 344 Node* raw_slot = __ BytecodeOperandIdx8(1); |
| 345 Node* smi_slot = __ SmiTag(raw_slot); |
| 346 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
| 347 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, smi_slot, |
| 348 type_feedback_vector); |
| 349 __ SetAccumulator(result); |
| 350 __ Dispatch(); |
| 351 } |
| 352 |
| 353 |
| 289 // KeyedLoadICSloppy <object> <slot> | 354 // KeyedLoadICSloppy <object> <slot> |
| 290 // | 355 // |
| 291 // Calls the sloppy mode KeyedLoadIC at FeedBackVector slot <slot> for <object> | 356 // Calls the sloppy mode KeyedLoadIC at FeedBackVector slot <slot> for <object> |
| 292 // and the key in the accumulator. | 357 // and the key in the accumulator. |
| 293 void Interpreter::DoKeyedLoadICSloppy( | 358 void Interpreter::DoKeyedLoadICSloppy( |
| 294 compiler::InterpreterAssembler* assembler) { | 359 compiler::InterpreterAssembler* assembler) { |
| 295 Callable ic = | 360 Callable ic = |
| 296 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); | 361 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
| 297 DoPropertyLoadIC(ic, assembler); | 362 DoKeyedLoadIC(ic, assembler); |
| 298 } | 363 } |
| 299 | 364 |
| 300 | 365 |
| 301 // KeyedLoadICStrict <object> <slot> | 366 // KeyedLoadICStrict <object> <slot> |
| 302 // | 367 // |
| 303 // Calls the strict mode KeyedLoadIC at FeedBackVector slot <slot> for <object> | 368 // Calls the strict mode KeyedLoadIC at FeedBackVector slot <slot> for <object> |
| 304 // and the key in the accumulator. | 369 // and the key in the accumulator. |
| 305 void Interpreter::DoKeyedLoadICStrict( | 370 void Interpreter::DoKeyedLoadICStrict( |
| 306 compiler::InterpreterAssembler* assembler) { | 371 compiler::InterpreterAssembler* assembler) { |
| 307 Callable ic = | 372 Callable ic = |
| 308 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); | 373 CodeFactory::KeyedLoadICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
| 309 DoPropertyLoadIC(ic, assembler); | 374 DoKeyedLoadIC(ic, assembler); |
| 310 } | 375 } |
| 311 | 376 |
| 312 | 377 |
| 313 void Interpreter::DoPropertyStoreIC(Callable ic, | 378 void Interpreter::DoStoreIC(Callable ic, |
| 314 compiler::InterpreterAssembler* assembler) { | 379 compiler::InterpreterAssembler* assembler) { |
| 315 Node* code_target = __ HeapConstant(ic.code()); | 380 Node* code_target = __ HeapConstant(ic.code()); |
| 316 Node* object_reg_index = __ BytecodeOperandReg8(0); | 381 Node* object_reg_index = __ BytecodeOperandReg8(0); |
| 317 Node* object = __ LoadRegister(object_reg_index); | 382 Node* object = __ LoadRegister(object_reg_index); |
| 318 Node* name_reg_index = __ BytecodeOperandReg8(1); | 383 Node* constant_index = __ BytecodeOperandIdx8(1); |
| 319 Node* name = __ LoadRegister(name_reg_index); | 384 Node* name = __ LoadConstantPoolEntry(constant_index); |
| 320 Node* value = __ GetAccumulator(); | 385 Node* value = __ GetAccumulator(); |
| 321 Node* raw_slot = __ BytecodeOperandIdx8(2); | 386 Node* raw_slot = __ BytecodeOperandIdx8(2); |
| 322 Node* smi_slot = __ SmiTag(raw_slot); | 387 Node* smi_slot = __ SmiTag(raw_slot); |
| 323 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | 388 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
| 324 Node* result = __ CallIC(ic.descriptor(), code_target, object, name, value, | 389 __ CallIC(ic.descriptor(), code_target, object, name, value, smi_slot, |
| 325 smi_slot, type_feedback_vector); | 390 type_feedback_vector); |
| 326 __ SetAccumulator(result); | |
| 327 __ Dispatch(); | 391 __ Dispatch(); |
| 328 } | 392 } |
| 329 | 393 |
| 330 | 394 |
| 331 // StoreICSloppy <object> <name> <slot> | 395 // StoreICSloppy <object> <name> <slot> |
| 332 // | 396 // |
| 333 // Calls the sloppy mode StoreIC at FeedBackVector slot <slot> for <object> and | 397 // Calls the sloppy mode StoreIC at FeedBackVector slot <slot> for <object> and |
| 334 // the name <name> with the value in the accumulator. | 398 // the in constant pool entry <name> with the value in the accumulator. |
| 335 void Interpreter::DoStoreICSloppy(compiler::InterpreterAssembler* assembler) { | 399 void Interpreter::DoStoreICSloppy(compiler::InterpreterAssembler* assembler) { |
| 336 Callable ic = | 400 Callable ic = |
| 337 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); | 401 CodeFactory::StoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
| 338 DoPropertyStoreIC(ic, assembler); | 402 DoStoreIC(ic, assembler); |
| 339 } | 403 } |
| 340 | 404 |
| 341 | 405 |
| 342 // StoreICStrict <object> <name> <slot> | 406 // StoreICStrict <object> <name> <slot> |
| 343 // | 407 // |
| 344 // Calls the strict mode StoreIC at FeedBackVector slot <slot> for <object> and | 408 // Calls the strict mode StoreIC at FeedBackVector slot <slot> for <object> and |
| 345 // the name <name> with the value in the accumulator. | 409 // the name in constant pool entry <name> with the value in the accumulator. |
| 346 void Interpreter::DoStoreICStrict(compiler::InterpreterAssembler* assembler) { | 410 void Interpreter::DoStoreICStrict(compiler::InterpreterAssembler* assembler) { |
| 347 Callable ic = | 411 Callable ic = |
| 348 CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); | 412 CodeFactory::StoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
| 349 DoPropertyStoreIC(ic, assembler); | 413 DoStoreIC(ic, assembler); |
| 350 } | 414 } |
| 351 | 415 |
| 352 | 416 |
| 417 void Interpreter::DoKeyedStoreIC(Callable ic, |
| 418 compiler::InterpreterAssembler* assembler) { |
| 419 Node* code_target = __ HeapConstant(ic.code()); |
| 420 Node* object_reg_index = __ BytecodeOperandReg8(0); |
| 421 Node* object = __ LoadRegister(object_reg_index); |
| 422 Node* name_reg_index = __ BytecodeOperandReg8(1); |
| 423 Node* name = __ LoadRegister(name_reg_index); |
| 424 Node* value = __ GetAccumulator(); |
| 425 Node* raw_slot = __ BytecodeOperandIdx8(2); |
| 426 Node* smi_slot = __ SmiTag(raw_slot); |
| 427 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); |
| 428 __ CallIC(ic.descriptor(), code_target, object, name, value, smi_slot, |
| 429 type_feedback_vector); |
| 430 __ Dispatch(); |
| 431 } |
| 432 |
| 433 |
| 353 // KeyedStoreICSloppy <object> <key> <slot> | 434 // KeyedStoreICSloppy <object> <key> <slot> |
| 354 // | 435 // |
| 355 // Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object> | 436 // Calls the sloppy mode KeyStoreIC at FeedBackVector slot <slot> for <object> |
| 356 // and the key <key> with the value in the accumulator. | 437 // and the key <key> with the value in the accumulator. |
| 357 void Interpreter::DoKeyedStoreICSloppy( | 438 void Interpreter::DoKeyedStoreICSloppy( |
| 358 compiler::InterpreterAssembler* assembler) { | 439 compiler::InterpreterAssembler* assembler) { |
| 359 Callable ic = | 440 Callable ic = |
| 360 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); | 441 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, SLOPPY, UNINITIALIZED); |
| 361 DoPropertyStoreIC(ic, assembler); | 442 DoKeyedStoreIC(ic, assembler); |
| 362 } | 443 } |
| 363 | 444 |
| 364 | 445 |
| 365 // KeyedStoreICStore <object> <key> <slot> | 446 // KeyedStoreICStore <object> <key> <slot> |
| 366 // | 447 // |
| 367 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object> | 448 // Calls the strict mode KeyStoreIC at FeedBackVector slot <slot> for <object> |
| 368 // and the key <key> with the value in the accumulator. | 449 // and the key <key> with the value in the accumulator. |
| 369 void Interpreter::DoKeyedStoreICStrict( | 450 void Interpreter::DoKeyedStoreICStrict( |
| 370 compiler::InterpreterAssembler* assembler) { | 451 compiler::InterpreterAssembler* assembler) { |
| 371 Callable ic = | 452 Callable ic = |
| 372 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); | 453 CodeFactory::KeyedStoreICInOptimizedCode(isolate_, STRICT, UNINITIALIZED); |
| 373 DoPropertyStoreIC(ic, assembler); | 454 DoKeyedStoreIC(ic, assembler); |
| 374 } | 455 } |
| 375 | 456 |
| 376 | 457 |
| 377 // PushContext <context> | 458 // PushContext <context> |
| 378 // | 459 // |
| 379 // Pushes the accumulator as the current context, and saves it in <context> | 460 // Pushes the accumulator as the current context, and saves it in <context> |
| 380 void Interpreter::DoPushContext(compiler::InterpreterAssembler* assembler) { | 461 void Interpreter::DoPushContext(compiler::InterpreterAssembler* assembler) { |
| 381 Node* reg_index = __ BytecodeOperandReg8(0); | 462 Node* reg_index = __ BytecodeOperandReg8(0); |
| 382 Node* context = __ GetAccumulator(); | 463 Node* context = __ GetAccumulator(); |
| 383 __ SetContext(context); | 464 __ SetContext(context); |
| (...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 923 // | 1004 // |
| 924 // Return the value in the accumulator. | 1005 // Return the value in the accumulator. |
| 925 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) { | 1006 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) { |
| 926 __ Return(); | 1007 __ Return(); |
| 927 } | 1008 } |
| 928 | 1009 |
| 929 | 1010 |
| 930 } // namespace interpreter | 1011 } // namespace interpreter |
| 931 } // namespace internal | 1012 } // namespace internal |
| 932 } // namespace v8 | 1013 } // namespace v8 |
| OLD | NEW |