if (optArgsCount > 0) { // prepare labels for opt logic Label doneWithOpt = new Label(); Label[] optLabels = new Label[optArgsCount]; for (int i = 0; i < optLabels.length; i ++) optLabels[i] = new Label(); // next, iterate over all optional args, until no more arguments for (int optArgElement = 0; optArgElement < optArgsCount; currentArgElement++, optArgElement++) { method.aload(argsIndex); method.pushInt(currentArgElement); // index for the item methodCompiler.invokeUtilityMethod("elementOrNull", sig(IRubyObject.class, IRubyObject[].class, int.class)); method.dup(); method.ifnull(optLabels[optArgElement]); optGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement); } method.go_to(doneWithOpt); // now logic for each optional value for (int optArgElement = 0; optArgElement < optArgsCount; optArgElement++) { // otherwise no items left available, use the code for default method.label(optLabels[optArgElement]); optNotGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement); } // pop extra failed value from first cycle and we're done method.pop(); method.label(doneWithOpt); }
if (optArgsCount > 0) { // prepare labels for opt logic Label doneWithOpt = new Label(); Label[] optLabels = new Label[optArgsCount]; for (int i = 0; i < optLabels.length; i ++) optLabels[i] = new Label(); // next, iterate over all optional args, until no more arguments for (int optArgElement = 0; optArgElement < optArgsCount; currentArgElement++, optArgElement++) { method.aload(argsIndex); method.pushInt(currentArgElement); // index for the item methodCompiler.invokeUtilityMethod("elementOrNull", sig(IRubyObject.class, IRubyObject[].class, int.class)); method.dup(); method.ifnull(optLabels[optArgElement]); optGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement); } method.go_to(doneWithOpt); // now logic for each optional value for (int optArgElement = 0; optArgElement < optArgsCount; optArgElement++) { // otherwise no items left available, use the code for default method.label(optLabels[optArgElement]); optNotGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement); } // pop extra failed value from first cycle and we're done method.pop(); method.label(doneWithOpt); }
Clone fragments detected by clone detection tool
File path: /jruby-1.4.0/src/org/jruby/compiler/impl/AbstractVariableCompiler.java File path: /jruby-1.4.0/src/org/jruby/compiler/impl/AbstractVariableCompiler.java
Method name: void assignMethodArguments(Object, int, Object, int, ArrayCallback, ArrayCallback, ArrayCallback, CompilerCallback, CompilerCallback) Method name: void assignMethodArguments19(Object, int, Object, int, int, Object, int, ArrayCallback, ArrayCallback, ArrayCallback, CompilerCallback, CompilerCallback)
Number of AST nodes: 18 Number of AST nodes: 18
1
if (optArgsCount > 0) {
1
if (optArgsCount > 0) {
2
                    // prepare labels for opt logic
2
                    // prepare labels for opt logic
3
                    Label doneWithOpt = new Label();
3
                    Label doneWithOpt = new Label();
4
                    Label[] optLabels = new Label[optArgsCount];
4
                    Label[] optLabels = new Label[optArgsCount];
5
                    for (int i = 0; i < optLabels.length; i ++) optLabels[i] = new Label();
5
                    for (int i = 0; i < optLabels.length; i ++) optLabels[i] = new Label();
6
                    // next, iterate over all optional args, until no more arguments
6
                    // next, iterate over all optional args, until no more arguments
7
                    for (int optArgElement = 0; optArgElement < optArgsCount; currentArgElement++, optArgElement++) {
7
                    for (int optArgElement = 0; optArgElement < optArgsCount; currentArgElement++, optArgElement++) {
8
                        method.aload(argsIndex);
8
                        method.aload(argsIndex);
9
                        method.pushInt(currentArgElement); // index for the item
9
                        method.pushInt(currentArgElement); // index for the item
10
                        methodCompiler.invokeUtilityMethod("elementOrNull", sig(IRubyObject.class, IRubyObject[].class, int.class));
10
                        methodCompiler.invokeUtilityMethod("elementOrNull", sig(IRubyObject.class, IRubyObject[].class, int.class));
11
                        method.dup();
11
                        method.dup();
12
                        method.ifnull(optLabels[optArgElement]);
12
                        method.ifnull(optLabels[optArgElement]);
13
                        optGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement);
13
                        optGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement);
14
                    }
14
                    }
15
                    method.go_to(doneWithOpt);
15
                    method.go_to(doneWithOpt);
16
                    // now logic for each optional value
16
                    // now logic for each optional value
17
                    for (int optArgElement = 0; optArgElement < optArgsCount; optArgElement++) {
17
                    for (int optArgElement = 0; optArgElement < optArgsCount; optArgElement++) {
18
                        // otherwise no items left available, use the code for default
18
                        // otherwise no items left available, use the code for default
19
                        method.label(optLabels[optArgElement]);
19
                        method.label(optLabels[optArgElement]);
20
                        optNotGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement);
20
                        optNotGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement);
21
                    }
21
                    }
22
                    // pop extra failed value from first cycle and we're done
22
                    // pop extra failed value from first cycle and we're done
23
                    method.pop();
23
                    method.pop();
24
                    method.label(doneWithOpt);
24
                    method.label(doneWithOpt);
25
                }
25
                }
Summary
Number of common nesting structure subtrees1
Number of refactorable cases1
Number of non-refactorable cases0
Time elapsed for finding largest common nesting structure subtrees (ms)1.4
Clones locationClones are declared in the same class
Number of node comparisons143
  1. {Refactorable}
    Mapping Summary
    Number of mapped statements18
    Number of unmapped statements in the first code fragment0
    Number of unmapped statements in the second code fragment0
    Time elapsed for statement mapping (ms)8.9
    Clone typeType 1
    Mapped Statements
    ID Statement ID Statement
    13
    if (optArgsCount > 0)
    14
    if (optArgsCount > 0)
    14
    Label doneWithOpt = new Label();
    15
    Label doneWithOpt = new Label();
    15
    Label[] optLabels = new Label[optArgsCount];
    16
    Label[] optLabels = new Label[optArgsCount];
    16
    for (int i = 0; i < optLabels.length; i++)
    17
    for (int i = 0; i < optLabels.length; i++)
    17
    optLabels[i] = new Label();
    18
    optLabels[i] = new Label();
    18
    for (int optArgElement = 0; optArgElement < optArgsCount; currentArgElement++, optArgElement++)
    19
    for (int optArgElement = 0; optArgElement < optArgsCount; currentArgElement++, optArgElement++)
    19
    method.aload(argsIndex);
    20
    method.aload(argsIndex);
    20
    method.pushInt(currentArgElement);
    21
    method.pushInt(currentArgElement);
    21
    methodCompiler.invokeUtilityMethod("elementOrNull", sig(IRubyObject.class, IRubyObject[].class, int.class));
    22
    methodCompiler.invokeUtilityMethod("elementOrNull", sig(IRubyObject.class, IRubyObject[].class, int.class));
    22
    method.dup();
    23
    method.dup();
    23
    method.ifnull(optLabels[optArgElement]);
    24
    method.ifnull(optLabels[optArgElement]);
    24
    optGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement);
    25
    optGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement);
    25
    method.go_to(doneWithOpt);
    26
    method.go_to(doneWithOpt);
    26
    for (int optArgElement = 0; optArgElement < optArgsCount; optArgElement++)
    27
    for (int optArgElement = 0; optArgElement < optArgsCount; optArgElement++)
    27
    method.label(optLabels[optArgElement]);
    28
    method.label(optLabels[optArgElement]);
    28
    optNotGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement);
    29
    optNotGivenAssignment.nextValue(methodCompiler, optArgs, optArgElement);
    29
    method.pop();
    30
    method.pop();
    30
    method.label(doneWithOpt);
    31
    method.label(doneWithOpt);
    Precondition Violations (0)
    Row Violation