x11 example compiles again; updated python wrapper; compiler supports variables in DLLs

This commit is contained in:
Araq 2012-07-16 08:11:37 +02:00
commit 4215686cce
7 changed files with 51 additions and 21 deletions

View file

@ -418,9 +418,20 @@ proc assignLocalVar(p: BProc, s: PSym) =
include ccgthreadvars include ccgthreadvars
proc VarInDynamicLib(m: BModule, sym: PSym)
proc mangleDynLibProc(sym: PSym): PRope
proc assignGlobalVar(p: BProc, s: PSym) = proc assignGlobalVar(p: BProc, s: PSym) =
if s.loc.k == locNone: if s.loc.k == locNone:
fillLoc(s.loc, locGlobalVar, s.typ, mangleName(s), OnHeap) fillLoc(s.loc, locGlobalVar, s.typ, mangleName(s), OnHeap)
if lfDynamicLib in s.loc.flags:
var q = findPendingModule(p.module, s)
if q != nil and not ContainsOrIncl(q.declaredThings, s.id):
VarInDynamicLib(q, s)
else:
s.loc.r = mangleDynLibProc(s)
return
useHeader(p.module, s) useHeader(p.module, s)
if lfNoDecl in s.loc.flags: return if lfNoDecl in s.loc.flags: return
if sfThread in s.flags: if sfThread in s.flags:
@ -537,6 +548,21 @@ proc SymInDynamicLib(m: BModule, sym: PSym) =
"$1 = linkonce global $2 zeroinitializer$n", "$1 = linkonce global $2 zeroinitializer$n",
[sym.loc.r, getTypeDesc(m, sym.loc.t)]) [sym.loc.r, getTypeDesc(m, sym.loc.t)])
proc VarInDynamicLib(m: BModule, sym: PSym) =
var lib = sym.annex
var extname = sym.loc.r
loadDynamicLib(m, lib)
incl(sym.loc.flags, lfIndirect)
var tmp = mangleDynLibProc(sym)
sym.loc.r = tmp # from now on we only need the internal name
inc(m.labels, 2)
appcg(m, m.s[cfsDynLibInit],
"$1 = ($2*) #nimGetProcAddr($3, $4);$n",
[tmp, getTypeDesc(m, sym.typ),
lib.name, cstringLit(m, m.s[cfsDynLibInit], ropeToStr(extname))])
appf(m.s[cfsVars], "$2* $1;$n",
[sym.loc.r, getTypeDesc(m, sym.loc.t)])
proc SymInDynamicLibPartial(m: BModule, sym: PSym) = proc SymInDynamicLibPartial(m: BModule, sym: PSym) =
sym.loc.r = mangleDynLibProc(sym) sym.loc.r = mangleDynLibProc(sym)
sym.typ.sym = nil # generate a new name sym.typ.sym = nil # generate a new name
@ -751,6 +777,7 @@ proc genVarPrototype(m: BModule, sym: PSym) =
else: else:
app(m.s[cfsVars], "extern ") app(m.s[cfsVars], "extern ")
app(m.s[cfsVars], getTypeDesc(m, sym.loc.t)) app(m.s[cfsVars], getTypeDesc(m, sym.loc.t))
if lfDynamicLib in sym.loc.flags: app(m.s[cfsVars], "*")
if sfRegister in sym.flags: app(m.s[cfsVars], " register") if sfRegister in sym.flags: app(m.s[cfsVars], " register")
if sfVolatile in sym.flags: app(m.s[cfsVars], " volatile") if sfVolatile in sym.flags: app(m.s[cfsVars], " volatile")
appf(m.s[cfsVars], " $1;$n", [sym.loc.r]) appf(m.s[cfsVars], " $1;$n", [sym.loc.r])

View file

@ -3589,7 +3589,7 @@ strings automatically:
Dynlib pragma for import Dynlib pragma for import
------------------------ ------------------------
With the `dynlib`:idx: pragma a procedure can be imported from With the `dynlib`:idx: pragma a procedure or a variable can be imported from
a dynamic library (``.dll`` files for Windows, ``lib*.so`` files for UNIX). a dynamic library (``.dll`` files for Windows, ``lib*.so`` files for UNIX).
The non-optional argument has to be the name of the dynamic library: The non-optional argument has to be the name of the dynamic library:

View file

@ -9,4 +9,3 @@ Py_Initialize()
discard PyRun_SimpleString("from time import time,ctime\L" & discard PyRun_SimpleString("from time import time,ctime\L" &
"print 'Today is',ctime(time())\L") "print 'Today is',ctime(time())\L")
Py_Finalize() Py_Finalize()

View file

@ -5,7 +5,7 @@ const
WINDOW_HEIGHT = 300 WINDOW_HEIGHT = 300
var var
width, height: cint width, height: cuint
display: PDisplay display: PDisplay
screen: cint screen: cint
depth: int depth: int
@ -29,10 +29,10 @@ proc create_window =
XBlackPixel(display, screen), XBlackPixel(display, screen),
XWhitePixel(display, screen)) XWhitePixel(display, screen))
size_hints.flags = PSize or PMinSize or PMaxSize size_hints.flags = PSize or PMinSize or PMaxSize
size_hints.min_width = width size_hints.min_width = width.cint
size_hints.max_width = width size_hints.max_width = width.cint
size_hints.min_height = height size_hints.min_height = height.cint
size_hints.max_height = height size_hints.max_height = height.cint
discard XSetStandardProperties(display, win, "Simple Window", "window", discard XSetStandardProperties(display, win, "Simple Window", "window",
0, nil, 0, addr(size_hints)) 0, nil, 0, addr(size_hints))
discard XSelectInput(display, win, ButtonPressMask or KeyPressMask or discard XSelectInput(display, win, ButtonPressMask or KeyPressMask or

View file

@ -60,12 +60,14 @@ import
when defined(windows): when defined(windows):
const dllname = "python(26|25|24|23|22|21|20|16|15).dll" const dllname = "python(27|26|25|24|23|22|21|20|16|15).dll"
elif defined(macosx): elif defined(macosx):
const dllname = "libpython(2.6|2.5|2.4|2.3|2.2|2.1|2.0|1.6|1.5).dylib" const dllname = "libpython(2.7|2.6|2.5|2.4|2.3|2.2|2.1|2.0|1.6|1.5).dylib"
else: else:
const dllver = ".1" const dllver = ".1"
const dllname = "libpython(2.6|2.5|2.4|2.3|2.2|2.1|2.0|1.6|1.5).so" & dllver const dllname = "libpython(2.7|2.6|2.5|2.4|2.3|2.2|2.1|2.0|1.6|1.5).so" &
dllver
const const
PYT_METHOD_BUFFER_INCREASE* = 10 PYT_METHOD_BUFFER_INCREASE* = 10
@ -1545,26 +1547,28 @@ proc init(lib: TLibHandle) =
PyEnum_Type = cast[PPyTypeObject](symAddr(lib, "PyEnum_Type")) PyEnum_Type = cast[PPyTypeObject](symAddr(lib, "PyEnum_Type"))
# Unfortunately we have to duplicate the loading mechanism here, because Nimrod # Unfortunately we have to duplicate the loading mechanism here, because Nimrod
# does not support variables from dynamic libraries. Well designed API's don't # used to not support variables from dynamic libraries. Well designed API's
# require this anyway. Python is an exception. # don't require this anyway. Python is an exception.
var var
lib: TLibHandle lib: TLibHandle
when defined(windows): when defined(windows):
const const
LibNames = ["python26.dll", "python25.dll", LibNames = ["python27.dll", "python26.dll", "python25.dll",
"python24.dll", "python23.dll", "python22.dll", "python21.dll", "python24.dll", "python23.dll", "python22.dll", "python21.dll",
"python20.dll", "python16.dll", "python15.dll"] "python20.dll", "python16.dll", "python15.dll"]
elif defined(macosx): elif defined(macosx):
const const
LibNames = ["libpython2.6.dylib", "libpython2.5.dylib", LibNames = ["libpython2.7.dylib", "libpython2.6.dylib",
"libpython2.4.dylib", "libpython2.3.dylib", "libpython2.2.dylib", "libpython2.5.dylib", "libpython2.4.dylib", "libpython2.3.dylib",
"libpython2.1.dylib", "libpython2.0.dylib", "libpython2.2.dylib", "libpython2.1.dylib", "libpython2.0.dylib",
"libpython1.6.dylib", "libpython1.5.dylib"] "libpython1.6.dylib", "libpython1.5.dylib"]
else: else:
const const
LibNames = ["libpython2.6.so" & dllver, LibNames = [
"libpython2.7.so" & dllver,
"libpython2.6.so" & dllver,
"libpython2.5.so" & dllver, "libpython2.5.so" & dllver,
"libpython2.4.so" & dllver, "libpython2.4.so" & dllver,
"libpython2.3.so" & dllver, "libpython2.3.so" & dllver,

View file

@ -1,7 +1,6 @@
version 0.9.0 version 0.9.0
============= =============
- implement ``dynlib`` for variables
- implicit deref for parameter matching - implicit deref for parameter matching
- deprecate ``var x, y = 0`` as it's confusing for tuple consistency - deprecate ``var x, y = 0`` as it's confusing for tuple consistency
- test sequence of closures; especially that the GC does not leak for those! - test sequence of closures; especially that the GC does not leak for those!

View file

@ -112,6 +112,7 @@ Compiler Additions
via the ``doc2`` command. This new generator uses all of the semantic passes via the ``doc2`` command. This new generator uses all of the semantic passes
of the compiler and can thus generate documentation for symbols hiding in of the compiler and can thus generate documentation for symbols hiding in
macros. macros.
- The compiler now supports the ``dynlib`` pragma for variables.
Language Additions Language Additions