@@ -21,6 +21,7 @@ import (
21
21
"sort"
22
22
"strconv"
23
23
"strings"
24
+ "sync"
24
25
"time"
25
26
26
27
"github.com/fsnotify/fsnotify"
@@ -938,23 +939,40 @@ func (s *Session) buildImportPathWithSrcDir(path string, srcDir string) (*Packag
938
939
return pkg , archive , nil
939
940
}
940
941
942
+ // getExeModTime will determine the mod time of the GopherJS binary
943
+ // the first time this is called and cache the result for subsequent calls.
944
+ var getExeModTime = func () func () time.Time {
945
+ var (
946
+ once sync.Once
947
+ result time.Time
948
+ )
949
+ getTime := func () {
950
+ var fileInfo os.FileInfo
951
+ gopherjsBinary , err := os .Executable ()
952
+ if err == nil {
953
+ fileInfo , err = os .Stat (gopherjsBinary )
954
+ if err == nil {
955
+ result = fileInfo .ModTime ()
956
+ return
957
+ }
958
+ }
959
+ os .Stderr .WriteString ("Could not get GopherJS binary's modification timestamp. Please report issue.\n " )
960
+ result = time .Now ()
961
+ }
962
+ return func () time.Time {
963
+ once .Do (getTime )
964
+ return result
965
+ }
966
+ }()
967
+
941
968
// BuildPackage compiles an already loaded package.
942
969
func (s * Session ) BuildPackage (pkg * PackageData ) (* compiler.Archive , error ) {
943
970
if archive , ok := s .UpToDateArchives [pkg .ImportPath ]; ok {
944
971
return archive , nil
945
972
}
946
973
947
- var fileInfo os.FileInfo
948
- gopherjsBinary , err := os .Executable ()
949
- if err == nil {
950
- fileInfo , err = os .Stat (gopherjsBinary )
951
- if err == nil && fileInfo .ModTime ().After (pkg .SrcModTime ) {
952
- pkg .SrcModTime = fileInfo .ModTime ()
953
- }
954
- }
955
- if err != nil {
956
- os .Stderr .WriteString ("Could not get GopherJS binary's modification timestamp. Please report issue.\n " )
957
- pkg .SrcModTime = time .Now ()
974
+ if exeModTime := getExeModTime (); exeModTime .After (pkg .SrcModTime ) {
975
+ pkg .SrcModTime = exeModTime
958
976
}
959
977
960
978
for _ , importedPkgPath := range pkg .Imports {
@@ -966,14 +984,13 @@ func (s *Session) BuildPackage(pkg *PackageData) (*compiler.Archive, error) {
966
984
return nil , err
967
985
}
968
986
969
- impModTime := importedPkg .SrcModTime
970
- if impModTime .After (pkg .SrcModTime ) {
987
+ if impModTime := importedPkg .SrcModTime ; impModTime .After (pkg .SrcModTime ) {
971
988
pkg .SrcModTime = impModTime
972
989
}
973
990
}
974
991
975
- if pkg .FileModTime ().After (pkg .SrcModTime ) {
976
- pkg .SrcModTime = pkg . FileModTime ()
992
+ if fileModTime := pkg .FileModTime (); fileModTime .After (pkg .SrcModTime ) {
993
+ pkg .SrcModTime = fileModTime
977
994
}
978
995
979
996
if ! s .options .NoCache {
@@ -1018,7 +1035,8 @@ func (s *Session) BuildPackage(pkg *PackageData) (*compiler.Archive, error) {
1018
1035
fmt .Println (pkg .ImportPath )
1019
1036
}
1020
1037
1021
- s .buildCache .StoreArchive (archive , time .Now ())
1038
+ archiveBuiltTime := time .Now ()
1039
+ s .buildCache .StoreArchive (archive , archiveBuiltTime )
1022
1040
s .UpToDateArchives [pkg .ImportPath ] = archive
1023
1041
1024
1042
return archive , nil
0 commit comments