added undocumented exportNims pragma for Nimscript support
This commit is contained in:
parent
28b1340f94
commit
a2c040e3bd
5 changed files with 68 additions and 25 deletions
|
|
@ -14,22 +14,14 @@ import
|
||||||
|
|
||||||
var systemModule*: PSym
|
var systemModule*: PSym
|
||||||
|
|
||||||
proc registerSysType*(t: PType)
|
|
||||||
# magic symbols in the system module:
|
|
||||||
proc getSysType*(kind: TTypeKind): PType
|
|
||||||
proc getCompilerProc*(name: string): PSym
|
|
||||||
proc registerCompilerProc*(s: PSym)
|
|
||||||
proc finishSystem*(tab: TStrTable)
|
|
||||||
proc getSysSym*(name: string): PSym
|
|
||||||
# implementation
|
|
||||||
|
|
||||||
var
|
var
|
||||||
gSysTypes: array[TTypeKind, PType]
|
gSysTypes: array[TTypeKind, PType]
|
||||||
compilerprocs: TStrTable
|
compilerprocs: TStrTable
|
||||||
|
exposed: TStrTable
|
||||||
|
|
||||||
proc nilOrSysInt*: PType = gSysTypes[tyInt]
|
proc nilOrSysInt*: PType = gSysTypes[tyInt]
|
||||||
|
|
||||||
proc registerSysType(t: PType) =
|
proc registerSysType*(t: PType) =
|
||||||
if gSysTypes[t.kind] == nil: gSysTypes[t.kind] = t
|
if gSysTypes[t.kind] == nil: gSysTypes[t.kind] = t
|
||||||
|
|
||||||
proc newSysType(kind: TTypeKind, size: int): PType =
|
proc newSysType(kind: TTypeKind, size: int): PType =
|
||||||
|
|
@ -37,7 +29,7 @@ proc newSysType(kind: TTypeKind, size: int): PType =
|
||||||
result.size = size
|
result.size = size
|
||||||
result.align = size.int16
|
result.align = size.int16
|
||||||
|
|
||||||
proc getSysSym(name: string): PSym =
|
proc getSysSym*(name: string): PSym =
|
||||||
result = strTableGet(systemModule.tab, getIdent(name))
|
result = strTableGet(systemModule.tab, getIdent(name))
|
||||||
if result == nil:
|
if result == nil:
|
||||||
rawMessage(errSystemNeeds, name)
|
rawMessage(errSystemNeeds, name)
|
||||||
|
|
@ -61,7 +53,7 @@ proc getSysMagic*(name: string, m: TMagic): PSym =
|
||||||
proc sysTypeFromName*(name: string): PType =
|
proc sysTypeFromName*(name: string): PType =
|
||||||
result = getSysSym(name).typ
|
result = getSysSym(name).typ
|
||||||
|
|
||||||
proc getSysType(kind: TTypeKind): PType =
|
proc getSysType*(kind: TTypeKind): PType =
|
||||||
result = gSysTypes[kind]
|
result = gSysTypes[kind]
|
||||||
if result == nil:
|
if result == nil:
|
||||||
case kind
|
case kind
|
||||||
|
|
@ -97,6 +89,7 @@ var
|
||||||
proc resetSysTypes* =
|
proc resetSysTypes* =
|
||||||
systemModule = nil
|
systemModule = nil
|
||||||
initStrTable(compilerprocs)
|
initStrTable(compilerprocs)
|
||||||
|
initStrTable(exposed)
|
||||||
for i in low(gSysTypes)..high(gSysTypes):
|
for i in low(gSysTypes)..high(gSysTypes):
|
||||||
gSysTypes[i] = nil
|
gSysTypes[i] = nil
|
||||||
|
|
||||||
|
|
@ -163,8 +156,8 @@ proc setIntLitType*(result: PNode) =
|
||||||
result.typ = getSysType(tyInt64)
|
result.typ = getSysType(tyInt64)
|
||||||
else: internalError(result.info, "invalid int size")
|
else: internalError(result.info, "invalid int size")
|
||||||
|
|
||||||
proc getCompilerProc(name: string): PSym =
|
proc getCompilerProc*(name: string): PSym =
|
||||||
var ident = getIdent(name, hashIgnoreStyle(name))
|
let ident = getIdent(name)
|
||||||
result = strTableGet(compilerprocs, ident)
|
result = strTableGet(compilerprocs, ident)
|
||||||
if result == nil:
|
if result == nil:
|
||||||
result = strTableGet(rodCompilerprocs, ident)
|
result = strTableGet(rodCompilerprocs, ident)
|
||||||
|
|
@ -173,9 +166,22 @@ proc getCompilerProc(name: string): PSym =
|
||||||
if result.kind == skStub: loadStub(result)
|
if result.kind == skStub: loadStub(result)
|
||||||
if result.kind == skAlias: result = result.owner
|
if result.kind == skAlias: result = result.owner
|
||||||
|
|
||||||
proc registerCompilerProc(s: PSym) =
|
proc registerCompilerProc*(s: PSym) =
|
||||||
strTableAdd(compilerprocs, s)
|
strTableAdd(compilerprocs, s)
|
||||||
|
|
||||||
proc finishSystem(tab: TStrTable) = discard
|
proc registerNimScriptSymbol*(s: PSym) =
|
||||||
|
# Nimscript symbols must be al unique:
|
||||||
|
let conflict = strTableGet(exposed, s.name)
|
||||||
|
if conflict == nil:
|
||||||
|
strTableAdd(exposed, s)
|
||||||
|
else:
|
||||||
|
localError(s.info, "symbol conflicts with other .exportNims symbol at: " &
|
||||||
|
$conflict.info)
|
||||||
|
|
||||||
|
proc getNimScriptSymbol*(name: string): PSym =
|
||||||
|
strTableGet(exposed, getIdent(name))
|
||||||
|
|
||||||
|
proc resetNimScriptSymbols*() = initStrTable(exposed)
|
||||||
|
|
||||||
initStrTable(compilerprocs)
|
initStrTable(compilerprocs)
|
||||||
|
initStrTable(exposed)
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,13 @@ proc resetModule*(fileIdx: int32) =
|
||||||
if fileIdx <% cgendata.gModules.len:
|
if fileIdx <% cgendata.gModules.len:
|
||||||
cgendata.gModules[fileIdx] = nil
|
cgendata.gModules[fileIdx] = nil
|
||||||
|
|
||||||
|
proc resetModule*(module: PSym) =
|
||||||
|
let conflict = getModule(module.position.int32)
|
||||||
|
if conflict == nil: return
|
||||||
|
doAssert conflict == module
|
||||||
|
resetModule(module.position.int32)
|
||||||
|
initStrTable(module.tab)
|
||||||
|
|
||||||
proc resetAllModules* =
|
proc resetAllModules* =
|
||||||
for i in 0..gCompiledModules.high:
|
for i in 0..gCompiledModules.high:
|
||||||
if gCompiledModules[i] != nil:
|
if gCompiledModules[i] != nil:
|
||||||
|
|
|
||||||
|
|
@ -25,18 +25,19 @@ const
|
||||||
wBorrow, wExtern, wImportCompilerProc, wThread, wImportCpp, wImportObjC,
|
wBorrow, wExtern, wImportCompilerProc, wThread, wImportCpp, wImportObjC,
|
||||||
wAsmNoStackFrame, wError, wDiscardable, wNoInit, wDestructor, wCodegenDecl,
|
wAsmNoStackFrame, wError, wDiscardable, wNoInit, wDestructor, wCodegenDecl,
|
||||||
wGensym, wInject, wRaises, wTags, wLocks, wDelegator, wGcSafe,
|
wGensym, wInject, wRaises, wTags, wLocks, wDelegator, wGcSafe,
|
||||||
wOverride, wConstructor}
|
wOverride, wConstructor, wExportNims}
|
||||||
converterPragmas* = procPragmas
|
converterPragmas* = procPragmas
|
||||||
methodPragmas* = procPragmas+{wBase}
|
methodPragmas* = procPragmas+{wBase}
|
||||||
templatePragmas* = {wImmediate, wDeprecated, wError, wGensym, wInject, wDirty,
|
templatePragmas* = {wImmediate, wDeprecated, wError, wGensym, wInject, wDirty,
|
||||||
wDelegator}
|
wDelegator, wExportNims}
|
||||||
macroPragmas* = {FirstCallConv..LastCallConv, wImmediate, wImportc, wExportc,
|
macroPragmas* = {FirstCallConv..LastCallConv, wImmediate, wImportc, wExportc,
|
||||||
wNodecl, wMagic, wNosideeffect, wCompilerproc, wDeprecated, wExtern,
|
wNodecl, wMagic, wNosideeffect, wCompilerproc, wDeprecated, wExtern,
|
||||||
wImportCpp, wImportObjC, wError, wDiscardable, wGensym, wInject, wDelegator}
|
wImportCpp, wImportObjC, wError, wDiscardable, wGensym, wInject, wDelegator,
|
||||||
|
wExportNims}
|
||||||
iteratorPragmas* = {FirstCallConv..LastCallConv, wNosideeffect, wSideeffect,
|
iteratorPragmas* = {FirstCallConv..LastCallConv, wNosideeffect, wSideeffect,
|
||||||
wImportc, wExportc, wNodecl, wMagic, wDeprecated, wBorrow, wExtern,
|
wImportc, wExportc, wNodecl, wMagic, wDeprecated, wBorrow, wExtern,
|
||||||
wImportCpp, wImportObjC, wError, wDiscardable, wGensym, wInject, wRaises,
|
wImportCpp, wImportObjC, wError, wDiscardable, wGensym, wInject, wRaises,
|
||||||
wTags, wLocks, wGcSafe}
|
wTags, wLocks, wGcSafe, wExportNims}
|
||||||
exprPragmas* = {wLine, wLocks, wNoRewrite}
|
exprPragmas* = {wLine, wLocks, wNoRewrite}
|
||||||
stmtPragmas* = {wChecks, wObjChecks, wFieldChecks, wRangechecks,
|
stmtPragmas* = {wChecks, wObjChecks, wFieldChecks, wRangechecks,
|
||||||
wBoundchecks, wOverflowchecks, wNilchecks, wAssertions, wWarnings, wHints,
|
wBoundchecks, wOverflowchecks, wNilchecks, wAssertions, wWarnings, wHints,
|
||||||
|
|
@ -54,15 +55,15 @@ const
|
||||||
wPure, wHeader, wCompilerproc, wFinal, wSize, wExtern, wShallow,
|
wPure, wHeader, wCompilerproc, wFinal, wSize, wExtern, wShallow,
|
||||||
wImportCpp, wImportObjC, wError, wIncompleteStruct, wByCopy, wByRef,
|
wImportCpp, wImportObjC, wError, wIncompleteStruct, wByCopy, wByRef,
|
||||||
wInheritable, wGensym, wInject, wRequiresInit, wUnchecked, wUnion, wPacked,
|
wInheritable, wGensym, wInject, wRequiresInit, wUnchecked, wUnion, wPacked,
|
||||||
wBorrow, wGcSafe}
|
wBorrow, wGcSafe, wExportNims}
|
||||||
fieldPragmas* = {wImportc, wExportc, wDeprecated, wExtern,
|
fieldPragmas* = {wImportc, wExportc, wDeprecated, wExtern,
|
||||||
wImportCpp, wImportObjC, wError, wGuard, wBitsize}
|
wImportCpp, wImportObjC, wError, wGuard, wBitsize}
|
||||||
varPragmas* = {wImportc, wExportc, wVolatile, wRegister, wThreadVar, wNodecl,
|
varPragmas* = {wImportc, wExportc, wVolatile, wRegister, wThreadVar, wNodecl,
|
||||||
wMagic, wHeader, wDeprecated, wCompilerproc, wDynlib, wExtern,
|
wMagic, wHeader, wDeprecated, wCompilerproc, wDynlib, wExtern,
|
||||||
wImportCpp, wImportObjC, wError, wNoInit, wCompileTime, wGlobal,
|
wImportCpp, wImportObjC, wError, wNoInit, wCompileTime, wGlobal,
|
||||||
wGensym, wInject, wCodegenDecl, wGuard, wGoto}
|
wGensym, wInject, wCodegenDecl, wGuard, wGoto, wExportNims}
|
||||||
constPragmas* = {wImportc, wExportc, wHeader, wDeprecated, wMagic, wNodecl,
|
constPragmas* = {wImportc, wExportc, wHeader, wDeprecated, wMagic, wNodecl,
|
||||||
wExtern, wImportCpp, wImportObjC, wError, wGensym, wInject}
|
wExtern, wImportCpp, wImportObjC, wError, wGensym, wInject, wExportNims}
|
||||||
letPragmas* = varPragmas
|
letPragmas* = varPragmas
|
||||||
procTypePragmas* = {FirstCallConv..LastCallConv, wVarargs, wNosideeffect,
|
procTypePragmas* = {FirstCallConv..LastCallConv, wVarargs, wNosideeffect,
|
||||||
wThread, wRaises, wLocks, wTags, wGcSafe}
|
wThread, wRaises, wLocks, wTags, wGcSafe}
|
||||||
|
|
@ -859,6 +860,9 @@ proc singlePragma(c: PContext, sym: PSym, n: PNode, i: int,
|
||||||
invalidPragma(it)
|
invalidPragma(it)
|
||||||
else:
|
else:
|
||||||
sym.flags.incl sfGoto
|
sym.flags.incl sfGoto
|
||||||
|
of wExportNims:
|
||||||
|
if sym == nil: invalidPragma(it)
|
||||||
|
else: magicsys.registerNimScriptSymbol(sym)
|
||||||
of wInjectStmt:
|
of wInjectStmt:
|
||||||
if it.kind != nkExprColonExpr:
|
if it.kind != nkExprColonExpr:
|
||||||
localError(it.info, errExprExpected)
|
localError(it.info, errExprExpected)
|
||||||
|
|
|
||||||
|
|
@ -1411,6 +1411,31 @@ proc execute(c: PCtx, start: int): PNode =
|
||||||
newSeq(tos.slots, c.prc.maxSlots)
|
newSeq(tos.slots, c.prc.maxSlots)
|
||||||
result = rawExecute(c, start, tos).regToNode
|
result = rawExecute(c, start, tos).regToNode
|
||||||
|
|
||||||
|
proc execProc*(c: PCtx; sym: PSym; args: openArray[PNode]): PNode =
|
||||||
|
if sym.kind in routineKinds:
|
||||||
|
if sym.typ.len-1 != args.len:
|
||||||
|
localError(sym.info,
|
||||||
|
"NimScript: expected $# arguments, but got $#" % [
|
||||||
|
$(sym.typ.len-1), $args.len])
|
||||||
|
else:
|
||||||
|
let start = genProc(c, sym)
|
||||||
|
|
||||||
|
var tos = PStackFrame(prc: sym, comesFrom: 0, next: nil)
|
||||||
|
let maxSlots = sym.offset
|
||||||
|
newSeq(tos.slots, maxSlots)
|
||||||
|
|
||||||
|
# setup parameters:
|
||||||
|
if not isEmptyType(sym.typ.sons[0]) or sym.kind == skMacro:
|
||||||
|
putIntoReg(tos.slots[0], getNullValue(sym.typ.sons[0], sym.info))
|
||||||
|
# XXX We could perform some type checking here.
|
||||||
|
for i in 1.. <sym.typ.len:
|
||||||
|
putIntoReg(tos.slots[i], args[i-1])
|
||||||
|
|
||||||
|
result = rawExecute(c, start, tos).regToNode
|
||||||
|
else:
|
||||||
|
localError(sym.info,
|
||||||
|
"NimScript: attempt to call non-routine: " & sym.name.s)
|
||||||
|
|
||||||
proc evalStmt*(c: PCtx, n: PNode) =
|
proc evalStmt*(c: PCtx, n: PNode) =
|
||||||
let n = transformExpr(c.module, n)
|
let n = transformExpr(c.module, n)
|
||||||
let start = genStmt(c, n)
|
let start = genStmt(c, n)
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ type
|
||||||
wImmediate, wConstructor, wDestructor, wDelegator, wOverride,
|
wImmediate, wConstructor, wDestructor, wDelegator, wOverride,
|
||||||
wImportCpp, wImportObjC,
|
wImportCpp, wImportObjC,
|
||||||
wImportCompilerProc,
|
wImportCompilerProc,
|
||||||
wImportc, wExportc, wIncompleteStruct, wRequiresInit,
|
wImportc, wExportc, wExportNims, wIncompleteStruct, wRequiresInit,
|
||||||
wAlign, wNodecl, wPure, wSideeffect, wHeader,
|
wAlign, wNodecl, wPure, wSideeffect, wHeader,
|
||||||
wNosideeffect, wGcSafe, wNoreturn, wMerge, wLib, wDynlib,
|
wNosideeffect, wGcSafe, wNoreturn, wMerge, wLib, wDynlib,
|
||||||
wCompilerproc, wProcVar, wBase,
|
wCompilerproc, wProcVar, wBase,
|
||||||
|
|
@ -126,7 +126,8 @@ const
|
||||||
|
|
||||||
"immediate", "constructor", "destructor", "delegator", "override",
|
"immediate", "constructor", "destructor", "delegator", "override",
|
||||||
"importcpp", "importobjc",
|
"importcpp", "importobjc",
|
||||||
"importcompilerproc", "importc", "exportc", "incompletestruct",
|
"importcompilerproc", "importc", "exportc", "exportnims",
|
||||||
|
"incompletestruct",
|
||||||
"requiresinit", "align", "nodecl", "pure", "sideeffect",
|
"requiresinit", "align", "nodecl", "pure", "sideeffect",
|
||||||
"header", "nosideeffect", "gcsafe", "noreturn", "merge", "lib", "dynlib",
|
"header", "nosideeffect", "gcsafe", "noreturn", "merge", "lib", "dynlib",
|
||||||
"compilerproc", "procvar", "base",
|
"compilerproc", "procvar", "base",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue