parent
0f2aa053d9
commit
1785c6877b
25 changed files with 127 additions and 126 deletions
|
|
@ -20,22 +20,22 @@ import
|
|||
# implementation
|
||||
|
||||
type
|
||||
TEcmasGen = object of TPassContext
|
||||
TJSGen = object of TPassContext
|
||||
module: PSym
|
||||
|
||||
BModule = ref TEcmasGen
|
||||
TEcmasTypeKind = enum # necessary JS "types"
|
||||
BModule = ref TJSGen
|
||||
TJSTypeKind = enum # necessary JS "types"
|
||||
etyNone, # no type
|
||||
etyNull, # null type
|
||||
etyProc, # proc type
|
||||
etyBool, # bool type
|
||||
etyInt, # Ecmascript's int
|
||||
etyFloat, # Ecmascript's float
|
||||
etyString, # Ecmascript's string
|
||||
etyObject, # Ecmascript's reference to an object
|
||||
etyInt, # JavaScript's int
|
||||
etyFloat, # JavaScript's float
|
||||
etyString, # JavaScript's string
|
||||
etyObject, # JavaScript's reference to an object
|
||||
etyBaseIndex # base + index needed
|
||||
TCompRes{.final.} = object
|
||||
kind: TEcmasTypeKind
|
||||
kind: TJSTypeKind
|
||||
com: PRope # computation part
|
||||
# address if this is a (address, index)-tuple
|
||||
res: PRope # result part; index if this is an
|
||||
|
|
@ -91,7 +91,7 @@ const
|
|||
MappedToObject = {tyObject, tyArray, tyArrayConstr, tyTuple, tyOpenArray,
|
||||
tySet, tyVar, tyRef, tyPtr, tyBigNum, tyVarargs}
|
||||
|
||||
proc mapType(typ: PType): TEcmasTypeKind =
|
||||
proc mapType(typ: PType): TJSTypeKind =
|
||||
var t = skipTypes(typ, abstractInst)
|
||||
case t.kind
|
||||
of tyVar, tyRef, tyPtr:
|
||||
|
|
@ -605,8 +605,8 @@ proc genCaseStmt(p: var TProc, n: PNode, r: var TCompRes) =
|
|||
if cond.com != nil: appf(r.com, "$1;$n", [cond.com])
|
||||
stringSwitch = skipTypes(n.sons[0].typ, abstractVar).kind == tyString
|
||||
if stringSwitch:
|
||||
useMagic(p, "toEcmaStr")
|
||||
appf(r.com, "switch (toEcmaStr($1)) {$n", [cond.res])
|
||||
useMagic(p, "toJSStr")
|
||||
appf(r.com, "switch (toJSStr($1)) {$n", [cond.res])
|
||||
else:
|
||||
appf(r.com, "switch ($1) {$n", [cond.res])
|
||||
for i in countup(1, sonsLen(n) - 1):
|
||||
|
|
@ -619,17 +619,17 @@ proc genCaseStmt(p: var TProc, n: PNode, r: var TCompRes) =
|
|||
v = copyNode(e.sons[0])
|
||||
while (v.intVal <= e.sons[1].intVal):
|
||||
gen(p, v, cond)
|
||||
if cond.com != nil: internalError(v.info, "ecmasgen.genCaseStmt")
|
||||
if cond.com != nil: internalError(v.info, "jsgen.genCaseStmt")
|
||||
appf(r.com, "case $1: ", [cond.res])
|
||||
Inc(v.intVal)
|
||||
else:
|
||||
gen(p, e, cond)
|
||||
if cond.com != nil: internalError(e.info, "ecmasgen.genCaseStmt")
|
||||
if cond.com != nil: internalError(e.info, "jsgen.genCaseStmt")
|
||||
if stringSwitch:
|
||||
case e.kind
|
||||
of nkStrLit..nkTripleStrLit: appf(r.com, "case $1: ",
|
||||
[makeJSString(e.strVal)])
|
||||
else: InternalError(e.info, "ecmasgen.genCaseStmt: 2")
|
||||
else: InternalError(e.info, "jsgen.genCaseStmt: 2")
|
||||
else:
|
||||
appf(r.com, "case $1: ", [cond.res])
|
||||
genStmt(p, lastSon(it), stmt)
|
||||
|
|
@ -637,7 +637,7 @@ proc genCaseStmt(p: var TProc, n: PNode, r: var TCompRes) =
|
|||
of nkElse:
|
||||
genStmt(p, it.sons[0], stmt)
|
||||
appf(r.com, "default: $n$1break;$n", [mergeStmt(stmt)])
|
||||
else: internalError(it.info, "ecmasgen.genCaseStmt")
|
||||
else: internalError(it.info, "jsgen.genCaseStmt")
|
||||
appf(r.com, "}$n", [])
|
||||
|
||||
proc genStmtListExpr(p: var TProc, n: PNode, r: var TCompRes)
|
||||
|
|
@ -692,7 +692,7 @@ proc genAsmStmt(p: var TProc, n: PNode, r: var TCompRes) =
|
|||
case n.sons[i].Kind
|
||||
of nkStrLit..nkTripleStrLit: app(r.com, n.sons[i].strVal)
|
||||
of nkSym: app(r.com, mangleName(n.sons[i].sym))
|
||||
else: InternalError(n.sons[i].info, "ecmasgen: genAsmStmt()")
|
||||
else: InternalError(n.sons[i].info, "jsgen: genAsmStmt()")
|
||||
|
||||
proc genIfStmt(p: var TProc, n: PNode, r: var TCompRes) =
|
||||
var
|
||||
|
|
@ -1276,7 +1276,7 @@ proc genMagic(p: var TProc, n: PNode, r: var TCompRes) =
|
|||
binaryStmt(p, n, r, "", "$1 += $2")
|
||||
else:
|
||||
binaryStmt(p, n, r, "", "$1 = ($1.slice(0,-1)).concat($2)")
|
||||
# XXX: make a copy of $2, because of ECMAScript's sucking semantics
|
||||
# XXX: make a copy of $2, because of Javascript's sucking semantics
|
||||
of mAppendSeqElem: binaryStmt(p, n, r, "", "$1.push($2)")
|
||||
of mConStrStr: genConStrStr(p, n, r)
|
||||
of mEqStr: binaryExpr(p, n, r, "eqStrings", "eqStrings($1, $2)")
|
||||
|
|
@ -1395,8 +1395,8 @@ proc convStrToCStr(p: var TProc, n: PNode, r: var TCompRes) =
|
|||
else:
|
||||
gen(p, n.sons[0], r)
|
||||
if r.res == nil: InternalError(n.info, "convStrToCStr")
|
||||
useMagic(p, "toEcmaStr")
|
||||
r.res = ropef("toEcmaStr($1)", [r.res])
|
||||
useMagic(p, "toJSStr")
|
||||
r.res = ropef("toJSStr($1)", [r.res])
|
||||
|
||||
proc convCStrToStr(p: var TProc, n: PNode, r: var TCompRes) =
|
||||
# we do an optimization here as this is likely to slow down
|
||||
|
|
@ -1660,10 +1660,10 @@ proc myClose(b: PPassContext, n: PNode): PNode =
|
|||
discard writeRopeIfNotEqual(con(genHeader(), code), outfile)
|
||||
|
||||
proc myOpenCached(s: PSym, rd: PRodReader): PPassContext =
|
||||
InternalError("symbol files are not possible with the Ecmas code generator")
|
||||
InternalError("symbol files are not possible with the JS code generator")
|
||||
result = nil
|
||||
|
||||
proc myOpen(s: PSym): PPassContext =
|
||||
result = newModule(s)
|
||||
|
||||
const ecmasgenPass* = makePass(myOpen, myOpenCached, myProcess, myClose)
|
||||
const JSgenPass* = makePass(myOpen, myOpenCached, myProcess, myClose)
|
||||
|
|
@ -322,7 +322,7 @@ proc generateThunk(prc: PNode, dest: PType): PNode =
|
|||
|
||||
# we cannot generate a proper thunk here for GC-safety reasons (see internal
|
||||
# documentation):
|
||||
if gCmd == cmdCompileToEcmaScript: return prc
|
||||
if gCmd == cmdCompileToJS: return prc
|
||||
result = newNodeIT(nkClosure, prc.info, dest)
|
||||
var conv = newNodeIT(nkHiddenStdConv, prc.info, dest)
|
||||
conv.add(emptyNode)
|
||||
|
|
@ -543,7 +543,7 @@ proc transformOuterProc(o: POuterContext, n: PNode): PNode =
|
|||
if x != nil: n.sons[i] = x
|
||||
|
||||
proc liftLambdas*(fn: PSym, body: PNode): PNode =
|
||||
if body.kind == nkEmpty or gCmd == cmdCompileToEcmaScript:
|
||||
if body.kind == nkEmpty or gCmd == cmdCompileToJS:
|
||||
# ignore forward declaration:
|
||||
result = body
|
||||
else:
|
||||
|
|
@ -566,7 +566,7 @@ proc liftLambdas*(fn: PSym, body: PNode): PNode =
|
|||
result = ex
|
||||
|
||||
proc liftLambdasForTopLevel*(module: PSym, body: PNode): PNode =
|
||||
if body.kind == nkEmpty or gCmd == cmdCompileToEcmaScript:
|
||||
if body.kind == nkEmpty or gCmd == cmdCompileToJS:
|
||||
result = body
|
||||
else:
|
||||
var o = newOuterContext(module)
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ import
|
|||
llstream, strutils, ast, astalgo, lexer, syntaxes, renderer, options, msgs,
|
||||
os, lists, condsyms, rodread, rodwrite, ropes, trees, times,
|
||||
wordrecg, sem, semdata, idents, passes, docgen, extccomp,
|
||||
cgen, ecmasgen, cgendata,
|
||||
cgen, jsgen, cgendata,
|
||||
platform, nimconf, importer, passaux, depends, evals, types, idgen,
|
||||
tables, docgen2, service, magicsys, parser, crc, ccgutils
|
||||
|
||||
|
|
@ -301,14 +301,15 @@ when has_LLVM_Backend:
|
|||
#registerPass(cleanupPass())
|
||||
compileProject()
|
||||
|
||||
proc CommandCompileToEcmaScript =
|
||||
proc CommandCompileToJS =
|
||||
#incl(gGlobalOptions, optSafeCode)
|
||||
setTarget(osEcmaScript, cpuEcmaScript)
|
||||
setTarget(osJS, cpuJS)
|
||||
#initDefines()
|
||||
DefineSymbol("nimrod") # 'nimrod' is always defined
|
||||
DefineSymbol("ecmascript")
|
||||
DefineSymbol("ecmascript") # For backward compatibility
|
||||
DefineSymbol("js")
|
||||
semanticPasses()
|
||||
registerPass(ecmasgenPass)
|
||||
registerPass(jsgenPass)
|
||||
compileProject()
|
||||
|
||||
proc InteractivePasses =
|
||||
|
|
@ -481,10 +482,10 @@ proc MainCommand =
|
|||
CommandCompileToC()
|
||||
else:
|
||||
rawMessage(errInvalidCommandX, command)
|
||||
of "js", "compiletoecmascript":
|
||||
gCmd = cmdCompileToEcmaScript
|
||||
of "js", "compiletojs":
|
||||
gCmd = cmdCompileToJS
|
||||
wantMainModule()
|
||||
CommandCompileToEcmaScript()
|
||||
CommandCompileToJS()
|
||||
of "compiletollvm":
|
||||
gCmd = cmdCompileToLLVM
|
||||
wantMainModule()
|
||||
|
|
|
|||
|
|
@ -472,32 +472,32 @@ cgen -> wordrecg;
|
|||
cgen -> rnimsyn;
|
||||
cgen -> treetab;
|
||||
cgen -> cgmeth;
|
||||
ecmasgen -> ast;
|
||||
ecmasgen -> astalgo;
|
||||
ecmasgen -> strutils;
|
||||
ecmasgen -> nhashes;
|
||||
ecmasgen -> trees;
|
||||
ecmasgen -> platform;
|
||||
ecmasgen -> magicsys;
|
||||
ecmasgen -> extccomp;
|
||||
ecmasgen -> options;
|
||||
ecmasgen -> nversion;
|
||||
ecmasgen -> nimsets;
|
||||
ecmasgen -> msgs;
|
||||
ecmasgen -> crc;
|
||||
ecmasgen -> bitsets;
|
||||
ecmasgen -> idents;
|
||||
ecmasgen -> lists;
|
||||
ecmasgen -> types;
|
||||
ecmasgen -> os;
|
||||
ecmasgen -> times;
|
||||
ecmasgen -> ropes;
|
||||
ecmasgen -> math;
|
||||
ecmasgen -> passes;
|
||||
ecmasgen -> ccgutils;
|
||||
ecmasgen -> wordrecg;
|
||||
ecmasgen -> rnimsyn;
|
||||
ecmasgen -> rodread;
|
||||
jsgen -> ast;
|
||||
jsgen -> astalgo;
|
||||
jsgen -> strutils;
|
||||
jsgen -> nhashes;
|
||||
jsgen -> trees;
|
||||
jsgen -> platform;
|
||||
jsgen -> magicsys;
|
||||
jsgen -> extccomp;
|
||||
jsgen -> options;
|
||||
jsgen -> nversion;
|
||||
jsgen -> nimsets;
|
||||
jsgen -> msgs;
|
||||
jsgen -> crc;
|
||||
jsgen -> bitsets;
|
||||
jsgen -> idents;
|
||||
jsgen -> lists;
|
||||
jsgen -> types;
|
||||
jsgen -> os;
|
||||
jsgen -> times;
|
||||
jsgen -> ropes;
|
||||
jsgen -> math;
|
||||
jsgen -> passes;
|
||||
jsgen -> ccgutils;
|
||||
jsgen -> wordrecg;
|
||||
jsgen -> rnimsyn;
|
||||
jsgen -> rodread;
|
||||
interact -> llstream;
|
||||
interact -> strutils;
|
||||
interact -> ropes;
|
||||
|
|
@ -561,7 +561,7 @@ main -> passes;
|
|||
main -> docgen;
|
||||
main -> extccomp;
|
||||
main -> cgen;
|
||||
main -> ecmasgen;
|
||||
main -> jsgen;
|
||||
main -> platform;
|
||||
main -> interact;
|
||||
main -> nimconf;
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ Files: "lib/wrappers/zip/libzip_all.c"
|
|||
|
||||
Files: "lib/windows/*.nim"
|
||||
Files: "lib/posix/*.nim"
|
||||
Files: "lib/ecmas/*.nim"
|
||||
Files: "lib/js/*.nim"
|
||||
|
||||
|
||||
[Other]
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ proc HandleCmdLine() =
|
|||
if gCmd == cmdRun:
|
||||
tccgen.run()
|
||||
if optRun in gGlobalOptions:
|
||||
if gCmd == cmdCompileToEcmaScript:
|
||||
if gCmd == cmdCompileToJS:
|
||||
var ex = quoteIfContainsWhite(
|
||||
completeCFilePath(changeFileExt(gProjectFull, "js").prependCurDir))
|
||||
execExternalProgram("node " & ex & ' ' & service.arguments)
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ type # please make sure we have under 32 options
|
|||
TCommands* = enum # Nimrod's commands
|
||||
# **keep binary compatible**
|
||||
cmdNone, cmdCompileToC, cmdCompileToCpp, cmdCompileToOC,
|
||||
cmdCompileToEcmaScript, cmdCompileToLLVM, cmdInterpret, cmdPretty, cmdDoc,
|
||||
cmdCompileToJS, cmdCompileToLLVM, cmdInterpret, cmdPretty, cmdDoc,
|
||||
cmdGenDepend, cmdDump,
|
||||
cmdCheck, # semantic checking for whole project
|
||||
cmdParse, # parse a single file (for debugging)
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ type
|
|||
# conditionals to condsyms (end of module).
|
||||
osNone, osDos, osWindows, osOs2, osLinux, osMorphos, osSkyos, osSolaris,
|
||||
osIrix, osNetbsd, osFreebsd, osOpenbsd, osAix, osPalmos, osQnx, osAmiga,
|
||||
osAtari, osNetware, osMacos, osMacosx, osHaiku, osEcmaScript, osNimrodVM,
|
||||
osAtari, osNetware, osMacos, osMacosx, osHaiku, osJS, osNimrodVM,
|
||||
osStandalone
|
||||
|
||||
type
|
||||
|
|
@ -136,7 +136,7 @@ const
|
|||
objExt: ".o", newLine: "\x0A", pathSep: ":", dirSep: "/",
|
||||
scriptExt: ".sh", curDir: ".", exeExt: "", extSep: ".",
|
||||
props: {ospNeedsPIC, ospPosix, ospLacksThreadVars}),
|
||||
(name: "EcmaScript", parDir: "..",
|
||||
(name: "JS", parDir: "..",
|
||||
dllFrmt: "lib$1.so", altDirSep: "/",
|
||||
objExt: ".o", newLine: "\x0A",
|
||||
pathSep: ":", dirSep: "/",
|
||||
|
|
@ -155,7 +155,7 @@ type
|
|||
# alias conditionals to condsyms (end of module).
|
||||
cpuNone, cpuI386, cpuM68k, cpuAlpha, cpuPowerpc, cpuPowerpc64,
|
||||
cpuSparc, cpuVm, cpuIa64, cpuAmd64, cpuMips, cpuArm,
|
||||
cpuEcmaScript, cpuNimrodVM, cpuAVR
|
||||
cpuJS, cpuNimrodVM, cpuAVR
|
||||
|
||||
type
|
||||
TEndian* = enum
|
||||
|
|
@ -177,7 +177,7 @@ const
|
|||
(name: "amd64", intSize: 64, endian: littleEndian, floatSize: 64, bit: 64),
|
||||
(name: "mips", intSize: 32, endian: bigEndian, floatSize: 64, bit: 32),
|
||||
(name: "arm", intSize: 32, endian: littleEndian, floatSize: 64, bit: 32),
|
||||
(name: "ecmascript", intSize: 32, endian: bigEndian,floatSize: 64,bit: 32),
|
||||
(name: "js", intSize: 32, endian: bigEndian,floatSize: 64,bit: 32),
|
||||
(name: "nimrodvm", intSize: 32, endian: bigEndian, floatSize: 64, bit: 32),
|
||||
(name: "avr", intSize: 16, endian: littleEndian, floatSize: 32, bit: 16)]
|
||||
|
||||
|
|
|
|||
|
|
@ -526,7 +526,7 @@ proc cmdChangeTriggersRecompilation(old, new: TCommands): bool =
|
|||
# new command forces us to consider it here :-)
|
||||
case old
|
||||
of cmdCompileToC, cmdCompileToCpp, cmdCompileToOC,
|
||||
cmdCompileToEcmaScript, cmdCompileToLLVM:
|
||||
cmdCompileToJS, cmdCompileToLLVM:
|
||||
if new in {cmdDoc, cmdCheck, cmdIdeTools, cmdPretty, cmdDef,
|
||||
cmdInteractive}:
|
||||
return false
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue