11 public class BCXSSJavaInjectError implements BuildCodeExtension {
14 private BuildCode buildCode;
15 private String nStr = "__ssjava_inv_error_prob__";
16 private String errorInjectedStr = "__ssjava_error_has_been_injected__";
18 public BCXSSJavaInjectError( State state, BuildCode buildCode ) {
20 this.buildCode = buildCode;
23 public void additionalIncludesMethodsImplementation( PrintWriter outmethod ) {
24 outmethod.println("#include <stdlib.h>");
25 outmethod.println("#include <stdio.h>");
28 // the reason for errorInjectionInit is that some code (like static initializers
29 // in the compiled program) actually run before the GENERATED MAIN runs! Not the
30 // complied program's main, either! So just rig it so no error injection code runs
31 // until we're sure the random seed is initialized.
33 public void additionalCodeGen( PrintWriter outmethodheader,
34 PrintWriter outstructs,
35 PrintWriter outmethod ) {
36 outmethodheader.println("extern int "+nStr+";");
37 outmethodheader.println("extern int "+errorInjectedStr+";");
38 outmethodheader.println("extern int errorInjectionInit;");
40 outmethod.println("int "+nStr+" = "+state.SSJAVA_INV_ERROR_PROB+";");
41 outmethod.println("int "+errorInjectedStr+" = 0;");
42 outmethod.println("int errorInjectionInit = 0;");
45 public void additionalCodeAtTopOfMain( PrintWriter outmethod ) {
46 outmethod.println(" srand("+state.SSJAVA_ERROR_SEED+");");
47 outmethod.println(" errorInjectionInit = 1;");
50 public void additionalCodePostNode( FlatMethod fm, FlatNode fn, PrintWriter output ) {
52 TempDescriptor injectTarget = null;
55 case FKind.FlatOpNode:
56 FlatOpNode fon = (FlatOpNode) fn;
57 if( fon.getOp().getOp() == Operation.DIV ) {
58 injectTarget = fon.getDest();
62 case FKind.FlatFieldNode:
63 injectTarget = ((FlatFieldNode) fn).getDst();
66 case FKind.FlatElementNode:
67 injectTarget = ((FlatElementNode) fn).getDst();
71 if( injectTarget != null ) {
72 output.println("if( errorInjectionInit ) {");
73 output.println(" int roll = rand() % "+nStr+";");
74 output.println(" if( !"+errorInjectedStr+" && roll == 0 ) {" );
75 output.println(" "+errorInjectedStr+" = 1;" );
76 output.println(" "+buildCode.generateTemp( fm, injectTarget )+" = 0;" );
77 output.println(" printf(\"SSJAVA: Injecting error ["+injectTarget+
78 "=%d] at file:%s, func:%s, line:%d \\n\"" +
79 ", 0, __FILE__, __func__, __LINE__);");
80 output.println(" }" );
87 public void printExtraArrayFields(PrintWriter outclassdefs){}
88 public void outputTransCode(PrintWriter output){}
89 public void buildCodeSetup(){}
90 public void generateSizeArrayExtensions(PrintWriter outclassdefs){}
91 public void preCodeGenInitialization(){}
92 public void postCodeGenCleanUp(){}
93 public void additionalIncludesMethodsHeader(PrintWriter outmethodheader){}
94 public void additionalIncludesStructsHeader(PrintWriter outstructs){}
95 public void additionalClassObjectFields(PrintWriter outclassdefs){}
96 public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar){}
97 public void additionalCodeAtBottomOfMain(PrintWriter outmethod){}
98 public void additionalCodeAtTopMethodsImplementation(PrintWriter outmethod){}
99 public void additionalCodeAtTopFlatMethodBody(PrintWriter output, FlatMethod fm){}
100 public void additionalCodePreNode(FlatMethod fm, FlatNode fn, PrintWriter output){}
101 public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew){}
102 public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar){}