// // Copyright (c) 2006, Brian Frank and Andy Frank // Licensed under the Academic Free License version 3.0 // // History: // 15 Sep 05 Brian Frank Creation // 20 Aug 06 Brian Frank Ported from Java to Fan // ** ** AttrAsm provides support for assembling the attributes ** table for types and slots. ** class AttrAsm : CompilerSupport { ////////////////////////////////////////////////////////////////////////// // Construction ////////////////////////////////////////////////////////////////////////// new make(Compiler compiler, FPod fpod) : super(compiler) { this.fpod = fpod; this.attrs = FAttr[,] } ////////////////////////////////////////////////////////////////////////// // Named Adds ////////////////////////////////////////////////////////////////////////// Void sourceFile(Str? source) { if (source == null) return utf(FConst.SourceFileAttr, source) } Void lineNumber(Int? line) { if (line == null || line == 0) return u2(FConst.LineNumberAttr, line) } Void facets(FacetDef[]? facets) { if (facets == null || facets.isEmpty) return buf := Buf.make buf.writeI2(facets.size) facets.each |FacetDef f| { buf.writeI2(fpod.addTypeRef(f.type)) try buf.writeUtf(f.serialize) catch (CompilerErr e) err("Facet value is not serializable: '$f.type' ($e.msg)", f.loc) add(FConst.FacetsAttr, buf) } } Void enumOrdinal(Int ordinal) { u2(FConst.EnumOrdinalAttr, ordinal) } ////////////////////////////////////////////////////////////////////////// // Generic Adds ////////////////////////////////////////////////////////////////////////// Void utf(Str name, Str data) { buf := Buf.make buf.writeUtf(data) add(name, buf) } Void u2(Str name, Int data) { buf := Buf.make buf.writeI2(data) add(name, buf) } Void add(Str name, Buf data) { a := FAttr.make a.name = fpod.addName(name) a.data = data attrs.add(a) } ////////////////////////////////////////////////////////////////////////// // Fields ////////////////////////////////////////////////////////////////////////// FPod fpod FAttr[] attrs }