public static CodegenExpression EvaluateCodegen( Type requiredType, ExprNewInstanceNodeArrayForge forge, CodegenMethodScope parent, ExprForgeCodegenSymbol symbols, CodegenClassScope classScope) { if (forge.Parent.IsArrayInitializedByExpr) { return forge.Parent.ChildNodes[0].Forge.EvaluateCodegen(requiredType, parent, symbols, classScope); } var method = parent.MakeChild(requiredType, typeof(ExprNewInstanceNodeArrayForgeEval), classScope); var dimensions = forge.Parent.ChildNodes; var dimValue = new CodegenExpression[dimensions.Length]; for (var i = 0; i < dimensions.Length; i++) { var dimForge = forge.Parent.ChildNodes[i].Forge; var dimForgeType = dimForge.EvaluationType; var dimExpr = dimForge.EvaluateCodegen(typeof(int?), method, symbols, classScope); if (dimForge.ForgeConstantType == ExprForgeConstantType.COMPILETIMECONST) { dimValue[i] = Unbox(dimExpr, dimForgeType); } else { var name = "dim" + i; method.Block .DeclareVar(typeof(int?), name, dimExpr) .IfRefNull(name) .BlockThrow(NewInstance(typeof(EPException), Constant(NULL_MSG))); dimValue[i] = Unbox(Ref(name)); } } CodegenExpression make; if (dimValue.Length == 1) { make = NewArrayByLength(forge.TargetClass, dimValue[0]); } else { var @params = new CodegenExpression[dimValue.Length + 1]; @params[0] = Clazz(forge.TargetClass); Array.Copy(dimValue, 0, @params, 1, dimValue.Length); make = StaticMethod(typeof(Arrays), "CreateJagged", @params); } method.Block.MethodReturn(CodegenLegoCast.CastSafeFromObjectType(requiredType, make)); return LocalMethod(method); }
public ExprNewInstanceNodeArrayForgeEval(ExprNewInstanceNodeArrayForge forge) { _forge = forge; }