diff options
| author | 2015-06-18 19:56:57 +0000 | |
|---|---|---|
| committer | 2015-06-18 19:56:58 +0000 | |
| commit | 247e97746016b49183b52f4c386bedf7cd53e590 (patch) | |
| tree | 758c0a7c60c2099fb6a8cf2d4ea68ffc8c9459ac /runtime/interpreter/interpreter_switch_impl.cc | |
| parent | 2b696ab55e817b583d7b3b3ffd39e48c38db6989 (diff) | |
| parent | 158f35c98e2ec0d40d2c032b8cdce5fb60944a7f (diff) | |
Merge "interpreter: Add experimental lambda opcodes for invoke/create-lambda"
Diffstat (limited to 'runtime/interpreter/interpreter_switch_impl.cc')
| -rw-r--r-- | runtime/interpreter/interpreter_switch_impl.cc | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/runtime/interpreter/interpreter_switch_impl.cc b/runtime/interpreter/interpreter_switch_impl.cc index fcf083cbe1..80401977cd 100644 --- a/runtime/interpreter/interpreter_switch_impl.cc +++ b/runtime/interpreter/interpreter_switch_impl.cc @@ -53,6 +53,11 @@ namespace interpreter { } \ } while (false) +static bool IsExperimentalInstructionEnabled(const Instruction *inst) { + DCHECK(inst->IsExperimental()); + return Runtime::Current()->AreExperimentalLambdasEnabled(); +} + template<bool do_access_check, bool transaction_active> JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, ShadowFrame& shadow_frame, JValue result_register) { @@ -2217,8 +2222,39 @@ JValue ExecuteSwitchImpl(Thread* self, const DexFile::CodeItem* code_item, (inst->VRegC_22b() & 0x1f)); inst = inst->Next_2xx(); break; + case Instruction::INVOKE_LAMBDA: { + if (!IsExperimentalInstructionEnabled(inst)) { + UnexpectedOpcode(inst, shadow_frame); + } + + PREAMBLE(); + bool success = DoInvokeLambda<do_access_check>(self, shadow_frame, inst, inst_data, + &result_register); + POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); + break; + } + case Instruction::CREATE_LAMBDA: { + if (!IsExperimentalInstructionEnabled(inst)) { + UnexpectedOpcode(inst, shadow_frame); + } + + PREAMBLE(); + bool success = DoCreateLambda<do_access_check>(self, shadow_frame, inst); + POSSIBLY_HANDLE_PENDING_EXCEPTION(!success, Next_2xx); + break; + } + case Instruction::UNUSED_F4: + case Instruction::UNUSED_F5: + case Instruction::UNUSED_F7 ... Instruction::UNUSED_F9: { + if (!IsExperimentalInstructionEnabled(inst)) { + UnexpectedOpcode(inst, shadow_frame); + } + + CHECK(false); // TODO(iam): Implement opcodes for lambdas + break; + } case Instruction::UNUSED_3E ... Instruction::UNUSED_43: - case Instruction::UNUSED_F3 ... Instruction::UNUSED_FF: + case Instruction::UNUSED_FA ... Instruction::UNUSED_FF: case Instruction::UNUSED_79: case Instruction::UNUSED_7A: UnexpectedOpcode(inst, shadow_frame); |