From 23cb6ad44b1b61295a50b121e83e98039ec0a7f7 Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Sun, 27 May 2012 03:21:51 -0400 Subject: [PATCH] Close most issues for the windows port Closes #7 Closes #10 Closes #13 --- .gitmodules | 9 +++++--- base/client.jl | 1 + base/env.jl | 51 ++++++++++++++++++++++++++++---------------- base/random.jl | 4 ++-- base/start_image.jl | 3 +++ deps/Makefile | 25 +++++++++++++++++++++- deps/openlibm | 1 + src/ccall.cpp | 4 ++++ src/julia-parser.scm | 2 +- test/perf/perf.jl | 2 ++ 10 files changed, 77 insertions(+), 25 deletions(-) create mode 160000 deps/openlibm diff --git a/.gitmodules b/.gitmodules index 8545e82fe68f6..dcf73f36ea453 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ -[submodule "deps/libuv"] - path = deps/libuv - url = https://github.com/JuliaLang/libuv.git +[submodule "deps/libuv"] + path = deps/libuv + url = https://github.com/JuliaLang/libuv.git +[submodule "deps/openlibm"] + path = deps/openlibm + url = https://github.com/JuliaLang/openlibm.git diff --git a/base/client.jl b/base/client.jl index f20bcb2b677f4..43837f0cb4174 100644 --- a/base/client.jl +++ b/base/client.jl @@ -15,6 +15,7 @@ function _jl_answer_color() c == "magenta" ? "\033[1m\033[35m" : c == "cyan" ? "\033[1m\033[36m" : c == "white" ? "\033[1m\033[37m" : + c == "normal" ? _jl_color_normal : "\033[1m\033[34m" end diff --git a/base/env.jl b/base/env.jl index b1f17aa5d90d1..566f8633461bc 100644 --- a/base/env.jl +++ b/base/env.jl @@ -1,14 +1,39 @@ ## core libc calls ## -hasenv(s::String) = ccall(:getenv, Ptr{Uint8}, (Ptr{Uint8},), s) != C_NULL +@unix_only _getenv(var::String) = ccall(:getenv, Ptr{Uint8}, (Ptr{Uint8},), var) +@unix_only hasenv(s::String) = _getenv(s) != C_NULL -function getenv(var::String) - val = ccall(:getenv, Ptr{Uint8}, (Ptr{Uint8},), var) +@windows_only begin +_getenvlen(var::String) = ccall(:GetEnvironmentVariableA,stdcall,Uint32,(Ptr{Uint8},Ptr{Uint8},Uint32),var,C_NULL,0) +hasenv(s::String) = false#_getenvlen(s)!=0 +function _jl_win_getenv(s::String,len::Uint32) + val=zeros(Uint8,len) + ret=ccall(:GetEnvironmentVariableA,stdcall,Uint32,(Ptr{Uint8},Ptr{Uint8},Uint32),s,val,len) + if(ret==0||ret!=len-1) #Trailing 0 is only included on first call to GetEnvA + error("getenv: unknown system error: ", s, len, ret) + end + val +end +end + +macro accessEnv(var,errorcase) +@unix_only quote + val=_getenv($var) if val == C_NULL - error("getenv: undefined variable: ", var) + $errorcase end cstring(val) end +@windows_only quote + len=_getenvlen($var) + if len == 0 + $errorcase + end + cstring(convert(Ptr{Uint8},_jl_win_getenv($var,len))) +end +end + +getenv(var::String) = @accessEnv var error("getenv: undefined variable: ", var) function setenv(var::String, val::String, overwrite::Bool) @unix_only begin @@ -16,10 +41,12 @@ function setenv(var::String, val::String, overwrite::Bool) system_error(:setenv, ret != 0) end @windows_only begin +if(overwrite||!hasenv(var)) ret = ccall(:SetEnvironmentVariableA,stdcall,Int32,(Ptr{Uint8},Ptr{Uint8}),var,val) system_error(:setenv, ret == 0) end end +end setenv(var::String, val::String) = setenv(var, val, true) @@ -40,21 +67,9 @@ type EnvHash <: Associative{ByteString,ByteString}; end const ENV = EnvHash() -function ref(::EnvHash, k::String) - val = ccall(:getenv, Ptr{Uint8}, (Ptr{Uint8},), k) - if val == C_NULL - throw(KeyError(k)) - end - cstring(val) -end +ref(::EnvHash, k::String) = @accessEnv k throw(KeyError(k)) -function get(::EnvHash, k::String, deflt) - val = ccall(:getenv, Ptr{Uint8}, (Ptr{Uint8},), k) - if val == C_NULL - return deflt - end - cstring(val) -end +get(::EnvHash, k::String, deflt) = @accessEnv k (return deflt) has(::EnvHash, k::String) = hasenv(k) del(::EnvHash, k::String) = unsetenv(k) diff --git a/base/random.jl b/base/random.jl index baaaa71ba0ce0..ac6a83d98cb23 100644 --- a/base/random.jl +++ b/base/random.jl @@ -18,13 +18,13 @@ function _jl_librandom_init() end srand(seed) end - _jl_randn_zig_init() end @windows_only begin a=zeros(Uint32,2) - #ccall(dlsym(_jl_advapi32,:SystemFunction036),stdcall,Uint8,(Ptr{Void},Uint64),convert(Ptr{Void},a),8) + ccall(dlsym(_jl_advapi32,:SystemFunction036),stdcall,Uint8,(Ptr{Void},Uint32),convert(Ptr{Void},a),8) srand(a) end +_jl_randn_zig_init() end # macros to generate random arrays diff --git a/base/start_image.jl b/base/start_image.jl index 36a46224b18ff..ce302c3d88b20 100644 --- a/base/start_image.jl +++ b/base/start_image.jl @@ -10,6 +10,9 @@ _jl_lib = ccall(:jl_load_dynamic_library,Ptr{Void},(Ptr{None},),C_NULL) @unix_only _jl_repl = _jl_lib @windows_only _jl_repl = ccall(:jl_wrap_raw_dl_handle,Ptr{Void},(Ptr{Void},),ccall(:GetModuleHandleA,stdcall,Ptr{Void},(Ptr{Void},),C_NULL)) +# Set up envrionment variables +@windows_only setenv("JL_ANSWER_COLOR","normal",false) + # Essential libraries _jl_libpcre = dlopen("libpcre") _jl_libgrisu = dlopen("libgrisu") diff --git a/deps/Makefile b/deps/Makefile index 77d682346b929..d56cbdc8f1650 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -21,7 +21,7 @@ GLPK_VER = 4.43 JULIAHOME = $(abspath ..) include $(JULIAHOME)/Make.inc -LIBS = uv fdlibm dsfmt rmath double-conversion amos suitesparse-wrapper gmp-wrapper +LIBS = uv fdlibm dsfmt rmath double-conversion amos suitesparse-wrapper gmp-wrapper openlibm ## WGET / CURL ifeq ($(OS), Linux) @@ -223,6 +223,28 @@ distclean-readline: endif +# openlibm + +ifeq ($(OS), WINNT) #needs more advanced detection once 64bit build is possible +OPENLIBM_FLAGS = ARCH=i386 +endif + +OPENLIBM_OBJ_TARGET = $(USRLIB)/libopenlibm.$(SHLIB_EXT) +OPENLIBM_OBJ_SOURCE = openlibm/libopenlibm.$(SHLIB_EXT) + +openlibm/Makefile: + (cd .. && git submodule update --init) +$(OPENLIBM_OBJ_SOURCE): openlibm/Makefile + $(MAKE) -C openlibm $(OPENLIBM_FLAGS) +$(OPENLIBM_OBJ_TARGET): $(OPENLIBM_OBJ_SOURCE) | $(USRLIB) + cp $< $@ +install-openlibm: $(OPENLIBM_OBJ_TARGET) + +clean-openlibm: + $(MAKE) -C openlibm clean + rm $(OPENLIBM_OBJ_TARGET) +distclean-openlibm: clean-openlibm + ## LIBUV ifeq ($(OS), WINNT) @@ -313,6 +335,7 @@ clean-double-conversion: distclean-double-conversion: rm -rf double-conversion-$(GRISU_VER).tar.gz double-conversion-$(GRISU_VER) + ## fdlibm ## FDLIBM_OBJ_TARGET = $(USRLIB)/libfdm.$(SHLIB_EXT) diff --git a/deps/openlibm b/deps/openlibm new file mode 160000 index 0000000000000..fed038b32f72b --- /dev/null +++ b/deps/openlibm @@ -0,0 +1 @@ +Subproject commit fed038b32f72bbbc309e8f6239793f13da272ae0 diff --git a/src/ccall.cpp b/src/ccall.cpp index 1f166a7629f40..096ce2db977c2 100644 --- a/src/ccall.cpp +++ b/src/ccall.cpp @@ -250,6 +250,10 @@ static Value *emit_ccall(jl_value_t **args, size_t nargs, jl_codectx_t *ctx) cc = CallingConv::X86_FastCall; nargs--; } + else if (lhd == jl_symbol("thiscall")) { + cc = CallingConv::X86_ThisCall; + nargs--; + } } if ((!isVa && jl_tuple_len(tt) != (nargs-2)/2) || diff --git a/src/julia-parser.scm b/src/julia-parser.scm index 2956017d23126..052ca62bbf0f5 100644 --- a/src/julia-parser.scm +++ b/src/julia-parser.scm @@ -794,7 +794,7 @@ (take-token s) (let ((al (parse-arglist s #\)))) (if (and (length> al 1) - (memq (cadr al) '(cdecl stdcall fastcall))) + (memq (cadr al) '(cdecl stdcall fastcall thiscall))) ;; place (callingconv) at end of arglist `(ccall ,(car al) ,@(cddr al) (,(cadr al))) `(ccall ,.al)))) diff --git a/test/perf/perf.jl b/test/perf/perf.jl index 5cb96e04cc30e..3f382acf99d4c 100644 --- a/test/perf/perf.jl +++ b/test/perf/perf.jl @@ -131,6 +131,7 @@ end ## printfd ## +@unix_only begin function printfd(n) f = open("/dev/null","w") for i = 1:n @@ -143,3 +144,4 @@ end printfd(1) @timeit printfd(100000) "printfd" +end