@@ -39,6 +39,18 @@ public static ILGenerator EmitStageField(this ILGenerator gen, VeinField field)
39
39
5 => gen . Emit ( OpCodes . LDARG_5 ) ,
40
40
_ => gen . Emit ( OpCodes . LDARG_S , i )
41
41
} ;
42
+
43
+ public static ILGenerator EmitStageLocal ( this ILGenerator gen , int i ) => i switch
44
+ {
45
+ 0 => gen . Emit ( OpCodes . STLOC_0 ) ,
46
+ 1 => gen . Emit ( OpCodes . STLOC_1 ) ,
47
+ 2 => gen . Emit ( OpCodes . STLOC_2 ) ,
48
+ 3 => gen . Emit ( OpCodes . STLOC_3 ) ,
49
+ 4 => gen . Emit ( OpCodes . STLOC_4 ) ,
50
+ 5 => gen . Emit ( OpCodes . STLOC_5 ) ,
51
+ _ => gen . Emit ( OpCodes . STLOC_S , i )
52
+ } ;
53
+
42
54
public static ILGenerator EmitLoadIdentifierReference ( this ILGenerator gen , IdentifierExpression id )
43
55
{
44
56
var context = gen . ConsumeFromMetadata < GeneratorContext > ( "context" ) ;
@@ -48,7 +60,7 @@ public static ILGenerator EmitLoadIdentifierReference(this ILGenerator gen, Iden
48
60
{
49
61
var ( type , index ) = context . CurrentScope . GetVariable ( id ) ;
50
62
gen . WriteDebugMetadata ( $ "/* access local, var: '{ id } ', index: '{ index } ', type: '{ type } ' */") ;
51
- return gen . Emit ( OpCodes . LDLOC_S , index ) ;
63
+ return gen . EmitLoadLocal ( index ) ;
52
64
}
53
65
54
66
// second order: search argument
@@ -250,7 +262,7 @@ public static ILGenerator EmitAccess(this ILGenerator gen, AccessExpressionSynta
250
262
}
251
263
252
264
if ( access is { Left : ThisAccessExpression , Right : InvocationExpression inv1 } )
253
- return gen . EmitCall ( ctx . CurrentMethod . Owner , inv1 ) ;
265
+ return gen . EmitThis ( ) . EmitCall ( ctx . CurrentMethod . Owner , inv1 ) ;
254
266
if ( access is { Left : SelfAccessExpression , Right : InvocationExpression inv2 } )
255
267
return gen . EmitCall ( ctx . CurrentMethod . Owner , inv2 ) ;
256
268
0 commit comments