mirror of
https://github.com/golang/go
synced 2024-11-22 04:04:40 -07:00
runtime: revert 6974:1f3c3696babb
I missed that environment is used during runtime setup, well before go init() functions run. Implemented os-dependent runtime.goenvs functions to allow for different unix, plan9 and windows versions of environment discovery. R=rsc, paulzhol CC=golang-dev https://golang.org/cl/3787046
This commit is contained in:
parent
217693e93c
commit
a41d85498e
@ -114,7 +114,6 @@ func TempDir() string {
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
var argc int32
|
var argc int32
|
||||||
Envs = Environ()
|
|
||||||
cmd := syscall.GetCommandLine()
|
cmd := syscall.GetCommandLine()
|
||||||
argv, e := syscall.CommandLineToArgv(cmd, &argc)
|
argv, e := syscall.CommandLineToArgv(cmd, &argc)
|
||||||
if e != 0 {
|
if e != 0 {
|
||||||
|
@ -148,6 +148,12 @@ runtime·osinit(void)
|
|||||||
runtime·bsdthread_register();
|
runtime·bsdthread_register();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
runtime·goenvs(void)
|
||||||
|
{
|
||||||
|
runtime·goenvs_unix();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void))
|
runtime·newosproc(M *m, G *g, void *stk, void (*fn)(void))
|
||||||
{
|
{
|
||||||
|
@ -163,6 +163,12 @@ runtime·osinit(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
runtime·goenvs(void)
|
||||||
|
{
|
||||||
|
runtime·goenvs_unix();
|
||||||
|
}
|
||||||
|
|
||||||
// Called to initialize a new m (including the bootstrap m).
|
// Called to initialize a new m (including the bootstrap m).
|
||||||
void
|
void
|
||||||
runtime·minit(void)
|
runtime·minit(void)
|
||||||
|
@ -263,6 +263,12 @@ runtime·osinit(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
runtime·goenvs(void)
|
||||||
|
{
|
||||||
|
runtime·goenvs_unix();
|
||||||
|
}
|
||||||
|
|
||||||
// Called to initialize a new m (including the bootstrap m).
|
// Called to initialize a new m (including the bootstrap m).
|
||||||
void
|
void
|
||||||
runtime·minit(void)
|
runtime·minit(void)
|
||||||
|
@ -17,6 +17,11 @@ runtime·osinit(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
runtime·goenvs(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
runtime·initsig(int32 queue)
|
runtime·initsig(int32 queue)
|
||||||
{
|
{
|
||||||
|
@ -111,6 +111,7 @@ runtime·schedinit(void)
|
|||||||
|
|
||||||
runtime·mallocinit();
|
runtime·mallocinit();
|
||||||
runtime·goargs();
|
runtime·goargs();
|
||||||
|
runtime·goenvs();
|
||||||
|
|
||||||
// For debugging:
|
// For debugging:
|
||||||
// Allocate internal symbol table representation now,
|
// Allocate internal symbol table representation now,
|
||||||
|
@ -152,34 +152,36 @@ int32 runtime·isplan9;
|
|||||||
void
|
void
|
||||||
runtime·goargs(void)
|
runtime·goargs(void)
|
||||||
{
|
{
|
||||||
String *gargv;
|
String *s;
|
||||||
String *genvv;
|
int32 i;
|
||||||
int32 i, envc;
|
|
||||||
|
|
||||||
// for windows implementation see "os" package
|
// for windows implementation see "os" package
|
||||||
if(Windows)
|
if(Windows)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(runtime·isplan9)
|
s = runtime·malloc(argc*sizeof s[0]);
|
||||||
envc=0;
|
|
||||||
else
|
|
||||||
for(envc=0; argv[argc+1+envc] != 0; envc++)
|
|
||||||
;
|
|
||||||
|
|
||||||
gargv = runtime·malloc(argc*sizeof gargv[0]);
|
|
||||||
genvv = runtime·malloc(envc*sizeof genvv[0]);
|
|
||||||
|
|
||||||
for(i=0; i<argc; i++)
|
for(i=0; i<argc; i++)
|
||||||
gargv[i] = runtime·gostringnocopy(argv[i]);
|
s[i] = runtime·gostringnocopy(argv[i]);
|
||||||
os·Args.array = (byte*)gargv;
|
os·Args.array = (byte*)s;
|
||||||
os·Args.len = argc;
|
os·Args.len = argc;
|
||||||
os·Args.cap = argc;
|
os·Args.cap = argc;
|
||||||
|
}
|
||||||
|
|
||||||
for(i=0; i<envc; i++)
|
void
|
||||||
genvv[i] = runtime·gostringnocopy(argv[argc+1+i]);
|
runtime·goenvs_unix(void)
|
||||||
os·Envs.array = (byte*)genvv;
|
{
|
||||||
os·Envs.len = envc;
|
String *s;
|
||||||
os·Envs.cap = envc;
|
int32 i, n;
|
||||||
|
|
||||||
|
for(n=0; argv[argc+1+n] != 0; n++)
|
||||||
|
;
|
||||||
|
|
||||||
|
s = runtime·malloc(n*sizeof s[0]);
|
||||||
|
for(i=0; i<n; i++)
|
||||||
|
s[i] = runtime·gostringnocopy(argv[argc+1+i]);
|
||||||
|
os·Envs.array = (byte*)s;
|
||||||
|
os·Envs.len = n;
|
||||||
|
os·Envs.cap = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Atomic add and return new value.
|
// Atomic add and return new value.
|
||||||
|
@ -370,6 +370,7 @@ extern bool runtime·iscgo;
|
|||||||
*/
|
*/
|
||||||
int32 runtime·strcmp(byte*, byte*);
|
int32 runtime·strcmp(byte*, byte*);
|
||||||
int32 runtime·findnull(byte*);
|
int32 runtime·findnull(byte*);
|
||||||
|
int32 runtime·findnullw(uint16*);
|
||||||
void runtime·dump(byte*, int32);
|
void runtime·dump(byte*, int32);
|
||||||
int32 runtime·runetochar(byte*, int32);
|
int32 runtime·runetochar(byte*, int32);
|
||||||
int32 runtime·charntorune(int32*, uint8*, int32);
|
int32 runtime·charntorune(int32*, uint8*, int32);
|
||||||
@ -384,6 +385,8 @@ void runtime·gogocall(Gobuf*, void(*)(void));
|
|||||||
uintptr runtime·gosave(Gobuf*);
|
uintptr runtime·gosave(Gobuf*);
|
||||||
void runtime·lessstack(void);
|
void runtime·lessstack(void);
|
||||||
void runtime·goargs(void);
|
void runtime·goargs(void);
|
||||||
|
void runtime·goenvs(void);
|
||||||
|
void runtime·goenvs_unix(void);
|
||||||
void* runtime·getu(void);
|
void* runtime·getu(void);
|
||||||
void runtime·throw(int8*);
|
void runtime·throw(int8*);
|
||||||
void runtime·panicstring(int8*);
|
void runtime·panicstring(int8*);
|
||||||
@ -399,6 +402,7 @@ String runtime·catstring(String, String);
|
|||||||
String runtime·gostring(byte*);
|
String runtime·gostring(byte*);
|
||||||
String runtime·gostringn(byte*, int32);
|
String runtime·gostringn(byte*, int32);
|
||||||
String runtime·gostringnocopy(byte*);
|
String runtime·gostringnocopy(byte*);
|
||||||
|
String runtime·gostringw(uint16*);
|
||||||
void runtime·initsig(int32);
|
void runtime·initsig(int32);
|
||||||
int32 runtime·gotraceback(void);
|
int32 runtime·gotraceback(void);
|
||||||
void runtime·traceback(uint8 *pc, uint8 *sp, uint8 *lr, G* gp);
|
void runtime·traceback(uint8 *pc, uint8 *sp, uint8 *lr, G* gp);
|
||||||
|
@ -20,6 +20,18 @@ runtime·findnull(byte *s)
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32
|
||||||
|
runtime·findnullw(uint16 *s)
|
||||||
|
{
|
||||||
|
int32 l;
|
||||||
|
|
||||||
|
if(s == nil)
|
||||||
|
return 0;
|
||||||
|
for(l=0; s[l]!=0; l++)
|
||||||
|
;
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
int32 runtime·maxstring = 256;
|
int32 runtime·maxstring = 256;
|
||||||
|
|
||||||
String
|
String
|
||||||
@ -68,6 +80,24 @@ runtime·gostringnocopy(byte *str)
|
|||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String
|
||||||
|
runtime·gostringw(uint16 *str)
|
||||||
|
{
|
||||||
|
int32 n, i;
|
||||||
|
byte buf[8];
|
||||||
|
String s;
|
||||||
|
|
||||||
|
n = 0;
|
||||||
|
for(i=0; str[i]; i++)
|
||||||
|
n += runtime·runetochar(buf, str[i]);
|
||||||
|
s = runtime·gostringsize(n+4);
|
||||||
|
n = 0;
|
||||||
|
for(i=0; str[i]; i++)
|
||||||
|
n += runtime·runetochar(s.str+n, str[i]);
|
||||||
|
s.len = n;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
String
|
String
|
||||||
runtime·catstring(String s1, String s2)
|
runtime·catstring(String s1, String s2)
|
||||||
{
|
{
|
||||||
|
@ -16,6 +16,12 @@ runtime·osinit(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
runtime·goenvs(void)
|
||||||
|
{
|
||||||
|
runtime·goenvs_unix();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
runtime·initsig(int32 queue)
|
runtime·initsig(int32 queue)
|
||||||
{
|
{
|
||||||
|
@ -39,6 +39,42 @@ runtime·osinit(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma dynimport runtime·GetEnvironmentStringsW GetEnvironmentStringsW "kernel32.dll"
|
||||||
|
#pragma dynimport runtime·FreeEnvironmentStringsW FreeEnvironmentStringsW "kernel32.dll"
|
||||||
|
|
||||||
|
extern void *runtime·GetEnvironmentStringsW;
|
||||||
|
extern void *runtime·FreeEnvironmentStringsW;
|
||||||
|
|
||||||
|
void
|
||||||
|
runtime·goenvs(void)
|
||||||
|
{
|
||||||
|
extern Slice os·Envs;
|
||||||
|
|
||||||
|
uint16 *env;
|
||||||
|
String *s;
|
||||||
|
int32 i, n;
|
||||||
|
uint16 *p;
|
||||||
|
|
||||||
|
env = runtime·stdcall(runtime·GetEnvironmentStringsW, 0);
|
||||||
|
|
||||||
|
n = 0;
|
||||||
|
for(p=env; *p; n++)
|
||||||
|
p += runtime·findnullw(p)+1;
|
||||||
|
|
||||||
|
s = runtime·malloc(n*sizeof s[0]);
|
||||||
|
|
||||||
|
p = env;
|
||||||
|
for(i=0; i<n; i++) {
|
||||||
|
s[i] = runtime·gostringw(p);
|
||||||
|
p += runtime·findnullw(p)+1;
|
||||||
|
}
|
||||||
|
os·Envs.array = (byte*)s;
|
||||||
|
os·Envs.len = n;
|
||||||
|
os·Envs.cap = n;
|
||||||
|
|
||||||
|
runtime·stdcall(runtime·FreeEnvironmentStringsW, 1, env);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
runtime·exit(int32 code)
|
runtime·exit(int32 code)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user