+/* method phase#ToolContext#init for (self: Object) */
+void VIRTUAL_phase__ToolContext__init(val* self) {
+phase__ToolContext__init(self); /* Direct call phase#ToolContext#init on <self:Object(ToolContext)>*/
+RET_LABEL:;
+}
+/* method phase#ToolContext#process_options for (self: ToolContext, Sequence[String]) */
+void phase__ToolContext__process_options(val* self, val* p0) {
+val* var_args /* var args: Sequence[String] */;
+val* var /* : OptionArray */;
+val* var2 /* : OptionArray */;
+val* var3 /* : nullable Object */;
+val* var5 /* : nullable Object */;
+val* var6 /* : ArrayIterator[nullable Object] */;
+short int var7 /* : Bool */;
+val* var8 /* : nullable Object */;
+val* var_v /* var v: String */;
+static val* varonce;
+val* var9 /* : String */;
+char* var10 /* : NativeString */;
+long var11 /* : Int */;
+val* var12 /* : FlatString */;
+short int var13 /* : Bool */;
+short int var14 /* : Bool */;
+val* var15 /* : Sequence[Phase] */;
+val* var16 /* : Iterator[nullable Object] */;
+short int var17 /* : Bool */;
+val* var18 /* : nullable Object */;
+val* var_p /* var p: Phase */;
+val* var19 /* : POSetElement[Phase] */;
+val* var21 /* : POSetElement[Phase] */;
+val* var22 /* : Collection[Object] */;
+val* var_deps /* var deps: Collection[Phase] */;
+short int var23 /* : Bool */;
+static val* varonce24;
+val* var25 /* : String */;
+char* var26 /* : NativeString */;
+long var27 /* : Int */;
+val* var28 /* : FlatString */;
+static val* varonce29;
+val* var30 /* : String */;
+char* var31 /* : NativeString */;
+long var32 /* : Int */;
+val* var33 /* : FlatString */;
+val* var34 /* : String */;
+static val* varonce35;
+val* var36 /* : String */;
+char* var37 /* : NativeString */;
+long var38 /* : Int */;
+val* var39 /* : FlatString */;
+val* var40 /* : Array[Object] */;
+long var41 /* : Int */;
+val* var42 /* : NativeArray[Object] */;
+val* var43 /* : String */;
+long var44 /* : Int */;
+short int var46 /* : Bool */;
+short int var_found /* var found: Bool */;
+val* var47 /* : POSet[Phase] */;
+val* var49 /* : POSet[Phase] */;
+val* var50 /* : Iterator[Object] */;
+short int var51 /* : Bool */;
+val* var52 /* : nullable Object */;
+val* var_p53 /* var p: Phase */;
+val* var54 /* : String */;
+short int var55 /* : Bool */;
+short int var56 /* : Bool */;
+val* var_other /* var other: nullable Object */;
+short int var58 /* : Bool */;
+short int var59 /* : Bool */;
+short int var60 /* : Bool */;
+short int var62 /* : Bool */;
+short int var63 /* : Bool */;
+short int var65 /* : Bool */;
+val* var66 /* : null */;
+static val* varonce67;
+val* var68 /* : String */;
+char* var69 /* : NativeString */;
+long var70 /* : Int */;
+val* var71 /* : FlatString */;
+static val* varonce72;
+val* var73 /* : String */;
+char* var74 /* : NativeString */;
+long var75 /* : Int */;
+val* var76 /* : FlatString */;
+val* var77 /* : Array[Object] */;
+long var78 /* : Int */;
+val* var79 /* : NativeArray[Object] */;
+val* var80 /* : String */;
+var_args = p0;
+{
+((void (*)(val*, val*))(self->class->vft[COLOR_phase__ToolContext__process_options]))(self, p0) /* process_options on <self:ToolContext>*/;
+}
+{
+{ /* Inline phase#ToolContext#opt_disable_phase (self) on <self:ToolContext> */
+var2 = self->attrs[COLOR_phase__ToolContext___opt_disable_phase].val; /* _opt_disable_phase on <self:ToolContext> */
+if (unlikely(var2 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _opt_disable_phase");
+PRINT_ERROR(" (%s:%d)\n", "src/phase.nit", 30);
+show_backtrace(1);
+}
+var = var2;
+RET_LABEL1:(void)0;
+}
+}
+{
+{ /* Inline opts#Option#value (var) on <var:OptionArray> */
+var5 = var->attrs[COLOR_opts__Option___value].val; /* _value on <var:OptionArray> */
+var3 = var5;
+RET_LABEL4:(void)0;
+}
+}
+{
+var6 = array__AbstractArrayRead__iterator(var3);
+}
+for(;;) {
+{
+var7 = array__ArrayIterator__is_ok(var6);
+}
+if(!var7) break;
+{
+var8 = array__ArrayIterator__item(var6);
+}
+var_v = var8;
+if (varonce) {
+var9 = varonce;
+} else {
+var10 = "list";
+var11 = 4;
+var12 = string__NativeString__to_s_with_length(var10, var11);
+var9 = var12;
+varonce = var9;
+}
+{
+var14 = string__FlatString___61d_61d(var_v, var9);
+var13 = var14;
+}
+if (var13){
+{
+var15 = phase__ToolContext__phases_list(self);
+}
+{
+var16 = ((val* (*)(val*))(var15->class->vft[COLOR_abstract_collection__Collection__iterator]))(var15) /* iterator on <var15:Sequence[Phase]>*/;
+}
+for(;;) {
+{
+var17 = ((short int (*)(val*))(var16->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var16) /* is_ok on <var16:Iterator[nullable Object]>*/;
+}
+if(!var17) break;
+{
+var18 = ((val* (*)(val*))(var16->class->vft[COLOR_abstract_collection__Iterator__item]))(var16) /* item on <var16:Iterator[nullable Object]>*/;
+}
+var_p = var18;
+{
+{ /* Inline phase#Phase#in_hierarchy (var_p) on <var_p:Phase> */
+var21 = var_p->attrs[COLOR_phase__Phase___in_hierarchy].val; /* _in_hierarchy on <var_p:Phase> */
+if (unlikely(var21 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _in_hierarchy");
+PRINT_ERROR(" (%s:%d)\n", "src/phase.nit", 148);
+show_backtrace(1);
+}
+var19 = var21;
+RET_LABEL20:(void)0;
+}
+}
+{
+var22 = poset__POSetElement__direct_greaters(var19);
+}
+var_deps = var22;
+{
+var23 = ((short int (*)(val*))(var_deps->class->vft[COLOR_abstract_collection__Collection__is_empty]))(var_deps) /* is_empty on <var_deps:Collection[Phase]>*/;
+}
+if (var23){
+{
+file__Object__print(self, var_p); /* Direct call file#Object#print on <self:ToolContext>*/
+}
+} else {
+if (varonce24) {
+var25 = varonce24;
+} else {
+var26 = " (dep: ";
+var27 = 7;
+var28 = string__NativeString__to_s_with_length(var26, var27);
+var25 = var28;
+varonce24 = var25;
+}
+if (varonce29) {
+var30 = varonce29;
+} else {
+var31 = ", ";
+var32 = 2;
+var33 = string__NativeString__to_s_with_length(var31, var32);
+var30 = var33;
+varonce29 = var30;
+}
+{
+var34 = string__Collection__join(var_deps, var30);
+}
+if (varonce35) {
+var36 = varonce35;
+} else {
+var37 = ")";
+var38 = 1;
+var39 = string__NativeString__to_s_with_length(var37, var38);
+var36 = var39;
+varonce35 = var36;
+}
+var40 = NEW_array__Array(&type_array__Arraykernel__Object);
+{ /* var40 = array_instance Array[Object] */
+var41 = 4;
+var42 = NEW_array__NativeArray(var41, &type_array__NativeArraykernel__Object);
+((struct instance_array__NativeArray*)var42)->values[0] = (val*) var_p;
+((struct instance_array__NativeArray*)var42)->values[1] = (val*) var25;
+((struct instance_array__NativeArray*)var42)->values[2] = (val*) var34;
+((struct instance_array__NativeArray*)var42)->values[3] = (val*) var36;
+{
+((void (*)(val*, val*, long))(var40->class->vft[COLOR_array__Array__with_native]))(var40, var42, var41) /* with_native on <var40:Array[Object]>*/;
+}
+}
+{
+var43 = ((val* (*)(val*))(var40->class->vft[COLOR_string__Object__to_s]))(var40) /* to_s on <var40:Array[Object]>*/;
+}
+{
+file__Object__print(self, var43); /* Direct call file#Object#print on <self:ToolContext>*/
+}
+}
+CONTINUE_label: (void)0;
+{
+((void (*)(val*))(var16->class->vft[COLOR_abstract_collection__Iterator__next]))(var16) /* next on <var16:Iterator[nullable Object]>*/;
+}
+}
+BREAK_label: (void)0;
+var44 = 0;
+{
+{ /* Inline kernel#Object#exit (self,var44) on <self:ToolContext> */
+exit(var44);
+RET_LABEL45:(void)0;
+}
+}
+} else {
+}
+var46 = 0;
+var_found = var46;
+{
+{ /* Inline phase#ToolContext#phases (self) on <self:ToolContext> */
+var49 = self->attrs[COLOR_phase__ToolContext___phases].val; /* _phases on <self:ToolContext> */
+if (unlikely(var49 == NULL)) {
+PRINT_ERROR("Runtime error: %s", "Uninitialized attribute _phases");
+PRINT_ERROR(" (%s:%d)\n", "src/phase.nit", 23);
+show_backtrace(1);
+}
+var47 = var49;
+RET_LABEL48:(void)0;
+}
+}
+{
+var50 = poset__POSet__iterator(var47);
+}
+for(;;) {
+{
+var51 = ((short int (*)(val*))(var50->class->vft[COLOR_abstract_collection__Iterator__is_ok]))(var50) /* is_ok on <var50:Iterator[Object]>*/;
+}
+if(!var51) break;
+{
+var52 = ((val* (*)(val*))(var50->class->vft[COLOR_abstract_collection__Iterator__item]))(var50) /* item on <var50:Iterator[Object]>*/;
+}
+var_p53 = var52;
+{
+var54 = phase__Phase__to_s(var_p53);
+}
+{
+{ /* Inline kernel#Object#!= (var_v,var54) on <var_v:String> */
+var_other = var54;
+{
+var59 = ((short int (*)(val*, val*))(var_v->class->vft[COLOR_kernel__Object___61d_61d]))(var_v, var_other) /* == on <var_v:String>*/;
+var58 = var59;
+}
+var60 = !var58;
+var56 = var60;
+goto RET_LABEL57;
+RET_LABEL57:(void)0;
+}
+var55 = var56;
+}
+if (var55){
+goto CONTINUE_label61;
+} else {
+}
+var62 = 1;
+var_found = var62;
+var63 = 1;
+{
+{ /* Inline phase#Phase#disabled= (var_p53,var63) on <var_p53:Phase> */
+var_p53->attrs[COLOR_phase__Phase___disabled].s = var63; /* _disabled on <var_p53:Phase> */
+RET_LABEL64:(void)0;
+}
+}
+CONTINUE_label61: (void)0;
+{
+((void (*)(val*))(var50->class->vft[COLOR_abstract_collection__Iterator__next]))(var50) /* next on <var50:Iterator[Object]>*/;
+}
+}
+BREAK_label61: (void)0;
+var65 = !var_found;
+if (var65){
+var66 = NULL;
+if (varonce67) {
+var68 = varonce67;
+} else {
+var69 = "Error: no phase named `";
+var70 = 23;
+var71 = string__NativeString__to_s_with_length(var69, var70);
+var68 = var71;
+varonce67 = var68;
+}
+if (varonce72) {
+var73 = varonce72;
+} else {
+var74 = "`. Use `list` to list all phases.";
+var75 = 33;
+var76 = string__NativeString__to_s_with_length(var74, var75);
+var73 = var76;
+varonce72 = var73;
+}
+var77 = NEW_array__Array(&type_array__Arraykernel__Object);
+{ /* var77 = array_instance Array[Object] */
+var78 = 3;
+var79 = NEW_array__NativeArray(var78, &type_array__NativeArraykernel__Object);
+((struct instance_array__NativeArray*)var79)->values[0] = (val*) var68;
+((struct instance_array__NativeArray*)var79)->values[1] = (val*) var_v;
+((struct instance_array__NativeArray*)var79)->values[2] = (val*) var73;
+{
+((void (*)(val*, val*, long))(var77->class->vft[COLOR_array__Array__with_native]))(var77, var79, var78) /* with_native on <var77:Array[Object]>*/;
+}
+}
+{
+var80 = ((val* (*)(val*))(var77->class->vft[COLOR_string__Object__to_s]))(var77) /* to_s on <var77:Array[Object]>*/;
+}
+{
+toolcontext__ToolContext__fatal_error(self, var66, var80); /* Direct call toolcontext#ToolContext#fatal_error on <self:ToolContext>*/
+}
+} else {
+}
+CONTINUE_label81: (void)0;
+{
+array__ArrayIterator__next(var6); /* Direct call array#ArrayIterator#next on <var6:ArrayIterator[nullable Object]>*/
+}
+}
+BREAK_label81: (void)0;
+RET_LABEL:;
+}
+/* method phase#ToolContext#process_options for (self: Object, Sequence[String]) */
+void VIRTUAL_phase__ToolContext__process_options(val* self, val* p0) {
+phase__ToolContext__process_options(self, p0); /* Direct call phase#ToolContext#process_options on <self:Object(ToolContext)>*/