@@ -2505,3 +2505,47 @@ class TranslatedNewObject extends TranslatedCilInstruction, TTranslatedNewObject
25052505 .getStackElement ( i + instr .getNumberOfArguments ( ) )
25062506 }
25072507}
2508+
2509+ class TranslatedDup extends TranslatedCilInstruction , TTranslatedDup {
2510+ override Raw:: CilDup instr ;
2511+
2512+ TranslatedDup ( ) { this = TTranslatedDup ( instr ) }
2513+
2514+ final override predicate hasInstruction (
2515+ Opcode opcode , InstructionTag tag , Option< Variable > :: Option v
2516+ ) {
2517+ opcode instanceof Opcode:: Copy and
2518+ tag = SingleTag ( ) and
2519+ v .asSome ( ) = this .getTempVariable ( CilDupVarTag ( ) )
2520+ }
2521+
2522+ override predicate hasTempVariable ( TempVariableTag tag ) { tag = CilDupVarTag ( ) }
2523+
2524+ override predicate producesResult ( ) { any ( ) }
2525+
2526+ override Variable getVariableOperand ( InstructionTag tag , OperandTag operandTag ) {
2527+ tag = SingleTag ( ) and
2528+ operandTag instanceof UnaryTag and
2529+ result = getTranslatedCilInstruction ( instr .getABackwardPredecessor ( ) ) .getStackElement ( 0 )
2530+ }
2531+
2532+ override Instruction getChildSuccessor ( TranslatedElement child , SuccessorType succType ) { none ( ) }
2533+
2534+ override Instruction getSuccessor ( InstructionTag tag , SuccessorType succType ) {
2535+ tag = SingleTag ( ) and
2536+ succType instanceof DirectSuccessor and
2537+ result = getTranslatedInstruction ( instr .getASuccessor ( ) ) .getEntry ( )
2538+ }
2539+
2540+ override Instruction getEntry ( ) { result = this .getInstruction ( SingleTag ( ) ) }
2541+
2542+ override Variable getResultVariable ( ) { result = this .getTempVariable ( CilDupVarTag ( ) ) }
2543+
2544+ final override Variable getStackElement ( int i ) {
2545+ i = 0 and
2546+ result = this .getInstruction ( SingleTag ( ) ) .getResultVariable ( )
2547+ or
2548+ i > 0 and
2549+ result = getTranslatedCilInstruction ( instr .getABackwardPredecessor ( ) ) .getStackElement ( i - 1 )
2550+ }
2551+ }
0 commit comments