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;
24 // the reason for errorInjectionInit is that some code (like static initializers
25 // in the compiled program) actually run before the GENERATED MAIN runs! Not the
26 // complied program's main, either! So just rig it so no error injection code runs
27 // until we're sure the random seed is initialized.
29 public void additionalCodeGen( PrintWriter outmethodheader,
30 PrintWriter outstructs,
31 PrintWriter outmethod ) {
32 outmethodheader.println("extern int "+nStr+";");
33 outmethodheader.println("extern int "+errorInjectedStr+";");
34 outmethodheader.println("extern int errorInjectionInit;");
36 outmethod.println("int "+nStr+" = "+state.SSJAVA_INV_ERROR_PROB+";");
37 outmethod.println("int "+errorInjectedStr+" = 0;");
38 outmethod.println("int errorInjectionInit = 0;");
41 public void additionalCodeAtTopOfMain( PrintWriter outmethod ) {
42 outmethod.println(" srand("+state.SSJAVA_ERROR_SEED+");");
43 outmethod.println(" errorInjectionInit = 1;");
46 public void additionalCodePostNode( FlatMethod fm, FlatNode fn, PrintWriter output ) {
48 TempDescriptor injectTarget = null;
51 case FKind.FlatOpNode:
52 FlatOpNode fon = (FlatOpNode) fn;
53 if( fon.getOp().getOp() == Operation.DIV ) {
54 injectTarget = fon.getDest();
58 case FKind.FlatFieldNode:
59 injectTarget = ((FlatFieldNode) fn).getDst();
62 case FKind.FlatElementNode:
63 injectTarget = ((FlatElementNode) fn).getDst();
67 if( injectTarget != null ) {
68 output.println("if( errorInjectionInit ) {");
69 output.println(" int roll = rand() % "+nStr+";");
70 output.println(" if( !"+errorInjectedStr+" && roll == 0 ) {" );
71 output.println(" "+errorInjectedStr+" = 1;" );
72 output.println(" "+buildCode.generateTemp( fm, injectTarget )+" = 0;" );
73 output.println(" printf(\"SSJAVA: Injecting error ["+injectTarget+
74 "=%d] at file:%s, func:%s, line:%d \\n\"" +
75 ", 0, __FILE__, __func__, __LINE__);");
76 output.println(" }" );
83 public void additionalIncludesMethodsImplementation( PrintWriter outmethod ){}
84 public void printExtraArrayFields(PrintWriter outclassdefs){}
85 public void outputTransCode(PrintWriter output){}
86 public void buildCodeSetup(){}
87 public void generateSizeArrayExtensions(PrintWriter outclassdefs){}
88 public void preCodeGenInitialization(){}
89 public void postCodeGenCleanUp(){}
90 public void additionalIncludesMethodsHeader(PrintWriter outmethodheader){}
91 public void additionalIncludesStructsHeader(PrintWriter outstructs){}
92 public void additionalClassObjectFields(PrintWriter outclassdefs){}
93 public void additionalCodeForCommandLineArgs(PrintWriter outmethod, String argsVar){}
94 public void additionalCodeAtBottomOfMain(PrintWriter outmethod){}
95 public void additionalCodeAtTopMethodsImplementation(PrintWriter outmethod){}
96 public void additionalCodeAtTopFlatMethodBody(PrintWriter output, FlatMethod fm){}
97 public void additionalCodePreNode(FlatMethod fm, FlatNode fn, PrintWriter output){}
98 public void additionalCodeNewObject(PrintWriter outmethod, String dstVar, FlatNew flatNew){}
99 public void additionalCodeNewStringLiteral(PrintWriter output, String dstVar){}