final ArgsNode argsNode = (ArgsNode) node; final int required = argsNode.getRequiredArgsCount(); final int opt = argsNode.getOptionalArgsCount(); final int rest = argsNode.getRestArg(); ArrayCallback requiredAssignment = null; ArrayCallback optionalGiven = null; ArrayCallback optionalNotGiven = null; CompilerCallback restAssignment = null; CompilerCallback blockAssignment = null; if (required > 0) { requiredAssignment = new ArrayCallback() { public void nextValue(BodyCompiler context, Object object, int index) { // FIXME: Somehow I'd feel better if this could get the appropriate var index from the ArgumentNode context.getVariableCompiler().assignLocalVariable(index, false); } }; } if (opt > 0) { optionalGiven = new ArrayCallback() { public void nextValue(BodyCompiler context, Object object, int index) { Node optArg = ((ListNode) object).get(index); compileAssignment(optArg, context,true); context.consumeCurrentValue(); } }; optionalNotGiven = new ArrayCallback() { public void nextValue(BodyCompiler context, Object object, int index) { Node optArg = ((ListNode) object).get(index); compile(optArg, context,true); context.consumeCurrentValue(); } }; } if (rest > -1) { restAssignment = new CompilerCallback() { public void call(BodyCompiler context) { context.getVariableCompiler().assignLocalVariable(argsNode.getRestArg(), false); } }; } if (argsNode.getBlock() != null) { blockAssignment = new CompilerCallback() { public void call(BodyCompiler context) { context.getVariableCompiler().assignLocalVariable(argsNode.getBlock().getCount(), false); } }; } context.getVariableCompiler().checkMethodArity(required, opt, rest); context.getVariableCompiler().assignMethodArguments(argsNode.getPre(), argsNode.getRequiredArgsCount(), argsNode.getOptArgs(), argsNode.getOptionalArgsCount(), requiredAssignment, optionalGiven, optionalNotGiven, restAssignment, blockAssignment); // TODO: don't require pop if (!expr) context.consumeCurrentValue();
final ArgsNode argsNode = (ArgsNode) node; final int required = argsNode.getRequiredArgsCount(); final int opt = argsNode.getOptionalArgsCount(); final int rest = argsNode.getRestArg(); ArrayCallback requiredAssignment = null; ArrayCallback optionalGiven = null; ArrayCallback optionalNotGiven = null; CompilerCallback restAssignment = null; CompilerCallback blockAssignment = null; if (required > 0) { requiredAssignment = new ArrayCallback() { public void nextValue(BodyCompiler context, Object object, int index) { // FIXME: Somehow I'd feel better if this could get the appropriate var index from the ArgumentNode context.getVariableCompiler().assignLocalVariable(index, false); } }; } if (opt > 0) { optionalGiven = new ArrayCallback() { public void nextValue(BodyCompiler context, Object object, int index) { OptArgNode optArg = (OptArgNode)((ListNode) object).get(index); compileAssignment(optArg.getValue(), context, false); } }; optionalNotGiven = new ArrayCallback() { public void nextValue(BodyCompiler context, Object object, int index) { OptArgNode optArg = (OptArgNode)((ListNode) object).get(index); compile(optArg.getValue(), context, false); } }; } if (rest > -1) { restAssignment = new CompilerCallback() { public void call(BodyCompiler context) { context.getVariableCompiler().assignLocalVariable(argsNode.getRestArg(), false); } }; } if (argsNode.getBlock() != null) { blockAssignment = new CompilerCallback() { public void call(BodyCompiler context) { context.getVariableCompiler().assignLocalVariable(argsNode.getBlock().getCount(), false); } }; } context.getVariableCompiler().assignMethodArguments19( argsNode.getPre(), argsNode.getPreCount(), argsNode.getPost(), argsNode.getPostCount(), argsNode.getPostIndex(), argsNode.getOptArgs(), argsNode.getOptionalArgsCount(), requiredAssignment, optionalGiven, optionalNotGiven, restAssignment, blockAssignment); // TODO: don't require pop if (!expr) context.consumeCurrentValue();
Clone fragments detected by clone detection tool
File path: /jruby-1.4.0/src/org/jruby/compiler/ASTCompiler.java File path: /jruby-1.4.0/src/org/jruby/compiler/ASTCompiler19.java
Method name: void compileArgs(Node, BodyCompiler, boolean) Method name: void compileMethodArgs(Node, BodyCompiler, boolean)
Number of AST nodes: 22 Number of AST nodes: 21
1
final ArgsNode argsNode = (ArgsNode) node;
1
final ArgsNode argsNode = (ArgsNode) node;
2
        final int required = argsNode.getRequiredArgsCount();
2
        final int required = argsNode.getRequiredArgsCount();
3
        final int opt = argsNode.getOptionalArgsCount();
3
        final int opt = argsNode.getOptionalArgsCount();
4
        final int rest = argsNode.getRestArg();
4
        final int rest = argsNode.getRestArg();
5
        ArrayCallback requiredAssignment = null;
5
        ArrayCallback requiredAssignment = null;
6
        ArrayCallback optionalGiven = null;
6
        ArrayCallback optionalGiven = null;
7
        ArrayCallback optionalNotGiven = null;
7
        ArrayCallback optionalNotGiven = null;
8
        CompilerCallback restAssignment = null;
8
        CompilerCallback restAssignment = null;
9
        CompilerCallback blockAssignment = null;
9
        CompilerCallback blockAssignment = null;
10
        if (required > 0) {
10
        if (required > 0) {
11
            requiredAssignment = new ArrayCallback() {
11
            requiredAssignment = new ArrayCallback() {
12
                        public void nextValue(BodyCompiler context, Object object, int index) {
12
                public void nextValue(BodyCompiler context, Object object, int index) {
13
                            // FIXME: Somehow I'd feel better if this could get the appropriate var index from the ArgumentNode
13
                    // FIXME: Somehow I'd feel better if this could get the appropriate var index from the ArgumentNode
14
                            context.getVariableCompiler().assignLocalVariable(index, false);
14
                    context.getVariableCompiler().assignLocalVariable(index, false);
15
                        }
15
                
16
  
16
}
17
                  };
17
            };
18
        }
18
        }
19
        if (opt > 0) {
19
        if (opt > 0) {
20
            optionalGiven = new ArrayCallback() {
20
            optionalGiven = new ArrayCallback() {
21
                        public void nextValue(BodyCompiler context, Object object, int index) {
21
            public void nextValue(BodyCompiler context, Object object, int index) {
22
                            Node optArg = ((ListNode) object).get(index);
22
                    OptArgNode optArg = (OptArgNode)((ListNode) object).get(index);
23
                            compileAssignment(optArg, context,true);
23
                    compileAssignment(optArg
24
                            context.consumeCurrentValue();
24
.getValue(), context, false);
25
                        }
25
                
26
        
26
}
27
            };
27
            };
28
            optionalNotGiven = new ArrayCallback() {
28
            optionalNotGiven = new ArrayCallback() {
29
                        public void nextValue(BodyCompiler context, Object object, int index) {
29
                public void nextValue(BodyCompiler context, Object object, int index) {
30
                            Node optArg = ((ListNode) object).get(index);
30
                    OptArgNode optArg = (OptArgNode)((ListNode) object).get(index);
31
                            compile(optArg, context,true);
31
                    compile(optArg
32
                            context.consumeCurrentValue();
32
.getValue(), context, false);
33
                        }
33
                
34
    
34
}
35
                };
35
            };
36
        }
36
        }
37
        if (rest > -1) {
37
        if (rest > -1) {
38
            restAssignment = new CompilerCallback() {
38
            restAssignment = new CompilerCallback() {
39
                        public void call(BodyCompiler context) {
39
                public void call(BodyCompiler context) {
40
                            context.getVariableCompiler().assignLocalVariable(argsNode.getRestArg(), false);
40
                    context.getVariableCompiler().assignLocalVariable(argsNode.getRestArg(), false);
41
                        }
41
                
42
      
42
}
43
              };
43
            };
44
        }
44
        }
45
        if (argsNode.getBlock() != null) {
45
        if (argsNode.getBlock() != null) {
46
            blockAssignment = new CompilerCallback() {
46
            blockAssignment = new CompilerCallback() {
47
                        public void call(BodyCompiler context) {
47
                public void call(BodyCompiler context) {
48
                            context.getVariableCompiler().assignLocalVariable(argsNode.getBlock().getCount(), false);
48
                    context.getVariableCompiler().assignLocalVariable(argsNode.getBlock().getCount(), false);
49
                        }
49
                
50
        
50
}
51
            };
51
            };
52
        }
52
        }
53
        context.getVariableCompiler().checkMethodArity(required, opt, rest);
53
        context.getVariableCompiler().assignMethodAr
54
        context.getVariableCompiler().assignMethodArguments(
54
guments19(
55
                argsNode.getPre(),
56
                argsNode.getPreCount(),
57
                argsNode.getPost(),
55
argsNode.getPre(),
58
                argsNode.getPostCount(),
56
                argsNode.getRequiredArgsCount(),
59
                argsNode.getPostIndex(),
57
                argsNode.getOptArgs(),
60
                argsNode.getOptArgs(),
58
                argsNode.getOptionalArgsCount(),
61
                argsNode.getOptionalArgsCount(),
59
                requiredAssignment,
62
                requiredAssignment,
60
                optionalGiven,
63
                optionalGiven,
61
                optionalNotGiven,
64
                optionalNotGiven,
62
                restAssignment,
65
                restAssignment,
63
                blockAssignment);
66
                blockAssignment);
64
        // TODO: don't require pop
67
        // TODO: don't require pop
65
        if (!expr) context.consumeCurrentValue();
68
        if (!expr) context.consumeCurrentValue();
Summary
Number of common nesting structure subtrees1
Number of refactorable cases0
Number of non-refactorable cases1
Time elapsed for finding largest common nesting structure subtrees (ms)45.9
Clones locationClones are in different classes having the same super class
Number of node comparisons193
  1. {Non-refactorable}
    Mapping Summary
    Number of mapped statements19
    Number of unmapped statements in the first code fragment3
    Number of unmapped statements in the second code fragment2
    Time elapsed for statement mapping (ms)110.1
    Clone typeType 3
    Mapped Statements
    ID Statement ID Statement
    1
    final ArgsNode argsNode = (ArgsNode)node;
    1
    final ArgsNode argsNode = (ArgsNode)node;
    2
    final int required = argsNode.getRequiredArgsCount();
    2
    final int required = argsNode.getRequiredArgsCount();
    3
    final int opt = argsNode.getOptionalArgsCount();
    3
    final int opt = argsNode.getOptionalArgsCount();
    4
    final int rest = argsNode.getRestArg();
    4
    final int rest = argsNode.getRestArg();
    5
    ArrayCallback requiredAssignment = null;
    5
    ArrayCallback requiredAssignment = null;
    6
    ArrayCallback optionalGiven = null;
    6
    ArrayCallback optionalGiven = null;
    7
    ArrayCallback optionalNotGiven = null;
    7
    ArrayCallback optionalNotGiven = null;
    8
    CompilerCallback restAssignment = null;
    8
    CompilerCallback restAssignment = null;
    9
    CompilerCallback blockAssignment = null;
    9
    CompilerCallback blockAssignment = null;
    10
    if (required > 0)
    10
    if (required > 0)
    11
    requiredAssignment = new ArrayCallback() {...};
    11
    requiredAssignment = new ArrayCallback() {...};
    12
    if (opt > 0)
    12
    if (opt > 0)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
    13
    optionalGiven = new ArrayCallback() {...};
    Preondition Violations
    Unmatched statement optionalGiven=new ArrayCallback(){ public void nextValue( BodyCompiler context, Object object, int index){ OptArgNode optArg=(OptArgNode)((ListNode)object).get(index); compileAssignment(optArg.getValue(),context,false); } } ; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    13
    optionalGiven = new ArrayCallback() {...};
    13
    optionalGiven = new ArrayCallback() {...};
    13
    optionalGiven = new ArrayCallback() {...};
    Preondition Violations
    Unmatched statement optionalGiven=new ArrayCallback(){ public void nextValue( BodyCompiler context, Object object, int index){ Node optArg=((ListNode)object).get(index); compileAssignment(optArg,context,true); context.consumeCurrentValue(); } } ; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
    14
    optionalNotGiven = new ArrayCallback() {...};
    Preondition Violations
    Unmatched statement optionalNotGiven=new ArrayCallback(){ public void nextValue( BodyCompiler context, Object object, int index){ OptArgNode optArg=(OptArgNode)((ListNode)object).get(index); compile(optArg.getValue(),context,false); } } ; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    14
    optionalNotGiven = new ArrayCallback() {...};
    14
    optionalNotGiven = new ArrayCallback() {...};
    14
    optionalNotGiven = new ArrayCallback() {...};
    Preondition Violations
    Unmatched statement optionalNotGiven=new ArrayCallback(){ public void nextValue( BodyCompiler context, Object object, int index){ Node optArg=((ListNode)object).get(index); compile(optArg,context,true); context.consumeCurrentValue(); } } ; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    15
    if (rest > -1)
    15
    if (rest > -1)
    16
    restAssignment = new CompilerCallback() {...};
    16
    restAssignment = new CompilerCallback() {...};
    17
    if (argsNode.getBlock() != null)
    17
    if (argsNode.getBlock() != null)
    18
    blockAssignment = new CompilerCallback() {...};
    18
    blockAssignment = new CompilerCallback() {...};
    19
    context.getVariableCompiler().checkMethodArity(required, opt, rest);
                                                                                                                                                
    20
    context.getVariableCompiler().assignMethodArguments(argsNode.getPre(), argsNode.getRequiredArgsCount(), argsNode.getOptArgs(), argsNode.getOptionalArgsCount(), requiredAssignment, optionalGiven, optionalNotGiven, restAssignment, blockAssignment);
    20
    context.getVariableCompiler().assignMethodArguments(argsNode.getPre(), argsNode.getRequiredArgsCount(), argsNode.getOptArgs(), argsNode.getOptionalArgsCount(), requiredAssignment, optionalGiven, optionalNotGiven, restAssignment, blockAssignment);
    19
    context.getVariableCompiler().assignMethodArguments19(argsNode.getPre(), argsNode.getPreCount(), argsNode.getPost(), argsNode.getPostCount(), argsNode.getPostIndex(), argsNode.getOptArgs(), argsNode.getOptionalArgsCount(), requiredAssignment, optionalGiven, optionalNotGiven, restAssignment, blockAssignment);
    Differences
    Expression1Expression2Difference
    assignMethodArgumentsassignMethodArguments19METHOD_INVOCATION_NAME_MISMATCH
    context.getVariableCompiler().assignMethodArguments(argsNode.getPre(),argsNode.getRequiredArgsCount(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment)context.getVariableCompiler().assignMethodArguments19(argsNode.getPre(),argsNode.getPreCount(),argsNode.getPost(),argsNode.getPostCount(),argsNode.getPostIndex(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment)ARGUMENT_NUMBER_MISMATCH
    Preondition Violations
    Expression context.getVariableCompiler().assignMethodArguments(argsNode.getPre(),argsNode.getRequiredArgsCount(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression context.getVariableCompiler().assignMethodArguments19(argsNode.getPre(),argsNode.getPreCount(),argsNode.getPost(),argsNode.getPostCount(),argsNode.getPostIndex(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression context.getVariableCompiler().assignMethodArguments(argsNode.getPre(),argsNode.getRequiredArgsCount(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) is a void method call, and thus it cannot be parameterized
    Expression context.getVariableCompiler().assignMethodArguments19(argsNode.getPre(),argsNode.getPreCount(),argsNode.getPost(),argsNode.getPostCount(),argsNode.getPostIndex(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) is a void method call, and thus it cannot be parameterized
    Expression context.getVariableCompiler().assignMethodArguments(argsNode.getPre(),argsNode.getRequiredArgsCount(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression context.getVariableCompiler().assignMethodArguments19(argsNode.getPre(),argsNode.getPreCount(),argsNode.getPost(),argsNode.getPostCount(),argsNode.getPostIndex(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    Expression context.getVariableCompiler().assignMethodArguments(argsNode.getPre(),argsNode.getRequiredArgsCount(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) is a void method call, and thus it cannot be parameterized
    Expression context.getVariableCompiler().assignMethodArguments19(argsNode.getPre(),argsNode.getPreCount(),argsNode.getPost(),argsNode.getPostCount(),argsNode.getPostIndex(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) is a void method call, and thus it cannot be parameterized
    19
    context.getVariableCompiler().assignMethodArguments19(argsNode.getPre(), argsNode.getPreCount(), argsNode.getPost(), argsNode.getPostCount(), argsNode.getPostIndex(), argsNode.getOptArgs(), argsNode.getOptionalArgsCount(), requiredAssignment, optionalGiven, optionalNotGiven, restAssignment, blockAssignment);
    21
    if (!expr)
    20
    if (!expr)
    22
    context.consumeCurrentValue();
    21
    context.consumeCurrentValue();
    Precondition Violations (13)
    Row Violation
    1Unmatched statement optionalGiven=new ArrayCallback(){ public void nextValue( BodyCompiler context, Object object, int index){ OptArgNode optArg=(OptArgNode)((ListNode)object).get(index); compileAssignment(optArg.getValue(),context,false); } } ; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    2Unmatched statement optionalGiven=new ArrayCallback(){ public void nextValue( BodyCompiler context, Object object, int index){ Node optArg=((ListNode)object).get(index); compileAssignment(optArg,context,true); context.consumeCurrentValue(); } } ; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    3Unmatched statement optionalNotGiven=new ArrayCallback(){ public void nextValue( BodyCompiler context, Object object, int index){ OptArgNode optArg=(OptArgNode)((ListNode)object).get(index); compile(optArg.getValue(),context,false); } } ; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    4Unmatched statement optionalNotGiven=new ArrayCallback(){ public void nextValue( BodyCompiler context, Object object, int index){ Node optArg=((ListNode)object).get(index); compile(optArg,context,true); context.consumeCurrentValue(); } } ; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
    5Expression context.getVariableCompiler().assignMethodArguments(argsNode.getPre(),argsNode.getRequiredArgsCount(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    6Expression context.getVariableCompiler().assignMethodArguments19(argsNode.getPre(),argsNode.getPreCount(),argsNode.getPost(),argsNode.getPostCount(),argsNode.getPostIndex(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    7Expression context.getVariableCompiler().assignMethodArguments(argsNode.getPre(),argsNode.getRequiredArgsCount(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) is a void method call, and thus it cannot be parameterized
    8Expression context.getVariableCompiler().assignMethodArguments19(argsNode.getPre(),argsNode.getPreCount(),argsNode.getPost(),argsNode.getPostCount(),argsNode.getPostIndex(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) is a void method call, and thus it cannot be parameterized
    9Expression context.getVariableCompiler().assignMethodArguments(argsNode.getPre(),argsNode.getRequiredArgsCount(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    10Expression context.getVariableCompiler().assignMethodArguments19(argsNode.getPre(),argsNode.getPreCount(),argsNode.getPost(),argsNode.getPostCount(),argsNode.getPostIndex(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) cannot be parameterized, because it has dependencies to/from statements that will be extracted
    11Expression context.getVariableCompiler().assignMethodArguments(argsNode.getPre(),argsNode.getRequiredArgsCount(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) is a void method call, and thus it cannot be parameterized
    12Expression context.getVariableCompiler().assignMethodArguments19(argsNode.getPre(),argsNode.getPreCount(),argsNode.getPost(),argsNode.getPostCount(),argsNode.getPostIndex(),argsNode.getOptArgs(),argsNode.getOptionalArgsCount(),requiredAssignment,optionalGiven,optionalNotGiven,restAssignment,blockAssignment) is a void method call, and thus it cannot be parameterized
    13Clone fragment #1 returns variables optionalGiven, optionalNotGiven, required, opt, rest , while Clone fragment #2 returns variables optionalGiven, optionalNotGiven