public void WriteFixedArrayInitializer(AstFixedArrayInitializer a) { Write(a.Source); Write(a.OptionalElementType); Write(a.OptionalSize); WriteExpressions(a.OptionalValues); }
public FixedArrayDeclaration CompileFixedArrayDeclaration(Source src, DataType dt, string name, AstFixedArrayInitializer s) { DataType et = null; Expression size = null; Expression[] values = null; if (s.OptionalElementType != null) { et = NameResolver.GetType(Namescope, s.OptionalElementType); } if (s.OptionalSize != null) { size = CompileImplicitCast(s.OptionalSize.Source, Essentials.Int, CompileExpression(s.OptionalSize)); } if (s.OptionalValues != null) { values = new Expression[s.OptionalValues.Count]; for (int i = 0; i < values.Length; i++) { values[i] = CompileExpression(s.OptionalValues[i]); } if (et != null) { for (int i = 0; i < values.Length; i++) { values[i] = CompileImplicitCast(values[i].Source, et, values[i]); } } else { var it = TryGetImplicitElementType(values); if (it == null) { Log.Error(s.Source, ErrorCode.E0000, "No best type found for implicitly typed fixed array"); it = DataType.Invalid; } et = it; } if (size != null) { Compiler.ConstantFolder.TryMakeConstant(ref size); if (size.ExpressionType != ExpressionType.Constant || (int)size.ConstantValue != values.Length) { Log.Error(size.Source, ErrorCode.E0000, "Fixed array size does not match initializer count"); } } else { size = new Constant(s.Source, Essentials.Int, values.Length); } } else if (et == null) { Log.Error(s.Source, ErrorCode.E0000, "Must provide non-empty initializer list for implicitly typed fixed arrays"); et = DataType.Invalid; } else if (size == null) { Log.Error(s.Source, ErrorCode.E0000, "Must provide non-empty initializer list for implicitly sized fixed arrays"); size = new Constant(s.Source, DataType.Invalid, -1); } if (dt != null) { var fat = dt as FixedArrayType; if (fat == null || !fat.ElementType.Equals(et) || fat.OptionalSize != null && !fat.OptionalSize.Equals(size)) { Log.Error(src, ErrorCode.E0000, "Declaring type must be 'fixed " + et + "[" + size + "]' or 'fixed " + et + "[]'"); } } var var = new Variable(s.Source, Function, name, new FixedArrayType(s.Source, et, size, Essentials.Int)); CurrentVariableScope.Variables[name] = var; return(new FixedArrayDeclaration(var, values)); }