MCPcopy
hub / github.com/gopherjs/gopherjs / WriteProgramCode

Function WriteProgramCode

compiler/compiler.go:131–207  ·  view source on GitHub ↗
(pkgs []*Archive, w *sourcemapx.Filter, goVersion, testBinary string)

Source from the content-addressed store, hash-verified

129}
130
131func WriteProgramCode(pkgs []*Archive, w *sourcemapx.Filter, goVersion, testBinary string) error {
132 mainPkg := pkgs[len(pkgs)-1]
133 minify := mainPkg.Minified
134
135 // Aggregate all go:linkname directives in the program together.
136 gls := linkname.GoLinknameSet{}
137 for _, pkg := range pkgs {
138 gls.Add(pkg.GoLinknames)
139 }
140
141 sel := &dce.Selector[*Decl]{}
142 for _, pkg := range pkgs {
143 for _, d := range pkg.Declarations {
144 implementsLink := false
145 if gls.IsImplementation(d.LinkingName) {
146 // If a decl is referenced by a go:linkname directive, we just assume
147 // it's not dead.
148 // TODO(nevkontakte): This is a safe, but imprecise assumption. We should
149 // try and trace whether the referencing functions are actually live.
150 implementsLink = true
151 }
152 sel.Include(d, implementsLink)
153 }
154 }
155 dceSelection := sel.AliveDecls()
156
157 if _, err := writeF(w, false, "\"use strict\";\n(function() {\n\n"); err != nil {
158 return err
159 }
160 if _, err := writeF(w, false, "var $goVersion = %q;\n", goVersion); err != nil {
161 return err
162 }
163 if _, err := writeF(w, false, "var $testBinary = %q;\n", testBinary); err != nil {
164 return err
165 }
166 for _, preludeFile := range prelude.PreludeFiles() {
167 if _, err := w.WriteJS(preludeFile.Source, preludeFile.Name, minify); err != nil {
168 return err
169 }
170 }
171 if _, err := writeF(w, false, "\n"); err != nil {
172 return err
173 }
174
175 // write packages
176 for _, pkg := range pkgs {
177 if err := WritePkgCode(pkg, dceSelection, gls, minify, w); err != nil {
178 return err
179 }
180 }
181
182 if _, err := writeF(w, false, "$callForAllPackages(\"$finishSetup\");\n"); err != nil {
183 return err
184 }
185 if _, err := writeF(w, false, "$synthesizeMethods();\n"); err != nil {
186 return err
187 }
188 if _, err := writeF(w, false, "$callForAllPackages(\"$initLinknames\");\n"); err != nil {

Callers 1

OpenMethod · 0.92

Calls 8

AddMethod · 0.95
IsImplementationMethod · 0.95
PreludeFilesFunction · 0.92
writeFFunction · 0.85
WritePkgCodeFunction · 0.85
IncludeMethod · 0.80
AliveDeclsMethod · 0.80
WriteJSMethod · 0.80

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…