Browse Source

* Initial version of pascal-to-javascript converter

git-svn-id: trunk@27474 -
michael 11 years ago
parent
commit
0c50662156

+ 8 - 0
.gitattributes

@@ -6167,6 +6167,14 @@ packages/pasjpeg/src/jquant1.pas svneol=native#text/plain
 packages/pasjpeg/src/jquant2.pas svneol=native#text/plain
 packages/pasjpeg/src/jutils.pas svneol=native#text/plain
 packages/pasjpeg/src/pasjpeg.pas svneol=native#text/plain
+packages/pastojs/Makefile svneol=native#text/plain
+packages/pastojs/Makefile.fpc svneol=native#text/plain
+packages/pastojs/fpmake.pp svneol=native#text/plain
+packages/pastojs/src/fppas2js.pp svneol=native#text/plain
+packages/pastojs/tests/tcconverter.pp svneol=native#text/plain
+packages/pastojs/tests/testpas2js.lpi svneol=native#text/plain
+packages/pastojs/tests/testpas2js.pp svneol=native#text/plain
+packages/pastojs/todo.txt svneol=native#text/plain
 packages/paszlib/Makefile svneol=native#text/plain
 packages/paszlib/Makefile.fpc svneol=native#text/plain
 packages/paszlib/Makefile.fpc.fpcmake svneol=native#text/plain

+ 2577 - 0
packages/pastojs/Makefile

@@ -0,0 +1,2577 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2014-02-06 rev 26692]
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-android jvm-java jvm-android i8086-msdos
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx haiku aix
+LIMIT83fs = go32v2 os2 emx watcom msdos
+OSNeedsComspecToRunBatch = go32v2 watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+ifndef RUNBATCH
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+FPC:=$(shell $(FPCPROG) -PB)
+endif
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+else
+ifeq ($(strip $(wildcard $(FPC))),)
+FPC:=$(firstword $(FPCPROG))
+endif
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifeq ($(CPU_TARGET),armeb)
+ARCH=arm
+override FPCOPT+=-Cb
+else
+ifeq ($(CPU_TARGET),armel)
+ARCH=arm
+override FPCOPT+=-CaEABI
+else
+ARCH=$(CPU_TARGET)
+endif
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+ifeq ($(SUBARCH),)
+$(error When compiling for arm-embedded, a sub-architecture (e.g. SUBARCH=armv4t or SUBARCH=armv7m) must be defined)
+endif
+override FPCOPT+=-Cp$(SUBARCH)
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+ifneq ($(findstring $(OS_TARGET),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+endif
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+ifndef CROSSCOMPILE
+BUILDFULLNATIVE=1
+export BUILDFULLNATIVE
+endif
+ifdef BUILDFULLNATIVE
+BUILDNATIVE=1
+export BUILDNATIVE
+endif
+export OS_TARGET OS_SOURCE ARCH CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
+ifeq ($(OS_SOURCE),darwin)
+DARWIN2DARWIN=1
+endif
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+ifneq ($(OS_TARGET),msdos)
+ifndef DARWIN2DARWIN
+ifneq ($(CPU_TARGET),jvm)
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+ifeq ($(OS_TARGET),android)
+ifeq ($(CPU_TARGET),arm)
+BINUTILSPREFIX=arm-linux-androideabi-
+else
+ifeq ($(CPU_TARGET),i386)
+BINUTILSPREFIX=i686-linux-android-
+else
+ifeq ($(CPU_TARGET),mipsel)
+BINUTILSPREFIX=mipsel-linux-android-
+endif
+endif
+endif
+endif
+endif
+endif
+else
+BINUTILSPREFIX=$(OS_TARGET)-
+endif
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+ifndef FPCFPMAKE
+ifdef CROSSCOMPILE
+ifeq ($(strip $(wildcard $(addsuffix /compiler/ppc$(SRCEXEEXT),$(FPCDIR)))),)
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+FPCFPMAKE:=$(shell $(FPCPROG) -PB)
+ifeq ($(strip $(wildcard $(FPCFPMAKE))),)
+FPCFPMAKE:=$(firstword $(FPCPROG))
+endif
+else
+override FPCFPMAKE=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+FPCFPMAKE=$(strip $(wildcard $(addsuffix /compiler/ppc$(SRCEXEEXT),$(FPCDIR))))
+FPMAKE_SKIP_CONFIG=-n
+export FPCFPMAKE
+export FPMAKE_SKIP_CONFIG
+endif
+else
+FPMAKE_SKIP_CONFIG=-n
+FPCFPMAKE=$(FPC)
+endif
+endif
+override PACKAGE_NAME=pastojs
+override PACKAGE_VERSION=2.7.1
+FPMAKE_BIN_CLEAN=$(wildcard ./fpmake$(SRCEXEEXT))
+ifdef OS_TARGET
+FPC_TARGETOPT+=--os=$(OS_TARGET)
+endif
+ifdef CPU_TARGET
+FPC_TARGETOPT+=--cpu=$(CPU_TARGET)
+endif
+LOCALFPMAKE=./fpmake$(SRCEXEEXT)
+override INSTALL_FPCPACKAGE=y
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+EXEDBGEXT=.dbg
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+endif
+ifneq ($(CPU_TARGET),jvm)
+ifeq ($(OS_TARGET),android)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),haiku)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=hai
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+endif
+ifneq ($(findstring $(OS_TARGET),darwin iphonesim),)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+EXEDBGEXT=.dSYM
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+ifeq ($(OS_TARGET),NativeNT)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=nativent
+endif
+ifeq ($(OS_TARGET),wii)
+EXEEXT=.dol
+SHAREDLIBEXT=.so
+SHORTSUFFIX=wii
+endif
+ifeq ($(OS_TARGET),aix)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=aix
+endif
+ifeq ($(OS_TARGET),java)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=java
+endif
+ifeq ($(CPU_TARGET),jvm)
+ifeq ($(OS_TARGET),android)
+OEXT=.class
+ASMEXT=.j
+SHAREDLIBEXT=.jar
+SHORTSUFFIX=android
+endif
+endif
+ifeq ($(OS_TARGET),msdos)
+STATICLIBPREFIX=
+STATICLIBEXT=.a
+SHORTSUFFIX=d16
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+NASMNAME=$(BINUTILSPREFIX)nasm
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+ifndef NASMPROG
+ifdef CROSSBINDIR
+NASMPROG=$(CROSSBINDIR)/$(NASMNAME)$(SRCEXEEXT)
+else
+NASMPROG=$(NASMNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+NASM=$(NASMPROG)
+ifdef inUnix
+PPAS=./ppas$(SRCBATCHEXT)
+else
+PPAS=ppas$(SRCBATCHEXT)
+endif
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=fcl-js fcl-passrc fpmkunit
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-nativent)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-iphonesim)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i386-android)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc-wii)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc-aix)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),x86_64-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),x86_64-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),x86_64-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),arm-android)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-aix)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),mips-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),mipsel-android)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),jvm-java)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),jvm-android)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifeq ($(FULL_TARGET),i8086-msdos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_PASZLIB=1
+REQUIRE_PACKAGES_FCL-PROCESS=1
+REQUIRE_PACKAGES_HASH=1
+REQUIRE_PACKAGES_LIBTAR=1
+REQUIRE_PACKAGES_FPMKUNIT=1
+REQUIRE_PACKAGES_FCL-JS=1
+REQUIRE_PACKAGES_FCL-PASSRC=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_RTL=$(PACKAGEDIR_RTL)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_RTL=$(PACKAGEDIR_RTL)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_RTL=$(PACKAGEDIR_RTL)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL)/$(OS_TARGET) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(OS_TARGET)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+ifdef UNITDIR_FPMAKE_RTL
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_RTL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_PASZLIB
+PACKAGEDIR_PASZLIB:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_PASZLIB),)
+ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)),)
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)/units/$(TARGETSUFFIX)
+else
+UNITDIR_PASZLIB=$(PACKAGEDIR_PASZLIB)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_PASZLIB=$(PACKAGEDIR_PASZLIB)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_PASZLIB)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_PASZLIB=$(PACKAGEDIR_PASZLIB)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_PASZLIB=$(PACKAGEDIR_PASZLIB)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_PASZLIB)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_PASZLIB) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_PASZLIB)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_PASZLIB=
+UNITDIR_PASZLIB:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /paszlib/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_PASZLIB),)
+UNITDIR_PASZLIB:=$(firstword $(UNITDIR_PASZLIB))
+else
+UNITDIR_PASZLIB=
+endif
+endif
+ifdef UNITDIR_PASZLIB
+override COMPILER_UNITDIR+=$(UNITDIR_PASZLIB)
+endif
+ifdef UNITDIR_FPMAKE_PASZLIB
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_PASZLIB)
+endif
+endif
+ifdef REQUIRE_PACKAGES_FCL-PROCESS
+PACKAGEDIR_FCL-PROCESS:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-process/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_FCL-PROCESS),)
+ifneq ($(wildcard $(PACKAGEDIR_FCL-PROCESS)/units/$(TARGETSUFFIX)),)
+UNITDIR_FCL-PROCESS=$(PACKAGEDIR_FCL-PROCESS)/units/$(TARGETSUFFIX)
+else
+UNITDIR_FCL-PROCESS=$(PACKAGEDIR_FCL-PROCESS)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_FCL-PROCESS)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FCL-PROCESS=$(PACKAGEDIR_FCL-PROCESS)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_FCL-PROCESS)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FCL-PROCESS=$(PACKAGEDIR_FCL-PROCESS)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_FCL-PROCESS=$(PACKAGEDIR_FCL-PROCESS)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_FCL-PROCESS)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_FCL-PROCESS) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL-PROCESS)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_FCL-PROCESS=
+UNITDIR_FCL-PROCESS:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl-process/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_FCL-PROCESS),)
+UNITDIR_FCL-PROCESS:=$(firstword $(UNITDIR_FCL-PROCESS))
+else
+UNITDIR_FCL-PROCESS=
+endif
+endif
+ifdef UNITDIR_FCL-PROCESS
+override COMPILER_UNITDIR+=$(UNITDIR_FCL-PROCESS)
+endif
+ifdef UNITDIR_FPMAKE_FCL-PROCESS
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_FCL-PROCESS)
+endif
+endif
+ifdef REQUIRE_PACKAGES_HASH
+PACKAGEDIR_HASH:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /hash/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_HASH),)
+ifneq ($(wildcard $(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)),)
+UNITDIR_HASH=$(PACKAGEDIR_HASH)/units/$(TARGETSUFFIX)
+else
+UNITDIR_HASH=$(PACKAGEDIR_HASH)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_HASH)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_HASH=$(PACKAGEDIR_HASH)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_HASH)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_HASH=$(PACKAGEDIR_HASH)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_HASH=$(PACKAGEDIR_HASH)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_HASH)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_HASH) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_HASH)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_HASH=
+UNITDIR_HASH:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /hash/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_HASH),)
+UNITDIR_HASH:=$(firstword $(UNITDIR_HASH))
+else
+UNITDIR_HASH=
+endif
+endif
+ifdef UNITDIR_HASH
+override COMPILER_UNITDIR+=$(UNITDIR_HASH)
+endif
+ifdef UNITDIR_FPMAKE_HASH
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_HASH)
+endif
+endif
+ifdef REQUIRE_PACKAGES_LIBTAR
+PACKAGEDIR_LIBTAR:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /libtar/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_LIBTAR),)
+ifneq ($(wildcard $(PACKAGEDIR_LIBTAR)/units/$(TARGETSUFFIX)),)
+UNITDIR_LIBTAR=$(PACKAGEDIR_LIBTAR)/units/$(TARGETSUFFIX)
+else
+UNITDIR_LIBTAR=$(PACKAGEDIR_LIBTAR)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_LIBTAR)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_LIBTAR=$(PACKAGEDIR_LIBTAR)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_LIBTAR)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_LIBTAR=$(PACKAGEDIR_LIBTAR)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_LIBTAR=$(PACKAGEDIR_LIBTAR)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_LIBTAR)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_LIBTAR) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_LIBTAR)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_LIBTAR=
+UNITDIR_LIBTAR:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /libtar/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_LIBTAR),)
+UNITDIR_LIBTAR:=$(firstword $(UNITDIR_LIBTAR))
+else
+UNITDIR_LIBTAR=
+endif
+endif
+ifdef UNITDIR_LIBTAR
+override COMPILER_UNITDIR+=$(UNITDIR_LIBTAR)
+endif
+ifdef UNITDIR_FPMAKE_LIBTAR
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_LIBTAR)
+endif
+endif
+ifdef REQUIRE_PACKAGES_FPMKUNIT
+PACKAGEDIR_FPMKUNIT:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fpmkunit/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_FPMKUNIT),)
+ifneq ($(wildcard $(PACKAGEDIR_FPMKUNIT)/units/$(TARGETSUFFIX)),)
+UNITDIR_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)/units/$(TARGETSUFFIX)
+else
+UNITDIR_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_FPMKUNIT)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_FPMKUNIT)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_FPMKUNIT=$(PACKAGEDIR_FPMKUNIT)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_FPMKUNIT)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_FPMKUNIT) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_FPMKUNIT)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_FPMKUNIT=
+UNITDIR_FPMKUNIT:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fpmkunit/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_FPMKUNIT),)
+UNITDIR_FPMKUNIT:=$(firstword $(UNITDIR_FPMKUNIT))
+else
+UNITDIR_FPMKUNIT=
+endif
+endif
+ifdef UNITDIR_FPMKUNIT
+override COMPILER_UNITDIR+=$(UNITDIR_FPMKUNIT)
+endif
+ifdef UNITDIR_FPMAKE_FPMKUNIT
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_FPMKUNIT)
+endif
+endif
+ifdef REQUIRE_PACKAGES_FCL-JS
+PACKAGEDIR_FCL-JS:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-js/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_FCL-JS),)
+ifneq ($(wildcard $(PACKAGEDIR_FCL-JS)/units/$(TARGETSUFFIX)),)
+UNITDIR_FCL-JS=$(PACKAGEDIR_FCL-JS)/units/$(TARGETSUFFIX)
+else
+UNITDIR_FCL-JS=$(PACKAGEDIR_FCL-JS)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_FCL-JS)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FCL-JS=$(PACKAGEDIR_FCL-JS)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_FCL-JS)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FCL-JS=$(PACKAGEDIR_FCL-JS)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_FCL-JS=$(PACKAGEDIR_FCL-JS)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_FCL-JS)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_FCL-JS) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL-JS)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_FCL-JS=
+UNITDIR_FCL-JS:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl-js/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_FCL-JS),)
+UNITDIR_FCL-JS:=$(firstword $(UNITDIR_FCL-JS))
+else
+UNITDIR_FCL-JS=
+endif
+endif
+ifdef UNITDIR_FCL-JS
+override COMPILER_UNITDIR+=$(UNITDIR_FCL-JS)
+endif
+ifdef UNITDIR_FPMAKE_FCL-JS
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_FCL-JS)
+endif
+endif
+ifdef REQUIRE_PACKAGES_FCL-PASSRC
+PACKAGEDIR_FCL-PASSRC:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /fcl-passrc/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_FCL-PASSRC),)
+ifneq ($(wildcard $(PACKAGEDIR_FCL-PASSRC)/units/$(TARGETSUFFIX)),)
+UNITDIR_FCL-PASSRC=$(PACKAGEDIR_FCL-PASSRC)/units/$(TARGETSUFFIX)
+else
+UNITDIR_FCL-PASSRC=$(PACKAGEDIR_FCL-PASSRC)
+endif
+ifneq ($(wildcard $(PACKAGEDIR_FCL-PASSRC)/units/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FCL-PASSRC=$(PACKAGEDIR_FCL-PASSRC)/units/$(SOURCESUFFIX)
+else
+ifneq ($(wildcard $(PACKAGEDIR_FCL-PASSRC)/units_bs/$(SOURCESUFFIX)),)
+UNITDIR_FPMAKE_FCL-PASSRC=$(PACKAGEDIR_FCL-PASSRC)/units_bs/$(SOURCESUFFIX)
+else
+UNITDIR_FPMAKE_FCL-PASSRC=$(PACKAGEDIR_FCL-PASSRC)
+endif
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_FCL-PASSRC)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_FCL-PASSRC) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_FCL-PASSRC)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_FCL-PASSRC=
+UNITDIR_FCL-PASSRC:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /fcl-passrc/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_FCL-PASSRC),)
+UNITDIR_FCL-PASSRC:=$(firstword $(UNITDIR_FCL-PASSRC))
+else
+UNITDIR_FCL-PASSRC=
+endif
+endif
+ifdef UNITDIR_FCL-PASSRC
+override COMPILER_UNITDIR+=$(UNITDIR_FCL-PASSRC)
+endif
+ifdef UNITDIR_FPMAKE_FCL-PASSRC
+override COMPILER_FPMAKE_UNITDIR+=$(UNITDIR_FPMAKE_FCL-PASSRC)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(ARCH)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(ARCH)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+override FPCMAKEOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX)
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifndef CROSSCOMPILE
+ifneq ($(BINUTILSPREFIX),)
+override FPCMAKEOPT+=-XP$(BINUTILSPREFIX)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+endif
+ifneq ($(findstring $(OS_TARGET),freebsd openbsd netbsd linux solaris),)
+ifeq ($(CPU_TARGET),x86_64)
+override FPCOPT+=-Cg
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(strip $(FPC) $(FPCOPT))
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+endif
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_distinstall
+fpc_distinstall: install exampleinstall
+.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall
+ifndef PACKDIR
+ifndef inUnix
+PACKDIR=$(BASEDIR)/../fpc-pack
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+ifndef ZIPNAME
+ifdef DIST_ZIPNAME
+ZIPNAME=$(DIST_ZIPNAME)
+else
+ZIPNAME=$(PACKAGE_NAME)
+endif
+endif
+ifndef FULLZIPNAME
+FULLZIPNAME=$(ZIPCROSSPREFIX)$(ZIPPREFIX)$(ZIPNAME)$(ZIPSUFFIX)
+endif
+ifndef ZIPTARGET
+ifdef DIST_ZIPTARGET
+ZIPTARGET=DIST_ZIPTARGET
+else
+ZIPTARGET=install
+endif
+endif
+ifndef USEZIP
+ifdef inUnix
+USETAR=1
+endif
+endif
+ifndef inUnix
+USEZIPWRAPPER=1
+endif
+ifdef USEZIPWRAPPER
+ZIPPATHSEP=$(PATHSEP)
+ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT))
+else
+ZIPPATHSEP=/
+endif
+ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
+ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
+ifdef USETAR
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
+ZIPCMD_ZIP:=$(TARPROG) c$(TAROPT)f $(ZIPDESTFILE) *
+else
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
+ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
+endif
+fpc_zipinstall:
+	$(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1
+	$(MKDIR) $(DIST_DESTDIR)
+	$(DEL) $(ZIPDESTFILE)
+ifdef USEZIPWRAPPER
+ifneq ($(ECHOREDIR),echo)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER)
+else
+	echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)
+	echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)
+	echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)
+endif
+ifdef inUnix
+	/bin/sh $(ZIPWRAPPER)
+else
+ifdef RUNBATCH
+	$(RUNBATCH) $(ZIPWRAPPER)
+else
+	$(ZIPWRAPPER)
+endif
+endif
+	$(DEL) $(ZIPWRAPPER)
+else
+	$(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE)
+endif
+	$(DELTREE) $(PACKDIR)
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=$(ZIPSOURCESUFFIX)
+fpc_zipexampleinstall:
+ifdef HASEXAMPLES
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=$(ZIPEXAMPLESUFFIX)
+endif
+fpc_zipdistinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=distinstall
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+override CLEANEXEDBGFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEDBGFILES))
+endif
+ifdef CLEAN_PROGRAMS
+override CLEANEXEFILES+=$(addprefix $(TARGETDIRPREFIX),$(addsuffix $(EXEEXT), $(CLEAN_PROGRAMS)))
+override CLEANEXEDBGFILES+=$(addprefix $(TARGETDIRPREFIX),$(addsuffix $(EXEDBGEXT), $(CLEAN_PROGRAMS)))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANEXEDBGFILES
+	-$(DELTREE) $(CLEANEXEDBGFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)  FPC fpmake... $(FPCFPMAKE)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+units:
+examples:
+shared:
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+zipinstall: fpc_zipinstall
+zipsourceinstall: fpc_zipsourceinstall
+zipexampleinstall: fpc_zipexampleinstall
+zipdistinstall: fpc_zipdistinstall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: units examples shared sourceinstall exampleinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+override FPCOPT:=$(filter-out -FU%,$(FPCOPT))
+override FPCOPT:=$(filter-out -FE%,$(FPCOPT))
+ifdef FPMAKEOPT
+FPMAKE_OPT+=$(FPMAKEOPT)
+endif
+FPMAKE_OPT+=--localunitdir=../..
+FPMAKE_OPT+=--globalunitdir=..
+FPMAKE_OPT+=$(FPC_TARGETOPT)
+FPMAKE_OPT+=$(addprefix -o ,$(FPCOPT))
+FPMAKE_OPT+=--compiler=$(FPC)
+FPMAKE_OPT+=-bu
+.NOTPARALLEL:
+fpmake: fpmake.pp
+	$(FPCFPMAKE) fpmake.pp $(FPMAKE_SKIP_CONFIG) $(addprefix -Fu,$(COMPILER_FPMAKE_UNITDIR)) $(FPCMAKEOPT) $(OPT)
+all:	fpmake
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT)
+smart:	fpmake
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -XX -o -CX
+release:	fpmake
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -dRELEASE
+debug:	fpmake
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -dDEBUG
+ifeq ($(FPMAKE_BIN_CLEAN),)
+clean:
+else
+clean:
+	$(FPMAKE_BIN_CLEAN) clean $(FPMAKE_OPT)
+endif
+ifeq ($(FPMAKE_BIN_CLEAN),)
+distclean:	$(addsuffix _distclean,$(TARGET_DIRS)) fpc_cleanall
+else
+distclean:
+ifdef inUnix
+	{ $(FPMAKE_BIN_CLEAN) distclean $(FPMAKE_OPT); if [ $$? != "0" ]; then { echo Something wrong with fpmake exectable. Remove the executable and call make recursively to recover.; $(DEL) $(FPMAKE_BIN_CLEAN); $(MAKE) fpc_cleanall; }; fi;  }
+else
+	$(FPMAKE_BIN_CLEAN) distclean $(FPMAKE_OPT)
+endif
+	-$(DEL) $(LOCALFPMAKE)
+endif
+cleanall: distclean
+install:	fpmake
+ifdef UNIXHier
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_PREFIX) --baseinstalldir=$(INSTALL_LIBDIR)/fpc/$(FPC_VERSION) --unitinstalldir=$(INSTALL_UNITDIR)
+else
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_BASEDIR) --unitinstalldir=$(INSTALL_UNITDIR)
+endif
+distinstall:	fpmake
+ifdef UNIXHier
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_PREFIX) --baseinstalldir=$(INSTALL_LIBDIR)/fpc/$(FPC_VERSION) --unitinstalldir=$(INSTALL_UNITDIR) -ie
+else
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_BASEDIR)  --unitinstalldir=$(INSTALL_UNITDIR) -ie
+endif

+ 89 - 0
packages/pastojs/Makefile.fpc

@@ -0,0 +1,89 @@
+#
+#   Makefile.fpc for running fpmake
+#
+
+[package]
+name=pastojs
+version=2.7.1
+
+[require]
+packages=fcl-js fcl-passrc fpmkunit
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../..
+
+[prerules]
+FPMAKE_BIN_CLEAN=$(wildcard ./fpmake$(SRCEXEEXT))
+ifdef OS_TARGET
+FPC_TARGETOPT+=--os=$(OS_TARGET)
+endif
+ifdef CPU_TARGET
+FPC_TARGETOPT+=--cpu=$(CPU_TARGET)
+endif
+LOCALFPMAKE=./fpmake$(SRCEXEEXT)
+
+[rules]
+# Do not pass the Makefile's unit and binary target locations. fpmake uses it's own.
+override FPCOPT:=$(filter-out -FU%,$(FPCOPT))
+override FPCOPT:=$(filter-out -FE%,$(FPCOPT))
+# Compose general fpmake-parameters
+ifdef FPMAKEOPT
+FPMAKE_OPT+=$(FPMAKEOPT)
+endif
+FPMAKE_OPT+=--localunitdir=../..
+FPMAKE_OPT+=--globalunitdir=..
+FPMAKE_OPT+=$(FPC_TARGETOPT)
+FPMAKE_OPT+=$(addprefix -o ,$(FPCOPT))
+FPMAKE_OPT+=--compiler=$(FPC)
+FPMAKE_OPT+=-bu
+.NOTPARALLEL:
+
+fpmake: fpmake.pp
+	$(FPCFPMAKE) fpmake.pp $(FPMAKE_SKIP_CONFIG) $(addprefix -Fu,$(COMPILER_FPMAKE_UNITDIR)) $(FPCMAKEOPT) $(OPT)
+all:	fpmake
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT)
+smart:	fpmake
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -XX -o -CX
+release:	fpmake
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -dRELEASE
+debug:	fpmake
+	$(LOCALFPMAKE) compile $(FPMAKE_OPT) -o -dDEBUG
+# If no fpmake exists and (dist)clean is called, do not try to build fpmake, it will
+# most often fail because the dependencies are cleared.
+# In case of a clean, simply do nothing
+ifeq ($(FPMAKE_BIN_CLEAN),)
+clean:
+else
+clean:
+	$(FPMAKE_BIN_CLEAN) clean $(FPMAKE_OPT)
+endif
+# In case of a distclean, perform an 'old'-style distclean. This to avoid problems
+# when the package is compiled using fpcmake prior to running this clean using fpmake
+ifeq ($(FPMAKE_BIN_CLEAN),)
+distclean:	$(addsuffix _distclean,$(TARGET_DIRS)) fpc_cleanall
+else
+distclean:
+ifdef inUnix
+        { $(FPMAKE_BIN_CLEAN) distclean $(FPMAKE_OPT); if [ $$? != "0" ]; then { echo Something wrong with fpmake exectable. Remove the executable and call make recursively to recover.; $(DEL) $(FPMAKE_BIN_CLEAN); $(MAKE) fpc_cleanall; }; fi;  }
+else
+        $(FPMAKE_BIN_CLEAN) distclean $(FPMAKE_OPT)
+endif
+	-$(DEL) $(LOCALFPMAKE)
+endif
+cleanall: distclean
+install:	fpmake
+ifdef UNIXHier
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_PREFIX) --baseinstalldir=$(INSTALL_LIBDIR)/fpc/$(FPC_VERSION) --unitinstalldir=$(INSTALL_UNITDIR)
+else
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_BASEDIR) --unitinstalldir=$(INSTALL_UNITDIR)
+endif
+# distinstall also installs the example-sources
+distinstall:	fpmake
+ifdef UNIXHier
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_PREFIX) --baseinstalldir=$(INSTALL_LIBDIR)/fpc/$(FPC_VERSION) --unitinstalldir=$(INSTALL_UNITDIR) -ie
+else
+	$(LOCALFPMAKE) install $(FPMAKE_OPT) --prefix=$(INSTALL_BASEDIR)  --unitinstalldir=$(INSTALL_UNITDIR) -ie
+endif

+ 40 - 0
packages/pastojs/fpmake.pp

@@ -0,0 +1,40 @@
+{$ifndef ALLPACKAGES}
+{$mode objfpc}{$H+}
+program fpmake;
+
+uses fpmkunit;
+
+Var
+  P : TPackage;
+  T : TTarget;
+
+begin
+  With Installer do 
+    begin
+{$endif ALLPACKAGES}
+
+    P:=AddPackage('pastojs');
+{$ifdef ALLPACKAGES}
+    P.Directory:=ADirectory;
+{$endif ALLPACKAGES}
+
+    P.Version:='2.7.1';
+    P.OSes := AllOses;
+    P.Dependencies.Add('fcl-js');
+    P.Dependencies.Add('fcl-passrc');
+
+    P.Author := 'Free Pascal development team';
+    P.License := 'LGPL with modification, ';
+    P.HomepageURL := 'www.freepascal.org';
+
+    P.SourcePath.Add('src');
+    P.SupportBuildModes := [bmOneByOne];
+
+    P.Options.Add('-S2h');
+
+    T:=P.Targets.AddUnit('fppas2js.pp');
+{$ifndef ALLPACKAGES}
+    Run;
+    end;
+end.
+{$endif ALLPACKAGES}

+ 1379 - 0
packages/pastojs/src/fppas2js.pp

@@ -0,0 +1,1379 @@
+{
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2014 by Michael Van Canneyt
+
+    Pascal to Javascript converter class.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit fppas2js;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+httpdefs,  Classes, SysUtils, jsbase, jstree, pastree, pparser;
+
+Type
+  EPas2JS = Class(Exception);
+  { TPasToJSConverter }
+  TConvertContext = Class(TObject)
+
+  end;
+
+  TPasToJSConverter = Class(TObject)
+  private
+    FCurrentContext: TJSElement;
+    FMainFunction: TJSString;
+    FNameSpace: TJSString;
+    Procedure AddToSourceElements(Src: TJSSourceElements; El: TJSElement);
+    Function CreateConstDecl(El: TPasElement; AContext: TConvertContext): TJSElement;
+    Function CreateIdentifierExpr(AName: String; El: TPasElement; AContext: TConvertContext): TJSElement;
+    Function CreateTypeDecl(El: TPasElement; AContext: TConvertContext): TJSElement;
+    Function CreateVarDecl(El: TPasElement; AContext: TConvertContext): TJSElement;
+    procedure SetCurrentContext(AValue: TJSElement);
+  protected
+    // helper functions
+    Procedure DoError(Const Msg : String);
+    Procedure DoError(Const Msg : String; Const Args : Array of Const);
+    // Never create an element manually, always use the below function
+    Function CreateElement(C: TJSElementClass; Src: TPasElement): TJSElement; virtual;
+    Function GetExpressionValueType(El: TPasExpr; AContext: TConvertContext ): TJSType; virtual;
+    Function GetIdentValueType(AName: String; AContext: TConvertContext): TJSType; virtual;
+    Function TransFormIdent(El: TJSPrimaryExpressionIdent; AContext : TConvertContext): TJSElement;virtual;
+    Function CreateJSContext(AContext : TConvertContext): TJSElement;virtual;
+    Function TransFormVariableName(Const AName :  String; AContext : TConvertContext) : String;
+    Function TransFormVariableName(El : TPasElement; AContext : TConvertContext) : String;
+    Function TransFormFunctionName(El : TPasElement; AContext : TConvertContext) : String;
+    Function GetExceptionObjectname(AContext : TConvertContext) : String;
+    Function ResolveType(El : TPasElement; AContext : TConvertContext) : TPasType;
+    // Statements
+    Function ConvertImplBlockElements(El: TPasImplBlock; AContext: TConvertContext): TJSElement;virtual;
+    Function ConvertBeginEndStatement(El: TPasImplBeginBlock; AContext: TConvertContext): TJSElement;virtual;
+    Function ConvertStatement(El: TPasImplStatement; AContext: TConvertContext ): TJSElement;virtual;
+    Function ConvertAssignStatement(El: TPasImplAssign; AContext: TConvertContext): TJSElement; virtual;
+    Function ConvertRaiseStatement(El: TPasImplRaise; AContext: TConvertContext ): TJSElement; virtual;
+    Function ConvertIfStatement(El: TPasImplIfElse; AContext: TConvertContext ): TJSElement; virtual;
+    Function ConvertWhileStatement(El: TPasImplWhileDo; AContext: TConvertContext): TJSElement; virtual;
+    Function ConvertRepeatStatement(El: TPasImplRepeatUntil; AContext: TConvertContext): TJSElement; virtual;
+    Function ConvertForStatement(El: TPasImplForLoop; AContext: TConvertContext): TJSElement; virtual;
+    Function ConvertFinalizationSection(El: TFinalizationSection; AContext: TConvertContext): TJSElement;virtual;
+    Function ConvertInitializationSection(El: TInitializationSection; AContext: TConvertContext): TJSElement;virtual;
+    Function ConvertSimpleStatement(El: TPasImplSimple; AContext: TConvertContext): TJSElement;virtual;
+    Function ConvertTryStatement(El: TPasImplTry; AContext: TConvertContext ): TJSElement;virtual;
+    Function ConvertWithStatement(El: TPasImplWithDo; AContext: TConvertContext): TJSElement;virtual;
+    Function ConvertTryFinallyStatement(El: TPasImplTryFinally; AContext: TConvertContext): TJSElement;virtual;
+    Function ConvertExceptOn(El: TPasImplExceptOn; AContext: TConvertContext): TJSElement;
+    Function ConvertTryExceptStatement(El: TPasImplTryExcept; AContext: TConvertContext): TJSElement;
+    // Expressions
+    Function ConvertArrayValues(El: TArrayValues; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertInheritedExpression(El: TInheritedExpr; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertNilExpr(El: TNilExpr; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertParamsExpression(El: TParamsExpr; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertRecordValues(El: TRecordValues; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertSelfExpression(El: TSelfExpr; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertBinaryExpression(El: TBinaryExpr; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertBoolConstExpression(El: TBoolConstExpr; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertPrimitiveExpression(El: TPrimitiveExpr; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertUnaryExpression(El: TUnaryExpr; AContext : TConvertContext ): TJSElement;virtual;
+    Function ConvertCallExpression(El: TParamsExpr; AContext : TConvertContext ): TJSElement;virtual;
+    Function TransFormStringLiteral(S : String) : String;
+    // Convert various TPasElement nodes
+    Function ConvertProperty(El: TPasProperty; AContext : TConvertContext ): TJSElement;virtual;
+    Function ConvertCommand(El: TPasImplCommand; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertCommands(El: TPasImplCommands; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertConst(El: TPasConst; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertDeclarations(El: TPasDeclarations; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertExportSymbol(El: TPasExportSymbol; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertExpression(El: TPasExpr; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertImplBlock(El: TPasImplBlock; AContext : TConvertContext ): TJSElement;virtual;
+    Function ConvertLabelMark(El: TPasImplLabelMark; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertLabels(El: TPasLabels; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertModule(El: TPasModule; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertPackage(El: TPasPackage; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertArgument(El: TPasArgument; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertProcedure(El: TPasProcedure; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertProcedureImpl(El: TPasProcedureImpl; AContext : TConvertContext    ): TJSElement;virtual;
+    Function ConvertResString(El: TPasResString; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertResultElement(El: TPasResultElement; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertType(El: TPasElement; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertVariable(El: TPasVariable; AContext : TConvertContext): TJSElement;virtual;
+    Function ConvertElement(El : TPasElement; AContext : TConvertContext) : TJSElement; virtual;
+
+    Property CurrentContext : TJSElement Read FCurrentContext Write SetCurrentContext;
+  Public
+    Function ConvertElement(El : TPasElement) : TJSElement;
+    Property NameSpace : TJSString Read FNameSpace Write FNameSpace;
+    Property MainFunction : TJSString Read FMainFunction Write FMainFunction;
+  end;
+  EPasToJS = Class(Exception);
+
+implementation
+
+resourcestring
+  SErrUNknownExpressionClass = 'Unknown expression class: %s';
+  SErrUnexpected = 'Unexpected class: %s';
+  SerrInitalizedArray = 'Initialized array variables not yet supported';
+
+{ TPasToJSConverter }
+
+Procedure TPasToJSConverter.AddToSourceElements(Src : TJSSourceElements; El : TJSElement);
+
+Var
+  L : TJSStatementList;
+  A : TJSElement;
+
+begin
+  Repeat
+    if Not (EL is TJSStatementList) then
+      begin
+      A:=EL;
+      El:=Nil;
+      end
+    else
+      begin
+      L:=EL as TJSStatementList;
+      A:=L.A;
+      EL:=L.B;
+      L.A:=Nil;
+      L.B:=Nil;
+      FreeAndNil(L);
+      end;
+    Src.Statements.AddNode.Node:=A;
+  until (El=Nil);
+end;
+
+Function TPasToJSConverter.ConvertModule(El: TPasModule; AContext : TConvertContext): TJSElement;
+
+Var
+  I : Integer;
+  Src : TJSSourceElements;
+
+begin
+  Result:=Nil;
+  Src:=TJSSourceElements(CreateElement(TJSSourceElements,El));
+  Result:=Src;
+  if Assigned(El.InterfaceSection) then
+    AddToSourceElements(Src,ConvertElement(El.InterfaceSection,AContext));
+  if assigned(El.ImplementationSection) then
+    AddToSourceElements(Src,ConvertElement(El.ImplementationSection,AContext));
+  if (El is TPasProgram) then
+    begin
+    if Assigned(TPasProgram(El).ProgramSection) then
+      AddToSourceElements(Src,ConvertElement(TPasProgram(El).ProgramSection,AContext));
+    end;
+  if Assigned(El.InitializationSection) then
+    AddToSourceElements(Src,ConvertElement(El.InitializationSection,AContext));
+  if Assigned(El.FinalizationSection) then
+    AddToSourceElements(Src,ConvertElement(El.FinalizationSection,AContext));
+{
+TPasUnitModule = Class(TPasModule)
+TPasLibrary = class(TPasModule)
+}
+end;
+
+Function TPasToJSConverter.CreateElement(C : TJSElementClass; Src : TPasElement) : TJSElement;
+
+begin
+  if Assigned(Src) then
+    Result:=C.Create(Src.SourceLinenumber,1,Src.SourceFilename)
+  else
+    Result:=C.Create(0,0,'');
+end;
+
+Function TPasToJSConverter.ConvertUnaryExpression(El: TUnaryExpr; AContext : TConvertContext): TJSElement;
+
+Var
+  C : TJSElementClass;
+  U : TJSUnaryExpression;
+  E : TJSElement;
+
+begin
+  Result:=Nil;
+  E:=ConvertElement(El.Operand);
+  Case el.OpCode of
+    eopAdd:
+      begin
+      U:=TJSUnaryPlusExpression(CreateElement(TJSUnaryPlusExpression,El));
+      U.A:=E;
+      end;
+    eopSubtract:
+      begin
+      U:=TJSUnaryPlusExpression(CreateElement(TJSUnaryMinusExpression,El));
+      U.A:=E;
+      end;
+  end;
+  Result:=U;
+end;
+
+Function TPasToJSConverter.ConvertCallExpression(El: TParamsExpr;
+  AContext: TConvertContext): TJSElement;
+Var
+  C : TJSElementClass;
+  U : TJSUnaryExpression;
+  E : TJSElement;
+  Id : TJSPrimaryExpressionIdent;
+
+begin
+  Raise EPasToJS.CreateFmt(SErrUnexpected,[EL.ClassName]);
+  Result:=Nil;
+  ID:=TJSPrimaryExpressionIdent(CreateElement(TJSPrimaryExpressionIdent,EL));
+  Case el.OpCode of
+    eopAdd:
+      begin
+      U:=TJSUnaryPlusExpression(CreateElement(TJSUnaryPlusExpression,El));
+      U.A:=E;
+      end;
+    eopSubtract:
+      begin
+      U:=TJSUnaryPlusExpression(CreateElement(TJSUnaryMinusExpression,El));
+      U.A:=E;
+      end;
+  end;
+  Result:=U;
+end;
+
+Function TPasToJSConverter.TransFormStringLiteral(S: String): String;
+begin
+  // This needs some more complicated algorithm that handles #13"abc etc.
+  Result:=Copy(S,2,Length(S)-2);
+  Result:=StringReplace(Result,'''''','''',[rfReplaceAll]);
+end;
+
+
+Function TPasToJSConverter.GetIdentValueType(AName : String; AContext : TConvertContext): TJSType;
+
+begin
+  Result:=jstUNDEFINED;
+end;
+
+
+Function TPasToJSConverter.GetExpressionValueType(El : TPasExpr; AContext : TConvertContext) : TJSType;
+
+  Function CombineValueType(A,B : TJSType) : TJSType;
+
+  begin
+    If (A=jstUndefined) then
+      Result:=B
+    else if (B=jstundefined) then
+      Result:=A
+    else
+      Result:=A; // pick the first
+  end;
+
+Var
+  A,B : TJSType;
+
+begin
+  if (El is TBoolConstExpr) then
+    Result:=jstBoolean
+  else  If (EL is TPrimitiveExpr) then
+    begin
+    Case EL.Kind of
+      pekIdent : Result:=GetIdentValueType(El.Name,AContext);
+      pekNumber : Result:=jstNumber;
+      pekString : Result:=jstString;
+      pekSet : Result:=jstUNDEFINED;
+      pekNil : Result:=jstNull;
+      pekBoolConst : Result:=jstBoolean;
+      pekRange : Result:=jstUNDEFINED;
+      pekFuncParams : Result:=jstUNDEFINED;
+      pekArrayParams : Result:=jstUNDEFINED;
+      pekListOfExp : Result:=jstUNDEFINED;
+      pekInherited : Result:=jstUNDEFINED;
+      pekSelf : Result:=jstObject;
+    end
+    end
+  else if (EL is TUnaryExpr) then
+    Result:=GetExpressionValueType(TUnaryExpr(El).Operand,AContext)
+  else if (EL is TBinaryExpr) then
+    begin
+    A:=GetExpressionValueType(TBinaryExpr(El).Left,AContext);
+    B:=GetExpressionValueType(TBinaryExpr(El).Right,AContext);
+    Result:=CombineValueType(A,B);
+    end
+  else
+    result:=jstUndefined
+end;
+
+Function TPasToJSConverter.ConvertBinaryExpression(El: TBinaryExpr; AContext : TConvertContext): TJSElement;
+
+Type
+  TJSBinaryClass = Class of TJSBinary;
+
+Const
+  BinClasses : Array [TExprOpCode] of TJSBinaryClass = (
+   Nil, //eopEmpty,
+   TJSAdditiveExpressionPlus,
+   TJSAdditiveExpressionMinus,
+   TJSMultiplicativeExpressionMul,
+   TJSMultiplicativeExpressionDiv,
+   TJSMultiplicativeExpressionDiv,
+   TJSMultiplicativeExpressionMod,
+   Nil, //eopPower
+   TJSRShiftExpression,
+   TJSLShiftExpression,
+   Nil, // Not
+   Nil, // And
+   Nil, // Or
+   Nil, // XOr
+   TJSEqualityExpressionEQ,
+   TJSEqualityExpressionNE,
+   TJSRelationalExpressionLT,
+   TJSRelationalExpressionGT,
+   TJSRelationalExpressionLE,
+   TJSRelationalExpressionGE,
+   Nil, // In
+   TJSRelationalExpressionInstanceOf, // is
+   Nil, // As
+   Nil, // Symmetrical diff
+   Nil, // Address,
+   Nil, // Deref
+   Nil  // SubIndent,
+  );
+
+Var
+  R : TJSBinary;
+  C : TJSBinaryClass;
+  A,B : TJSElement;
+
+begin
+  Result:=Nil;
+  C:=BinClasses[EL.OpCode];
+  A:=ConvertElement(EL.left,AContext);
+  try
+    B:=ConvertElement(EL.right,AContext);
+  except
+    FreeAndNil(A);
+    Raise;
+  end;
+  if (C=Nil) then
+    Case EL.OpCode of
+      eopAs : begin
+              Result:=ConvertElement(El.Left,AContext);
+              end;
+      eopAnd,
+      eopOr,
+      eopXor :
+        begin
+        if (GetExpressionValueType(EL.Left,AContext)=jstNumber)
+            or (GetExpressionValueType(EL.Right,AContext)=jstNumber) then
+          Case EL.OpCode of
+            eopAnd : C:=TJSBitwiseAndExpression;
+            eopOr : C:=TJSBitwiseOrExpression;
+            eopXor : C:=TJSBitwiseXOrExpression;
+          end
+        else
+          Case EL.OpCode of
+            eopAnd : C:=TJSLogicalAndExpression;
+            eopOr : C:=TJSLogicalOrExpression;
+            eopXOR : DoError('Logical XOR not supported yet');
+          end;
+        end;
+      eopSubIdent :
+        begin
+        Result:=TJSDotMemberExpression(CreateElement(TJSDotMemberExpression,El));
+        TJSDotMemberExpression(Result).Mexpr:=A;
+        if Not (B is TJSPrimaryExpressionIdent) then
+          DOError('Member expression must be an identifier');
+        TJSDotMemberExpression(Result).Name:=TJSPrimaryExpressionIdent(B).Name;
+        FreeAndNil(B);
+        end
+    else
+      DoError('Unknown/Unsupported operand type for binary expression');
+    end;
+  if (Result=Nil) and (C<>Nil) then
+    begin
+    R:=TJSBinary(CreateElement(C,EL));
+    R.A:=A;
+    R.B:=B;
+    Result:=R;
+    end;
+end;
+
+Function TPasToJSConverter.TransFormIdent(El: TJSPrimaryExpressionIdent; AContext : TConvertContext): TJSElement;
+
+begin
+  EL.Name:=LowerCase(EL.Name);
+  Result:=El;
+end;
+
+
+Function TPasToJSConverter.CreateIdentifierExpr(AName : String; El : TPasElement; AContext : TConvertContext): TJSElement;
+
+Var
+  I : TJSPrimaryExpressionIdent;
+
+begin
+  I:=TJSPrimaryExpressionIdent(CreateElement(TJSPrimaryExpressionIdent,El));
+  I.Name:=AName;
+  Result:=TransFormIdent(I,AContext);
+end;
+
+Function TPasToJSConverter.ConvertPrimitiveExpression(El: TPrimitiveExpr; AContext : TConvertContext): TJSElement;
+
+Var
+  L : TJSLiteral;
+  D : TJSNumber;
+  C : Integer;
+
+begin
+  Result:=Nil;
+  case El.Kind of
+    pekString:
+      begin
+      L:=TJSLiteral(CreateElement(TJSLiteral,El));
+      L.Value.AsString:=TransFormStringLiteral(El.Value);
+      Result:=L;
+      end;
+    pekNumber:
+      begin
+      L:=TJSLiteral(CreateElement(TJSLiteral,El));
+      Val(El.Value,D,C);
+      if C<>0 then
+        DoError('Invalid number: %s',[EL.Value]);
+      L.Value.AsNumber:=D;
+      Result:=L;
+      end;
+    pekIdent:
+      begin
+      Result:=CreateIdentifierExpr(El.Value,El,AContext);
+      end;
+  end;
+end;
+
+
+Function TPasToJSConverter.ConvertBoolConstExpression(El: TBoolConstExpr; AContext : TConvertContext): TJSElement;
+
+Var
+  L : TJSLiteral;
+
+begin
+  Result:=Nil;
+  L:=TJSLiteral(CreateElement(TJSLiteral,El));
+  L.Value.AsBoolean:=EL.Value;
+  Result:=L;
+end;
+
+Function TPasToJSConverter.ConvertNilExpr(El: TNilExpr; AContext : TConvertContext): TJSElement;
+
+Var
+  L : TJSLiteral;
+
+begin
+  L:=TJSLiteral(CreateElement(TJSLiteral,El));
+  L.Value.IsNull:=True;
+  Result:=L;
+end;
+
+Function TPasToJSConverter.ConvertInheritedExpression(El: TInheritedExpr; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+//  TInheritedExpr = class(TPasExpr)
+end;
+
+Function TPasToJSConverter.ConvertSelfExpression(El: TSelfExpr; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=TJSPrimaryExpressionThis(CreateElement(TJSPrimaryExpressionThis,El));
+end;
+
+Function TPasToJSConverter.ConvertParamsExpression(El: TParamsExpr; AContext : TConvertContext): TJSElement;
+
+Var
+  b,B2 : TJSBracketMemberExpression;
+  C : TJSCallExpression;
+  I : Integer;
+  E : TJSElement;
+
+begin
+  Result:=Nil;
+  Case EL.Kind of
+  pekFuncParams :
+    begin
+    C:=TJSCallExpression(CreateElement(TJSCallExpression,El));
+    try
+      C.Expr:=ConvertElement(El.Value,AContext);
+      if (Length(EL.Params)>0) then
+        begin
+        C.Args:=TJSArguments(CreateElement(TJSArguments,El));
+        For I:=0 to Length(EL.Params)-1 do
+          begin
+          E:=ConvertElement(EL.Params[i]);
+          C.Args.Elements.AddElement.Expr:=E;
+          end;
+        end;
+    except
+      FreeAndNil(C);
+      Raise;
+    end;
+    Result:=C;
+    end;
+  pekArrayParams:
+    begin
+    if Length(EL.Params)<>1 then
+      Raise EPasToJS.Create('Only 1-dimensional expressions allowed at this point');
+    B:=TJSBracketMemberExpression(CreateElement(TJSBracketMemberExpression,El));;
+    B.Mexpr:=ConvertElement(El.Value,AContext);
+    Result:=B;
+    B.Name:=ConvertElement(EL.Params[0],AContext);
+    end
+  end;
+end;
+
+Function TPasToJSConverter.ConvertRecordValues(El: TRecordValues; AContext : TConvertContext): TJSElement;
+
+Var
+  R :  TJSObjectLiteral;
+  I : Integer;
+  It : TRecordValuesItem;
+  rel : TJSObjectLiteralElement;
+
+begin
+  R:=TJSObjectLiteral(CreateElement(TJSObjectLiteral,El));
+  For I:=0 to Length(El.Fields)-1 do
+    begin
+    it:=El.Fields[i];
+    Rel:=R.Elements.AddElement;
+    Rel.Name:=it.Name;
+    Rel.Expr:=ConvertElement(it.ValueExp,AContext);
+    end;
+  Result:=R;
+end;
+
+Function TPasToJSConverter.ConvertArrayValues(El: TArrayValues; AContext : TConvertContext): TJSElement;
+
+Var
+  R :  TJSArrayLiteral;
+  I : Integer;
+  rel : TJSArrayLiteralElement;
+
+begin
+  R:=TJSArrayLiteral(CreateElement(TJSObjectLiteral,El));
+  For I:=0 to Length(El.Values)-1 do
+    begin
+    Rel:=R.Elements.AddElement;
+    Rel.ElementIndex:=i;
+    Rel.Expr:=ConvertElement(El.Values[i],AContext);
+    end;
+  Result:=R;
+end;
+
+Function TPasToJSConverter.ConvertExpression(El: TPasExpr; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+  if (El is TUnaryExpr) then
+    Result:=ConvertUnaryExpression(TUnaryExpr(El),AContext)
+  else if (El is TBinaryExpr) then
+    Result:=ConvertBinaryExpression(TBinaryExpr(El),AContext)
+  else if (El is TPrimitiveExpr) then
+    Result:=ConvertPrimitiveExpression(TPrimitiveExpr(El),AContext)
+  else if (El is TBoolConstExpr) then
+    Result:=ConvertBoolConstExpression(TBoolConstExpr(El),AContext)
+  else if (El is TNilExpr) then
+    Result:=ConvertNilExpr(TNilExpr(El),AContext)
+  else if (El is TInheritedExpr) then
+    Result:=ConvertInheritedExpression(TInheritedExpr(El),AContext)
+  else if (El is TSelfExpr) then
+    Result:=ConvertSelfExpression(TSelfExpr(El),AContext)
+  else if (El is TParamsExpr) then
+    Result:=ConvertParamsExpression(TParamsExpr(El),AContext)
+  else if (El is TRecordValues) then
+    Result:=ConvertRecordValues(TRecordValues(El),AContext)
+  else if (El is TRecordValues) then
+    Result:=ConvertRecordValues(TRecordValues(El),AContext)
+  else
+    DoError(SErrUNknownExpressionClass,[EL.ClassName])
+end;
+
+Function TPasToJSConverter.CreateConstDecl(El: TPasElement; AContext : TConvertContext): TJSElement;
+
+Var
+  C : TJSElement;
+  V : TJSVariableStatement;
+
+begin
+  C:=ConvertElement(El,AContext);
+  V:=TJSVariableStatement(CreateElement(TJSVariableStatement,El));
+  V.A:=C;
+  Result:=V;
+end;
+
+Function TPasToJSConverter.CreateTypeDecl(El: TPasElement; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+  // Need to do something for classes and records.
+end;
+
+Function TPasToJSConverter.CreateVarDecl(El: TPasElement; AContext : TConvertContext): TJSElement;
+
+Var
+  C : TJSElement;
+  V : TJSVariableStatement;
+
+begin
+  C:=ConvertElement(El,AContext);
+  V:=TJSVariableStatement(CreateElement(TJSVariableStatement,El));
+  V.A:=C;
+  Result:=V;
+end;
+
+Function TPasToJSConverter.ConvertDeclarations(El: TPasDeclarations; AContext : TConvertContext): TJSElement;
+
+Var
+  P : TPasElement;
+  SL,SL2 : TJSStatementList;
+  E : TJSElement;
+  I : Integer;
+
+  Procedure AddToSL;
+
+  begin
+    if Assigned(E) then
+      begin
+      if Assigned(SL.A) then
+        begin
+        SL2:=TJSStatementList(CreateElement(TJSStatementList,El));
+        SL.B:=SL2;
+        SL:=SL2;
+        end;
+      SL.A:=E;
+      end;
+  end;
+
+begin
+  SL:=TJSStatementList(CreateElement(TJSStatementList,El));
+  Result:=SL;
+  For I:=0 to El.Declarations.Count-1 do
+    begin
+    E:=Nil;
+    P:=TPasElement(El.Declarations[i]);
+    if P is TPasConst then
+      E:=CreateConstDecl(P,AContext)
+    else if P is TPasVariable then
+      E:=CreateVarDecl(P,AContext)
+    else if P is TPasType then
+      E:=CreateTypeDecl(P,AContext)
+    else if P is TPasProcedure then
+      E:=ConvertElement(P as TPasProcedure,AContext)
+    else
+      DoError('Unknown class: "%s" ',[P.ClassName]);
+    AddToSL;
+    end;
+  if (El is TProcedureBody) then
+    begin
+    E:=ConvertElement(TProcedureBody(El).Body,AContext);
+    AddToSl;
+    end;
+{
+  TPasDeclarations = class(TPasElement)
+  TPasSection = class(TPasDeclarations)
+  TInterfaceSection = class(TPasSection)
+  TImplementationSection = class(TPasSection)
+  TProgramSection = class(TImplementationSection)
+  TLibrarySection = class(TImplementationSection)
+  TProcedureBody = class(TPasDeclarations)
+}
+end;
+
+Function TPasToJSConverter.ConvertType(El: TPasElement; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+{
+
+TPasType = class(TPasElement)
+TPasPointerType = class(TPasType)
+TPasAliasType = class(TPasType)
+TPasTypeAliasType = class(TPasAliasType)
+TPasClassOfType = class(TPasAliasType)
+TPasRangeType = class(TPasType)
+TPasArrayType = class(TPasType)
+TPasFileType = class(TPasType)
+TPasEnumValue = class(TPasElement)
+TPasEnumType = class(TPasType)
+TPasSetType = class(TPasType)
+TPasVariant = class(TPasElement)
+TPasRecordType = class(TPasType)
+TPasClassType = class(TPasType)
+TPasProcedureType = class(TPasType)
+TPasFunctionType = class(TPasProcedureType)
+TPasUnresolvedSymbolRef = class(TPasType)
+TPasUnresolvedTypeRef = class(TPasUnresolvedSymbolRef)
+TPasUnresolvedUnitRef = Class(TPasUnresolvedSymbolRef)
+TPasStringType = class(TPasUnresolvedTypeRef)
+TPasTypeRef = class(TPasUnresolvedTypeRef)
+}
+end;
+
+Function TPasToJSConverter.ConvertProcedure(El: TPasProcedure; AContext : TConvertContext): TJSElement;
+
+Var
+  FS : TJSFunctionDeclarationStatement;
+  FD : TJSFuncDef;
+
+begin
+  FS:=TJSFunctionDeclarationStatement(CreateElement(TJSFunctionDeclarationStatement,EL));
+  Result:=FS;
+  FD:=TJSFuncDef.Create;
+  FD.Name:=TransFormFunctionName(El,AContext);
+  FS.AFunction:=FD;
+  FD.Body:=TJSFunctionBody(CreateElement(TJSFunctionBody,EL.Body));
+  FD.Body.A:=ConvertElement(El.Body,AContext);
+  {
+  TPasProcedureBase = class(TPasElement)
+  TPasOverloadedProc = class(TPasProcedureBase)
+  TPasProcedure = class(TPasProcedureBase)
+  TPasFunction = class(TPasProcedure)
+  TPasOperator = class(TPasProcedure)
+  TPasConstructor = class(TPasProcedure)
+  TPasDestructor = class(TPasProcedure)
+  TPasClassProcedure = class(TPasProcedure)
+  TPasClassFunction = class(TPasProcedure)
+  }
+
+end;
+
+Function TPasToJSConverter.ConvertProcedureImpl(El: TPasProcedureImpl; AContext : TConvertContext): TJSElement;
+
+Var
+  FS : TJSFunctionDeclarationStatement;
+  FD : TJSFuncDef;
+
+begin
+  FS:=TJSFunctionDeclarationStatement(CreateElement(TJSFunctionDeclarationStatement,EL));
+  Result:=FS;
+  FD:=TJSFuncDef.Create;
+  FD.Name:=TransFormFunctionName(El,AContext);
+  FS.AFunction:=FD;
+  FD.Body:=TJSFunctionBody(CreateElement(TJSFunctionBody,EL.Body));
+  FD.Body.A:=ConvertElement(El.Body,AContext);
+{
+  TPasProcedureImpl = class(TPasElement)
+  TPasConstructorImpl = class(TPasProcedureImpl)
+  TPasDestructorImpl = class(TPasProcedureImpl)
+}
+end;
+
+Function TPasToJSConverter.ConvertBeginEndStatement(El: TPasImplBeginBlock; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=ConvertImplBlockElements(El,AContext);
+end;
+
+Function TPasToJSConverter.ConvertImplBlockElements(El: TPasImplBlock; AContext : TConvertContext): TJSElement;
+
+var
+  B : TJSElement;
+  S,S2 : TJSStatementList;
+  I : Integer;
+
+begin
+  if Not (Assigned(EL.Elements) and (EL.Elements.Count>0)) then
+    Result:=TJSEmptyBlockStatement(CreateElement(TJSEmptyBlockStatement,El))
+  else
+    begin
+    S:=TJSStatementList(CreateElement(TJSStatementList,TPasImplElement(EL)));
+    Result:=S;
+    For I:=0 to EL.Elements.Count-1 do
+      begin
+      B:=ConvertElement(TPasImplElement(EL.Elements[i]),AContext);
+      if not Assigned(S.A) then
+        S.A:=B
+      else
+        begin
+        if Assigned(S.B) then
+          begin
+          S2:=TJSStatementList(CreateElement(TJSStatementList,TPasImplElement(EL.Elements[i])));
+          S2.A:=S.B;
+          S.B:=S2;
+          S:=S2;
+          end;
+        S.B:=B;
+        end;
+      end;
+    end;
+end;
+
+Function TPasToJSConverter.ConvertInitializationSection(El: TInitializationSection; AContext : TConvertContext): TJSElement;
+begin
+  Result:=ConvertImplBlockElements(El,AContext);
+end;
+
+Function TPasToJSConverter.ConvertFinalizationSection(El: TFinalizationSection; AContext : TConvertContext): TJSElement;
+begin
+  Result:=ConvertImplBlockElements(El,AContext);
+end;
+
+Function TPasToJSConverter.ConvertTryStatement(El: TPasImplTry; AContext : TConvertContext): TJSElement;
+
+Var
+  B,F : TJSElement;
+  T : TJSTryStatement;
+  IsFin : Boolean;
+
+begin
+  F:=Nil;
+  B:=ConvertImplBlockElements(El,AContext);
+  try
+    F:=ConvertElement(El.FinallyExcept);
+    IsFin:=El.FinallyExcept is TPasImplTryFinally;
+    if IsFin then
+      T:=TJSTryFinallyStatement(CreateElement(TJSTryFinallyStatement,El))
+    else
+      begin
+      T:=TJSTryCatchStatement(CreateElement(TJSTryCatchStatement,El));
+      T.Ident:=GetExceptionObjectname(AContext);
+      end;
+  except
+    FreeAndNil(B);
+    FreeAndNil(F);
+    Raise;
+  end;
+  if IsFin then
+    T.BFinally:=F
+  else
+    T.BCatch:=F;
+  T.Block:=B;
+  Result:=T;
+end;
+
+Function TPasToJSConverter.ConvertTryFinallyStatement(El: TPasImplTryFinally; AContext : TConvertContext): TJSElement;
+
+
+begin
+  Result:=ConvertImplBlockElements(El,AContext);
+end;
+
+Function TPasToJSConverter.ConvertTryExceptStatement(El: TPasImplTryExcept; AContext : TConvertContext): TJSElement;
+
+
+begin
+
+  Result:=ConvertImplBlockElements(El,AContext);
+end;
+
+Function TPasToJSConverter.ConvertImplBlock(El: TPasImplBlock; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+  if (EL is TPasImplStatement) then
+    Result:=ConvertStatement(TPasImplStatement(El),AContext)
+  else if (EL is TPasImplIfElse) then
+    Result:=ConvertIfStatement(TPasImplIfElse(El),AContext)
+  else if (El is TPasImplRepeatUntil) then
+    Result:=ConvertRepeatStatement(TPasImplRepeatUntil(El),AContext)
+  else if (El is TPasImplBeginBlock) then
+    Result:=ConvertBeginEndStatement(TPasImplBeginBlock(El),AContext)
+  else if (El is TInitializationSection) then
+    Result:=ConvertInitializationSection(TInitializationSection(El),AContext)
+  else if (El is TFinalizationSection) then
+    Result:=ConvertFinalizationSection(TFinalizationSection(El),AContext)
+  else if (El is TPasImplTry) then
+    Result:=ConvertTryStatement(TPasImplTry(El),AContext)
+  else if (El is TPasImplTryFinally) then
+    Result:=ConvertTryFinallyStatement(TPasImplTryFinally(El),AContext)
+  else if (El is TPasImplTryExcept) then
+    Result:=ConvertTryExceptStatement(TPasImplTryExcept(El),AContext);
+(*
+  TPasImplBlock = class(TPasImplElement)
+  TPasImplCaseOf = class(TPasImplBlock)
+  TPasImplStatement = class(TPasImplBlock)
+  TPasImplCaseElse = class(TPasImplBlock)
+  TPasImplTry = class(TPasImplBlock)
+  TPasImplTryHandler = class(TPasImplBlock)
+  TPasImplTryFinally = class(TPasImplTryHandler)
+  TPasImplTryExcept = class(TPasImplTryHandler)
+  TPasImplTryExceptElse = class(TPasImplTryHandler)
+
+*)
+end;
+
+Function TPasToJSConverter.ConvertPackage(El: TPasPackage; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+  //  TPasPackage = class(TPasElement)
+end;
+
+Function TPasToJSConverter.ConvertResString(El: TPasResString; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+  //  TPasPackage = class(TPasElement)
+end;
+
+Function TPasToJSConverter.ConvertArgument(El: TPasArgument; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+  //  TPasPackage = class(TPasElement)
+end;
+
+Function TPasToJSConverter.ConvertResultElement(El: TPasResultElement; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+  //  TPasPackage = class(TPasElement)
+end;
+
+Function TPasToJSConverter.ConvertVariable(El: TPasVariable; AContext : TConvertContext): TJSElement;
+
+Var
+  V : TJSVarDeclaration;
+  T : TPasType;
+  L : TJSLiteral;
+
+begin
+  V:=TJSVarDeclaration(CreateElement(TJSVarDeclaration,El));
+  V.Name:=TransFormVariableName(EL,AContext);
+  T:=ResolveType(EL.VarType,AContext);
+  if (T is TPasArrayType) then
+    begin
+    V.Init:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,EL.VarType));
+    If Assigned(EL.Expr) then
+      Raise EPasToJS.Create(SerrInitalizedArray);
+    end
+  else If Assigned(EL.Expr) then
+    V.Init:=ConvertElement(El.Expr,AContext);
+  Result:=V;
+  //  TPasPackage = class(TPasElement)
+end;
+
+Function TPasToJSConverter.ConvertConst(El: TPasConst; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+  //  TPasPackage = class(TPasElement)
+end;
+
+Function TPasToJSConverter.ConvertProperty(El: TPasProperty; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+//  TPasProperty = class(TPasVariable)
+
+end;
+
+Function TPasToJSConverter.ConvertExportSymbol(El: TPasExportSymbol; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+  //  TPasPackage = class(TPasElement)
+end;
+
+Function TPasToJSConverter.ConvertLabels(El: TPasLabels; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+//  TPasLabels = class(TPasImplElement)
+end;
+
+Function TPasToJSConverter.ConvertRaiseStatement(El: TPasImplRaise; AContext : TConvertContext): TJSElement;
+
+Var
+  E : TJSElement;
+  T : TJSThrowStatement;
+
+begin
+  if El.ExceptObject<>Nil then
+    E:=ConvertElement(El.ExceptObject)
+  else
+    E:=CreateIdentifierExpr(GetExceptionObjectName(AContext),El,AContext);
+  T:=TJSThrowStatement(CreateElement(TJSThrowStatement,El));
+  T.A:=E;
+  Result:=T;
+end;
+
+Function TPasToJSConverter.ConvertAssignStatement(El: TPasImplAssign; AContext : TConvertContext): TJSElement;
+
+Var
+  LHS,RHS : TJSElement;
+  T : TJSAssignStatement;
+
+begin
+  LHS:=ConvertElement(El.left);
+  try
+    RHS:=ConvertElement(El.Right);
+  except
+    FreeAndNil(LHS);
+    Raise;
+  end;
+  T:=TJSSimpleAssignStatement(CreateElement(TJSSimpleAssignStatement,El));
+  T.Expr:=RHS;
+  T.LHS:=LHS;
+  Result:=T;
+end;
+
+Function TPasToJSConverter.ConvertCommand(El: TPasImplCommand; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+//  TPasImplCommand = class(TPasImplElement)
+end;
+
+Function TPasToJSConverter.ConvertIfStatement(El: TPasImplIfElse; AContext : TConvertContext): TJSElement;
+
+Var
+  C,BThen,BElse : TJSElement;
+  T : TJSIfStatement;
+
+begin
+  C:=Nil;
+  BThen:=Nil;
+  BElse:=Nil;
+  try
+    C:=ConvertElement(El.ConditionExpr);
+    if Assigned(El.IfBranch) then
+      BThen:=ConvertElement(El.IfBranch)
+    else
+      BThen:=TJSEmptyBlockStatement(CreateElement(TJSEmptyBlockStatement,El));
+    if Assigned(El.ElseBranch) then
+      BElse:=ConvertElement(El.ElseBranch);
+  except
+    FreeAndNil(C);
+    FreeAndNil(BThen);
+    FreeAndNil(BElse);
+    Raise;
+  end;
+  T:=TJSIfStatement(CreateElement(TJSIfStatement,El));
+  T.Cond:=C;
+  T.Btrue:=BThen;
+  T.BFalse:=BElse;
+  Result:=T;
+end;
+
+Function TPasToJSConverter.ConvertWhileStatement(El: TPasImplWhileDo; AContext : TConvertContext): TJSElement;
+
+Var
+  C : TJSElement;
+  B : TJSElement;
+  W : TJSWhileStatement;
+begin
+  Result:=Nil;
+  C:=Nil;
+  B:=Nil;
+  try
+    C:=ConvertElement(EL.ConditionExpr,AContext);
+    if Assigned(EL.Body) then
+      B:=ConvertElement(EL.Body,AContext)
+    else
+      B:=TJSEmptyBlockStatement(CreateElement(TJSEmptyBlockStatement,El));
+  except
+    FreeAndNil(B);
+    FreeAndNil(C);
+  end;
+  W:=TJSWhileStatement(CreateElement(TJSWhileStatement,El));
+  W.Cond:=C;
+  W.body:=B;
+  Result:=W;
+end;
+
+Function TPasToJSConverter.ConvertRepeatStatement(El: TPasImplRepeatUntil; AContext: TConvertContext): TJSElement;
+Var
+  C : TJSElement;
+  N : TJSUnaryNotExpression;
+  W : TJSDoWhileStatement;
+  B : TJSElement;
+
+begin
+  Result:=Nil;
+  C:=Nil;
+  B:=Nil;
+  try
+    C:=ConvertElement(EL.ConditionExpr,AContext);
+    N:=TJSUnaryNotExpression(CreateElement(TJSUnaryNotExpression,EL.ConditionExpr));
+    N.A:=C;
+    B:=ConvertImplBlockElements(El,AContext);
+  except
+    FreeAndNil(B);
+    FreeAndNil(C);
+  end;
+  W:=TJSDoWhileStatement(CreateElement(TJSDoWhileStatement,El));
+  W.Cond:=N;
+  W.body:=B;
+  Result:=W;
+end;
+
+Function TPasToJSConverter.ConvertForStatement(El: TPasImplForLoop;
+  AContext: TConvertContext): TJSElement;
+
+Var
+  F : TJSForStatement;
+  L : TJSStatementList;
+  I : TJSSimpleAssignStatement;
+  V : TJSVarDeclaration;
+  VD : TJSVariableStatement;
+  u : TJSUNaryExpression;
+  B : TJSBinaryExpression;
+  MV : String;
+
+begin
+  Result:=Nil;
+  B:=Nil;
+  L:=TJSStatementList(CreateElement(TJSStatementList,El));
+  Result:=L;
+  try
+    VD:=TJSVariableStatement(CreateElement(TJSVariableStatement,El));
+    L.A:=VD;
+    V:=TJSVarDeclaration(CreateElement(TJSVarDeclaration,El));
+    VD.A:=V;
+    MV:=TransFormVariableName(El.VariableName,AContext)+'$endloopvalue';
+    V.Name:=MV;
+    V.Init:=ConvertElement(EL.EndExpr,AContext);
+    F:=TJSForStatement(CreateElement(TJSForStatement,El));
+    L.B:=F;
+    I:=TJSSimpleAssignStatement(CreateElement(TJSSimpleAssignStatement,El.StartExpr));
+    F.Init:=I;
+    I.LHS:=CreateIdentifierExpr(EL.VariableName,el,AContext);
+    I.Expr:=ConvertElement(El.StartExpr,AContext);
+    If El.Down then
+      begin
+      U:=TJSUnaryPostMinusMinusExpression(CreateElement(TJSUnaryPostMinusMinusExpression,El));
+      B:=TJSRelationalExpressionGE(CreateElement(TJSRelationalExpressionGE,El.EndExpr));
+      end
+    else
+      begin
+      U:=TJSUnaryPostPlusPlusExpression(CreateElement(TJSUnaryPostPlusPlusExpression,El));
+      B:=TJSRelationalExpressionLE(CreateElement(TJSRelationalExpressionLE,El.EndExpr));
+      end;
+    F.Incr:=U;
+    F.Cond:=B;
+    U.A:=CreateIdentifierExpr(EL.VariableName,El,AContext);
+    B.A:=CreateIdentifierExpr(EL.VariableName,El,AContext);
+    B.B:=CreateIdentifierExpr(MV,El.EndExpr,AContext);
+    F.body:=ConvertElement(EL.Body);
+  except
+    FreeAndNil(Result);
+    Raise;
+  end;
+end;
+
+Function TPasToJSConverter.ConvertSimpleStatement(El: TPasImplSimple; AContext : TConvertContext): TJSElement;
+
+Var
+  E : TJSElement;
+
+begin
+  E:=ConvertElement(EL.Expr,AContext);
+  Result:=TJSExpressionStatement(CreateElement(TJSExpressionStatement,El));
+  TJSExpressionStatement(Result).A:=E;
+end;
+
+Function TPasToJSConverter.ConvertWithStatement(El: TPasImplWithDo; AContext : TConvertContext): TJSElement;
+
+Var
+  B,E : TJSElement;
+  W,W2 : TJSWithStatement;
+  I : Integer;
+
+begin
+  W:=Nil;
+  Result:=Nil;
+  if Assigned(El.Body) then
+    B:=ConvertElement(El.Body,AContext)
+  else
+    B:=TJSEmptyBlockStatement(CreateElement(TJSEmptyBlockStatement,El));
+  try
+    For I:=0 to El.Expressions.Count-1 do
+      begin
+      E:=ConvertElement(TPasElement(El.Expressions[i]),AContext);
+      W2:=TJSWithStatement(CreateElement(TJSWithStatement,TPasElement(El.Expressions[i])));
+      if Not Assigned(Result) then // result is the first
+        Result:=W2;
+      if Assigned(W) then // Chain
+        W.B:=W2;
+      W:=W2; // W is the last
+      W.A:=E;
+      end;
+  except
+    FreeAndNil(E);
+    FreeAndNil(Result);
+    Raise;
+  end;
+  W.B:=B;
+end;
+
+Function TPasToJSConverter.GetExceptionObjectname(AContext: TConvertContext): String;
+
+begin
+  Result:='jsexception';
+end;
+
+Function TPasToJSConverter.ResolveType(El: TPasElement;
+  AContext: TConvertContext): TPasType;
+begin
+  if EL is TPasType then
+    Result:=TPasType(El) // TPasUnresolvedTypeRef needs handling here
+  else
+    Result:=Nil;
+end;
+
+Function TPasToJSConverter.ConvertExceptOn(El: TPasImplExceptOn; AContext : TConvertContext): TJSElement;
+
+Var
+  I : TJSIfStatement;
+  IO : TJSRelationalExpressionInstanceOf;
+  L : TJSStatementList;
+  V : TJSVarDeclaration;
+
+begin
+  I:=TJSIfStatement(CreateElement(TJSIfStatement,El));
+  IO:=TJSRelationalExpressionInstanceOf(CreateElement(TJSRelationalExpressionInstanceOf,EL));
+  IO.A:=CreateIdentifierExpr(GetExceptionObjectName(AContext),El,AContext);
+  IO.B:=CreateIdentifierExpr(El.TypeName,El,AContext);
+  I.Cond:=IO;
+  L:=TJSStatementList(CreateElement(TJSStatementList,EL.Body));
+  I.btrue:=L;
+  V:=TJSVarDeclaration(CreateElement(TJSVarDeclaration,EL));
+  L.A:=V;
+  V.Name:=TransFormVariableName(EL.VariableName,AContext);//
+  V.Init:=CreateIdentifierExpr(GetExceptionObjectName(AContext),EL,AContext);
+  L.B:=TJSStatementList(CreateElement(TJSStatementList,EL.Body));
+  L:=TJSStatementList(L.B);
+  L.A:=ConvertElement(EL.Body,AContext);
+  Result:=I;
+end;
+
+Function TPasToJSConverter.ConvertStatement(El: TPasImplStatement; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+  if (El is TPasImplRaise) then
+    Result:=ConvertRaiseStatement(TPasImplRaise(El),AContext)
+  else if (El is TPasImplAssign) then
+    Result:=ConvertAssignStatement(TPasImplAssign(El),AContext)
+  else if (El is TPasImplWhileDo) then
+    Result:=ConvertWhileStatement(TPasImplWhileDo(El),AContext)
+  else if (El is TPasImplSimple) then
+    Result:=ConvertSimpleStatement(TPasImplSimple(El),AContext)
+  else if (El is TPasImplWithDo) then
+    Result:=ConvertWithStatement(TPasImplWithDo(El),AContext)
+  else if (El is TPasImplExceptOn) then
+    Result:=ConvertExceptOn(TPasImplExceptOn(El),AContext)
+  else if (El is TPasImplForLoop) then
+    Result:=ConvertForStatement(TPasImplForLoop(El),AContext)
+  else
+    DoError('Unknown statement Class: %s',[El.ClassName]);
+{
+  TPasImplCaseStatement = class(TPasImplStatement)
+}
+end;
+
+
+Function TPasToJSConverter.ConvertCommands(El: TPasImplCommands; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+  //  TPasImplCommands = class(TPasImplElement)
+end;
+
+Function TPasToJSConverter.ConvertLabelMark(El: TPasImplLabelMark; AContext : TConvertContext): TJSElement;
+
+begin
+  Result:=Nil;
+ //    TPasImplLabelMark = class(TPasImplLabelMark) then
+end;
+
+Function TPasToJSConverter.ConvertElement(El: TPasElement; AContext : TConvertContext): TJSElement;
+begin
+  If (El is TPasPackage)  then
+    Result:=ConvertPackage(TPasPackage(El),AContext)
+  else If (El is TPasModule)  then
+    Result:=ConvertModule(TPasModule(El),AContext)
+  else if (EL is TPasExpr) then
+    Result:=ConvertExpression(TPasExpr(El),AContext)
+  else if (EL is TPasDeclarations) then
+    Result:=ConvertDeclarations(TPasDeclarations(El),AContext)
+  else if (EL is TPasType) then
+    Result:=ConvertType(TPasType(El),AContext)
+  else if (EL is TPasProcedure) then
+    Result:=ConvertProcedure(TPasProcedure(El),AContext)
+  else if (EL is TPasProcedureImpl) then
+    Result:=ConvertProcedureImpl(TPasProcedureImpl(El),AContext)
+  else if (EL is TPasImplBlock) then
+    Result:=ConvertImplBlock(TPasImplBlock(El),AContext)
+  else if (EL is TPasResString) then
+    Result:=ConvertResString(TPasResString(El),AContext)
+  else if (EL is TPasArgument) then
+    Result:=ConvertArgument(TPasArgument(El),AContext)
+  else if (EL is TPasResultElement) then
+    Result:=ConvertResultElement(TPasResultElement(El),AContext)
+  else if (EL is TPasConst) then
+    Result:=ConvertConst(TPasConst(El),AContext)
+  else if (EL is TPasProperty) then
+    Result:=ConvertProperty(TPasProperty(El),AContext)
+  else if (EL is TPasVariable) then
+    Result:=ConvertVariable(TPasVariable(El),AContext)
+  else if (EL is TPasExportSymbol) then
+    Result:=ConvertExportSymbol(TPasExportSymbol(El),AContext)
+  else if (EL is TPasLabels) then
+    Result:=ConvertLabels(TPasLabels(El),AContext)
+  else if (EL is TPasImplCommand) then
+    Result:=ConvertCommand(TPasImplCommand(El),AContext)
+  else if (EL is TPasImplCommands) then
+    Result:=ConvertCommands(TPasImplCommands(El),AContext)
+  else if (EL is TPasImplLabelMark) then
+    Result:=ConvertLabelMark(TPasImplLabelMark(El),AContext);
+end;
+
+Procedure TPasToJSConverter.DoError(Const Msg: String);
+begin
+  Raise EPas2JS.Create(Msg);
+end;
+
+Procedure TPasToJSConverter.DoError(Const Msg: String;
+  Const Args: Array of Const);
+begin
+  Raise EPas2JS.CreateFmt(Msg,Args);
+end;
+
+procedure TPasToJSConverter.SetCurrentContext(AValue: TJSElement);
+begin
+  if FCurrentContext=AValue then Exit;
+  FCurrentContext:=AValue;
+end;
+
+Function TPasToJSConverter.CreateJSContext(AContext : TConvertContext) : TJSElement;
+
+begin
+  Result:=TJSObjectLiteral.Create(0,0);
+
+end;
+
+Function TPasToJSConverter.TransFormVariableName(Const AName: String;
+  AContext: TConvertContext): String;
+begin
+  Result:=LowerCase(AName);
+end;
+
+Function TPasToJSConverter.TransFormVariableName(El: TPasElement; AContext: TConvertContext): String;
+begin
+  Result:=TransFormVariableName(EL.Name,AContext);
+  // Add to context.
+end;
+
+Function TPasToJSConverter.TransFormFunctionName(El: TPasElement;
+  AContext: TConvertContext): String;
+begin
+  Result:=LowerCase(EL.Name);
+end;
+
+Function TPasToJSConverter.ConvertElement(El: TPasElement): TJSElement;
+begin
+//  CurrentContext:=CreateJSContext(Nil);
+  Result:=ConvertElement(El,Nil);
+end;
+
+end.
+

+ 1320 - 0
packages/pastojs/tests/tcconverter.pp

@@ -0,0 +1,1320 @@
+{
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2014 by Michael Van Canneyt
+
+    Unit tests for Pascal-to-Javascript converter class.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit tcconverter;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, fpcunit, testutils, testregistry, fppas2js, jsbase, jstree, pastree;
+
+type
+
+  { TTestConverter }
+
+  TTestConverter = class(TTestCase)
+  private
+    FAC: TPasElement;
+    FConverter: TPasToJSConverter;
+    FRes: TJSElement;
+    FSource: TPasElement;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+    Property AttemptConvert : TPasElement Read FAC Write FAC;
+    Procedure TryConvert;
+    Function Convert(AElement : TPasElement; AClass : TJSElementClass) : TJSElement;
+    Property Converter : TPasToJSConverter Read FConverter;
+    Property TheSource : TPasElement Read FSource Write FSource;
+    Property TheResult : TJSElement Read FRes Write FRes;
+  Public
+    Class procedure AssertEquals(Const Msg : String; AExpected, AActual : TJSType); overload;
+    Class procedure AssertLiteral(Const Msg : String; Lit : TJSElement; AType : TJSType);
+    Class procedure AssertLiteral(Const Msg : String; Lit : TJSElement; AValue : Boolean);
+    Class procedure AssertLiteral(Const Msg : String; Lit : TJSElement; AValue : TJSString);
+    Class procedure AssertLiteral(Const Msg : String; Lit : TJSElement; AValue : TJSNumber);
+    Class procedure AssertIdentifier(Const Msg : String; Ident : TJSElement; AName : String);
+    Class Procedure AssertAssignStatement(Const Msg: String; El: TJSElement; LHS: String='a'; RHS: String='b');
+    Class Procedure AssertEmptyBlockStatement(Const Msg: String; El: TJSElement);
+    class Function AssertListStatement(Const Msg: String; El: TJSElement) : TJSStatementList;
+    class Function AssertElement(Const Msg: String; AClass : TJSElementClass; El: TJSElement) : TJSElement;
+    Class Function CreateLiteral(AValue : String) : TPasExpr;
+    Class Function CreateLiteral(AValue : Double) : TPasExpr;
+    Class Function CreateIdent(AName : String) : TPrimitiveExpr;
+    Class Function CreateAssignStatement(LHS: String = 'a';RHS : String = 'b'): TPasImplAssign;
+    Class Function CreateFunctionCall(AName : String; Params : Array of String) : TParamsExpr;
+    Class Function CreateCondition: TPasExpr;
+  end;
+
+  TTestTestConverter = class(TTestConverter)
+  published
+    procedure TestEmpty;
+  end;
+
+  { TTestExpressionConverter }
+
+  TTestExpressionConverter = Class(TTestConverter)
+  Protected
+    Function TestLiteralExpression(AElement : TPasElement; AClass : TJSElementClass) : TJSLIteral;
+    Function TestUnaryExpression(AElement : TPasElement; AClass : TJSElementClass) : TJSUnary;
+    Function TestBinaryExpression(AElement : TPasElement; AClass : TJSElementClass) : TJSBinary;
+  Published
+    Procedure TestPrimitiveString;
+    Procedure TestPrimitiveNumber;
+    Procedure TestPrimitiveNil;
+    Procedure TestPrimitiveBoolTrue;
+    Procedure TestPrimitiveBoolFalse;
+    Procedure TestPrimitiveIdent;
+    Procedure TestUnaryMinus;
+    Procedure TestUnaryPlus;
+    Procedure TestBinaryPlus;
+    Procedure TestBinaryMinus;
+    Procedure TestBinaryMultiply;
+    Procedure TestBinaryDivision;
+    Procedure TestBinaryDiv;
+    Procedure TestBinaryMod;
+    Procedure TestBinarySHL;
+    Procedure TestBinarySHR;
+    Procedure TestBinaryEqual;
+    Procedure TestBinaryNotEqual;
+    Procedure TestBinaryLessThan;
+    Procedure TestBinaryLessThanEqual;
+    Procedure TestBinaryGreater;
+    Procedure TestBinaryGreaterThanEqual;
+    Procedure TestBinaryIs;
+    Procedure TestCallExpressionNone;
+    Procedure TestCallExpressionOne;
+    Procedure TestCallExpressionTwo;
+    Procedure TestMemberExpressionArrayOneDim;
+    Procedure TestMemberExpressionArrayTwoDim;
+    Procedure TestVariable;
+    Procedure TestArrayVariable;
+  end;
+
+  { TTestStatementConverter }
+
+  TTestStatementConverter = Class(TTestConverter)
+  private
+  Published
+    Procedure TestRaiseStatement;
+    Procedure TestAssignStatement;
+    Procedure TestIfStatement;
+    Procedure TestIfStatementFull;
+    Procedure TestIfStatementElse;
+    Procedure TestWhileStatementEmpty;
+    Procedure TestWhileStatement;
+    Procedure TestSimpleStatement;
+    Procedure TestRepeatUntilStatementEmpty;
+    Procedure TestRepeatUntilStatementOne;
+    Procedure TestRepeatUntilStatementTwo;
+    Procedure TestRepeatUntilStatementThree;
+    Procedure TestForLoopUp;
+    Procedure TestForLoopDown;
+    Procedure TestBeginEndBlockEmpty;
+    Procedure TestBeginEndBlockStatementOne;
+    Procedure TestBeginEndBlockStatementTwo;
+    Procedure TestBeginEndBlockStatementThree;
+    Procedure TestWithStatementEmpty;
+    Procedure TestWithStatementOne;
+    Procedure TestWithStatementTwo;
+    Procedure TestTryFinallyStatement;
+    Procedure TestTryExceptStatement;
+    Procedure TestTryExceptStatementOnE;
+    Procedure TestReRaise;
+    Procedure TestVariableStatement;
+  end;
+
+implementation
+
+uses typinfo;
+
+{ TTestStatementConverter }
+
+Procedure TTestStatementConverter.TestRaiseStatement;
+
+Var
+  R : TPasImplRaise;
+  E : TJSThrowStatement;
+
+begin
+  R:=TPasImplRaise.Create('',Nil);
+  R.ExceptObject:=CreateIdent('e');
+  E:=TJSThrowStatement(Convert(R,TJSThrowStatement));
+  AssertIdentifier('Raise exception object',E.A,'e');
+end;
+
+
+Procedure TTestStatementConverter.TestAssignStatement;
+
+Var
+  R : TPasImplAssign;
+  E : TJSSimpleAssignStatement;
+
+begin
+  R:=CreateAssignStatement('a','b');
+  E:=TJSSimpleAssignStatement(Convert(R,TJSSimpleAssignStatement));
+  AssertAssignStatement('a = b assignment',E);
+end;
+
+
+Procedure TTestStatementConverter.TestIfStatement;
+
+Var
+  R : TPasImplIfElse;
+  E : TJSIfStatement;
+
+begin
+  // If a then ;
+  R:=TPasImplIfElse.Create('',Nil);
+  R.ConditionExpr:=CreateCondition;
+  E:=TJSIfStatement(Convert(R,TJSIfStatement));
+  AssertEquals('If branch is empty block statement',TJSEmptyBlockStatement,E.btrue.ClassType);
+  AssertNull('No else branch',E.bfalse);
+  AssertIdentifier('Left hand side OK',E.Cond,'a');
+end;
+
+Procedure TTestStatementConverter.TestIfStatementFull;
+
+Var
+  R : TPasImplIfElse;
+  E : TJSIfStatement;
+
+begin
+  // If a then a:=b;
+  R:=TPasImplIfElse.Create('',Nil);
+  R.ConditionExpr:=CreateCondition;
+  R.IfBranch:=CreateAssignStatement;
+  E:=TJSIfStatement(Convert(R,TJSIfStatement));
+  AssertIdentifier('Conditional expression',E.Cond,'a');
+  AssertAssignStatement('If branch',E.btrue);
+  AssertNull('No else branch',E.bfalse);
+end;
+
+Procedure TTestStatementConverter.TestIfStatementElse;
+Var
+  R : TPasImplIfElse;
+  E : TJSIfStatement;
+
+begin
+  // If a then a:=b else a:=e;
+  R:=TPasImplIfElse.Create('',Nil);
+  R.ConditionExpr:=CreateCondition;
+  R.IfBranch:=CreateAssignStatement;
+  R.ElseBranch:=CreateAssignStatement('a','e');
+  E:=TJSIfStatement(Convert(R,TJSIfStatement));
+  AssertIdentifier('Conditional expression',E.Cond,'a');
+  AssertAssignStatement('If branch',E.btrue);
+  AssertAssignStatement('else branch',E.bfalse,'a','e');
+end;
+
+Procedure TTestStatementConverter.TestWhileStatementEmpty;
+Var
+  R : TPasImplWhileDo;
+  E : TJSWhileStatement;
+
+begin
+  // While a do ;
+  R:=TPasImplWhileDo.Create('',Nil);
+  R.ConditionExpr:=CreateCondition;
+  E:=TJSWhileStatement(Convert(R,TJSWhileStatement));
+  AssertIdentifier('Conditional expression',E.Cond,'a');
+  AssertEquals('No statement, empty block statement',TJSEmptyBlockStatement,E.body.ClassType);
+end;
+
+Procedure TTestStatementConverter.TestWhileStatement;
+Var
+  R : TPasImplWhileDo;
+  E : TJSWhileStatement;
+
+begin
+  // While a do b:=c;
+  R:=TPasImplWhileDo.Create('',Nil);
+  R.Body:=CreateAssignStatement('b','c');
+  R.ConditionExpr:=CreateCondition;
+  E:=TJSWhileStatement(Convert(R,TJSWhileStatement));
+  AssertIdentifier('Conditional expression',E.Cond,'a');
+  AssertAssignStatement('While Block is assignment',E.body,'b','c');
+end;
+
+Procedure TTestStatementConverter.TestSimpleStatement;
+
+Var
+  R : TPasImplSimple;
+  E : TJSExpressionStatement;
+  C : TJSCallExpression;
+
+begin
+  R:=TPasImplSimple.Create('',Nil);
+  R.Expr:=CreateFunctionCall('a',['b']);
+  E:=TJSExpressionStatement(Convert(R,TJSExpressionStatement));
+  AssertNotNull('Have call node',E.A);
+  AssertEquals('Have call expression',TJSCallExpression,E.A.ClassType);
+  AssertEquals('Have call expression',TJSCallExpression,E.A.ClassType);
+  C:=TJSCallExpression(E.A);
+  AssertIdentifier('Call expression',C.Expr,'a');
+end;
+
+Procedure TTestStatementConverter.TestRepeatUntilStatementEmpty;
+
+Var
+  R : TPasImplRepeatUntil;
+  E : TJSWhileStatement;
+
+begin
+  // Repeat until a;
+  R:=TPasImplRepeatUntil.Create('',Nil);
+  R.ConditionExpr:=CreateCondition;
+  E:=TJSDoWhileStatement(Convert(R,TJSDoWhileStatement));
+  AssertNotNull('Have condition',E.Cond);
+  AssertEquals('Correct condition class',TJSUnaryNotExpression,E.Cond.ClassType);
+  AssertIdentifier('Conditional expression',TJSUnaryNotExpression(E.Cond).A,'a');
+  AssertNotNull('Have body',E.Body);
+  AssertEquals('No statement, empty block statement',TJSEmptyBlockStatement,E.body.ClassType);
+end;
+
+Procedure TTestStatementConverter.TestRepeatUntilStatementOne;
+
+Var
+  R : TPasImplRepeatUntil;
+  E : TJSWhileStatement;
+  L : TJSStatementList;
+
+begin
+  // Repeat b:=c; until a;
+  R:=TPasImplRepeatUntil.Create('',Nil);
+  R.ConditionExpr:=CreateCondition;
+  R.AddAssign(CreateIdent('b'),CreateIdent('c'));
+  E:=TJSDoWhileStatement(Convert(R,TJSDoWhileStatement));
+  AssertNotNull('Have condition',E.Cond);
+  AssertEquals('Correct condition class',TJSUnaryNotExpression,E.Cond.ClassType);
+  AssertIdentifier('Conditional expression',TJSUnaryNotExpression(E.Cond).A,'a');
+  AssertNotNull('Have body',E.Body);
+  AssertEquals('List statement, List statement',TJSStatementList,E.body.ClassType);
+  L:=TJSStatementList(E.Body);
+  AssertAssignStatement('First List statement is assignment',L.A,'b','c');
+  AssertNull('No second statement',L.B);
+end;
+
+Procedure TTestStatementConverter.TestRepeatUntilStatementTwo;
+
+Var
+  R : TPasImplRepeatUntil;
+  E : TJSWhileStatement;
+  L : TJSStatementList;
+
+begin
+  // Repeat b:=c; d:=e; until a;
+  R:=TPasImplRepeatUntil.Create('',Nil);
+  R.ConditionExpr:=CreateCondition;
+  R.AddAssign(CreateIdent('b'),CreateIdent('c'));
+  R.AddAssign(CreateIdent('d'),CreateIdent('e'));
+  E:=TJSDoWhileStatement(Convert(R,TJSDoWhileStatement));
+  AssertNotNull('Have condition',E.Cond);
+  AssertEquals('Correct condition class',TJSUnaryNotExpression,E.Cond.ClassType);
+  AssertIdentifier('Conditional expression',TJSUnaryNotExpression(E.Cond).A,'a');
+  L:=AssertListStatement('Multiple statements',E.Body);
+  AssertAssignStatement('First List statement is assignment',L.A,'b','c');
+  AssertAssignStatement('Second List statement is assignment',L.b,'d','e');
+end;
+
+Procedure TTestStatementConverter.TestRepeatUntilStatementThree;
+
+Var
+  R : TPasImplRepeatUntil;
+  E : TJSWhileStatement;
+  L : TJSStatementList;
+
+begin
+  // Repeat b:=c; d:=e; f:=g; until a;
+  R:=TPasImplRepeatUntil.Create('',Nil);
+  R.ConditionExpr:=CreateCondition;
+  R.AddAssign(CreateIdent('b'),CreateIdent('c'));
+  R.AddAssign(CreateIdent('d'),CreateIdent('e'));
+  R.AddAssign(CreateIdent('f'),CreateIdent('g'));
+  E:=TJSDoWhileStatement(Convert(R,TJSDoWhileStatement));
+  AssertNotNull('Have condition',E.Cond);
+  AssertEquals('Correct condition class',TJSUnaryNotExpression,E.Cond.ClassType);
+  AssertIdentifier('Conditional expression',TJSUnaryNotExpression(E.Cond).A,'a');
+  AssertNotNull('Have body',E.Body);
+  L:=AssertListStatement('Multiple statements',E.Body);
+  AssertAssignStatement('First List statement is assignment',L.A,'b','c');
+  L:=AssertListStatement('Second statement is again list',L.B);
+  AssertAssignStatement('Second List statement is assignment',L.A,'d','e');
+  AssertAssignStatement('third List statement is assignment',L.B,'f','g');
+end;
+
+Procedure TTestStatementConverter.TestForLoopUp;
+
+Var
+  F : TPasImplForLoop;
+  E : TJSForStatement;
+  L : TJSStatementList;
+  VS : TJSVariableStatement;
+  VD : TJSVarDeclaration;
+  A : TJSSimpleAssignStatement;
+  I : TJSUnaryPostPlusPlusExpression;
+  C : TJSRelationalExpressionLE;
+
+begin
+  // For I:=0 to 100 do a:=b;
+  F:=TPasImplForLoop.Create('',Nil);
+  F.Variable:=TPasVariable.Create('I',F);
+  F.VariableName:='I';
+  F.StartExpr:=CreateLiteral(1);
+  F.EndExpr:=CreateLiteral(100);
+  F.Body:=CreateAssignStatement();
+  L:=TJSStatementList(Convert(F,TJSStatementList));
+  VS:=TJSVariableStatement(AssertElement('Start with upper limit temp var',TJSVariableStatement,L.A));
+  VD:=TJSVarDeclaration(AssertElement('Have variable',TJSVarDeclaration,VS.A));
+  AssertEquals('Correct name for end value','i$endloopvalue',VD.Name);
+  AssertLiteral('Correct end value',VD.Init,100);
+  E:=TJSForStatement(AssertElement('Second in list is for statement',TJSForStatement,L.B));
+  A:=TJSSimpleAssignStatement(AssertElement('Init statement is assign statement',TJSSimpleAssignStatement,E.Init));
+  AssertLiteral('Init statement RHS is start value',A.Expr,1);
+  AssertIdentifier('Init statement LHS is loop variable',A.LHS,'i');
+  I:=TJSUnaryPostPlusPlusExpression(AssertElement('Increment is ++ statement',TJSUnaryPostPlusPlusExpression,E.Incr));
+  AssertIdentifier('++ on correct variable name',I.A,'i');
+  AssertAssignStatement('Correct body',E.Body);
+  C:=TJSRelationalExpressionLE(AssertElement('Condition is <= expression',TJSRelationalExpressionLE,E.Cond));
+  AssertIdentifier('Cond LHS is loop variable',C.A,'i');
+  AssertIdentifier('Cond RHS is end loop value variable',C.B,'i$endloopvalue');
+end;
+
+Procedure TTestStatementConverter.TestForLoopDown;
+Var
+  F : TPasImplForLoop;
+  E : TJSForStatement;
+  L : TJSStatementList;
+  VS : TJSVariableStatement;
+  VD : TJSVarDeclaration;
+  A : TJSSimpleAssignStatement;
+  I : TJSUnaryPostMinusMinusExpression;
+  C : TJSRelationalExpressionGE;
+
+begin
+  // For I:=0 to 100 do a:=b;
+  F:=TPasImplForLoop.Create('',Nil);
+  F.Variable:=TPasVariable.Create('I',F);
+  F.VariableName:='I';
+  F.StartExpr:=CreateLiteral(100);
+  F.EndExpr:=CreateLiteral(1);
+  F.LoopType:=ltDown;
+  F.Body:=CreateAssignStatement();
+  L:=TJSStatementList(Convert(F,TJSStatementList));
+  VS:=TJSVariableStatement(AssertElement('Start with upper limit temp var',TJSVariableStatement,L.A));
+  VD:=TJSVarDeclaration(AssertElement('Have variable',TJSVarDeclaration,VS.A));
+  AssertEquals('Correct name for end value','i$endloopvalue',VD.Name);
+  AssertLiteral('Correct end value',VD.Init,1);
+  E:=TJSForStatement(AssertElement('Second in list is for statement',TJSForStatement,L.B));
+  A:=TJSSimpleAssignStatement(AssertElement('Init statement is assign statement',TJSSimpleAssignStatement,E.Init));
+  AssertLiteral('Init statement RHS is start value',A.Expr,100);
+  AssertIdentifier('Init statement LHS is loop variable',A.LHS,'i');
+  I:=TJSUnaryPostMinusMinusExpression(AssertElement('Increment is -- statement',TJSUnaryPostMinusMinusExpression,E.Incr));
+  AssertIdentifier('++ on correct variable name',I.A,'i');
+  AssertAssignStatement('Correct body',E.Body);
+  C:=TJSRelationalExpressionGE(AssertElement('Condition is <= expression',TJSRelationalExpressionGE,E.Cond));
+  AssertIdentifier('Cond LHS is loop variable',C.A,'i');
+  AssertIdentifier('Cond RHS is end loop value variable',C.B,'i$endloopvalue');
+end;
+
+Procedure TTestStatementConverter.TestBeginEndBlockEmpty;
+Var
+  R : TPasImplBeginBlock;
+
+begin
+  // begin end;
+  R:=TPasImplBeginBlock.Create('',Nil);
+  Convert(R,TJSEmptyBlockStatement);
+end;
+
+Procedure TTestStatementConverter.TestBeginEndBlockStatementOne;
+
+Var
+  R : TPasImplBeginBlock;
+  L : TJSStatementList;
+
+begin
+  // begin a:=bend;
+  R:=TPasImplBeginBlock.Create('',Nil);
+  R.AddAssign(CreateIdent('a'),CreateIdent('b'));
+  L:=TJSStatementList(Convert(R,TJSStatementList));
+  AssertNull('No second statement',L.B);
+  AssertAssignStatement('First List statement is assignment',L.A,'a','b');
+end;
+
+Procedure TTestStatementConverter.TestBeginEndBlockStatementTwo;
+
+Var
+  R : TPasImplBeginBlock;
+  L : TJSStatementList;
+
+begin
+  // begin a:=b; c:=d; end;
+  R:=TPasImplBeginBlock.Create('',Nil);
+  R.AddAssign(CreateIdent('a'),CreateIdent('b'));
+  R.AddAssign(CreateIdent('c'),CreateIdent('d'));
+  L:=TJSStatementList(Convert(R,TJSStatementList));
+  AssertAssignStatement('First List statement is assignment',L.A,'a','b');
+  AssertAssignStatement('Second List statement is assignment',L.B,'c','d');
+end;
+
+Procedure TTestStatementConverter.TestBeginEndBlockStatementThree;
+Var
+  R : TPasImplBeginBlock;
+  L : TJSStatementList;
+
+begin
+  // begin a:=b; c:=d; end;
+  R:=TPasImplBeginBlock.Create('',Nil);
+  R.AddAssign(CreateIdent('a'),CreateIdent('b'));
+  R.AddAssign(CreateIdent('c'),CreateIdent('d'));
+  R.AddAssign(CreateIdent('e'),CreateIdent('f'));
+  L:=TJSStatementList(Convert(R,TJSStatementList));
+  AssertAssignStatement('First List statement is assignment',L.A,'a','b');
+  L:=AssertListStatement('Second statement is again list',L.B);
+  AssertAssignStatement('Second List statement is assignment',L.A,'c','d');
+  AssertAssignStatement('third List statement is assignment',L.B,'e','f');
+end;
+
+Procedure TTestStatementConverter.TestWithStatementEmpty;
+Var
+  W : TPasImplWithDo;
+  El : TJSWithStatement;
+
+begin
+  // With A do ;
+  W:=TPasImplWithDo.Create('',NIl);
+  W.Expressions.Add(CreateIdent('a'));
+  El:=TJSWithStatement(Convert(W,TJSWithStatement));
+  AssertIdentifier('Correct with expression',EL.A,'a');
+  AssertEmptyBlockStatement('Empty with',El.B);
+end;
+
+Procedure TTestStatementConverter.TestWithStatementOne;
+
+Var
+  W : TPasImplWithDo;
+  El : TJSWithStatement;
+
+begin
+  // With A do b:=c;
+  W:=TPasImplWithDo.Create('',NIl);
+  W.Expressions.Add(CreateIdent('a'));
+  W.Body:=CreateAssignStatement('b','c');
+  El:=TJSWithStatement(Convert(W,TJSWithStatement));
+  AssertIdentifier('Correct with expression',EL.A,'a');
+  AssertAssignStatement('Correct assignment',EL.B,'b','c');
+end;
+
+Procedure TTestStatementConverter.TestWithStatementTwo;
+Var
+  W : TPasImplWithDo;
+  El : TJSWithStatement;
+
+begin
+  // With A,D do b:=c;
+  W:=TPasImplWithDo.Create('',NIl);
+  W.Expressions.Add(CreateIdent('a'));
+  W.Expressions.Add(CreateIdent('d'));
+  W.Body:=CreateAssignStatement('b','c');
+  El:=TJSWithStatement(Convert(W,TJSWithStatement));
+  AssertIdentifier('Correct with expression',EL.A,'a');
+  El:=TJSWithStatement(AssertElement('Have second with statement',TJSWithStatement,EL.B));
+  AssertIdentifier('Correct with expression',EL.A,'d');
+  AssertAssignStatement('Correct assignment',El.B,'b','c');
+end;
+
+Procedure TTestStatementConverter.TestTryFinallyStatement;
+
+Var
+  T : TPasImplTry;
+  F : TPasImplTryFinally;
+  El : TJSTryFinallyStatement;
+  L : TJSStatementList;
+
+begin
+  // Try a:=B finally b:=c end;
+  T:=TPasImplTry.Create('',Nil);
+  T.AddElement(CreateAssignStatement('a','b'));
+  F:=T.AddFinally;
+  F.AddElement(CreateAssignStatement('b','c'));
+  El:=TJSTryFinallyStatement(Convert(T,TJSTryFinallyStatement));
+  L:=AssertListStatement('try..finally block is statement list',EL.Block);
+  AssertAssignStatement('Correct assignment in try..finally block',L.A,'a','b');
+  AssertNull('No second statement',L.B);
+  L:=AssertListStatement('try..finally block is statement list',El.BFinally);
+  AssertAssignStatement('Correct assignment in finally..end block',L.A,'b','c');
+  AssertNull('No second statement',L.B);
+end;
+
+Procedure TTestStatementConverter.TestTryExceptStatement;
+Var
+  T : TPasImplTry;
+  F : TPasImplTryExcept;
+  El : TJSTryFinallyStatement;
+  L : TJSStatementList;
+
+begin
+  // Try a:=B except b:=c end;
+  T:=TPasImplTry.Create('',Nil);
+  T.AddElement(CreateAssignStatement('a','b'));
+  F:=T.AddExcept;
+  F.AddElement(CreateAssignStatement('b','c'));
+  El:=TJSTryFinallyStatement(Convert(T,TJSTryCatchStatement));
+  L:=AssertListStatement('try..except block is statement list',EL.Block);
+  AssertAssignStatement('Correct assignment in try..except block',L.A,'a','b');
+  AssertNull('No second statement',L.B);
+  L:=AssertListStatement('try..except block is statement list',El.BCatch);
+  AssertAssignStatement('Correct assignment in except..end block',L.A,'b','c');
+  AssertEquals('Correct exception object name','jsexception',EL.Ident);
+  AssertNull('No second statement',L.B);
+end;
+
+Procedure TTestStatementConverter.TestTryExceptStatementOnE;
+
+Var
+  T : TPasImplTry;
+  F : TPasImplTryExcept;
+  O : TPasImplExceptOn;
+  El : TJSTryFinallyStatement;
+  L : TJSStatementList;
+  I : TJSIfStatement;
+  IC : TJSRelationalExpressionInstanceOf;
+  V : TJSVarDeclaration;
+
+begin
+  // Try a:=B except on E : exception do  b:=c end;
+  // Try a:=B except on E : exception do  b:=c end;
+  {
+    Becomes:
+    try {
+     a=b;
+    } catch (jsexception) {
+      if jsexception instanceof exception {
+        var e = jsexception;
+        b = c;
+      }
+    }
+  }
+  T:=TPasImplTry.Create('',Nil);
+  T.AddElement(CreateAssignStatement('a','b'));
+  F:=T.AddExcept;
+  O:=F.AddExceptOn(CreateIdent('E'),CreateIdent('Exception'));
+  O.Body:=CreateAssignStatement('b','c');
+  // Convert
+  El:=TJSTryFinallyStatement(Convert(T,TJSTryCatchStatement));
+  AssertEquals('Correct exception object name','jsexception',EL.Ident);
+  L:=AssertListStatement('try..except block is statement list',El.BCatch);
+  AssertNull('No second statement',L.B);
+  I:=TJSIfStatement(AssertElement('On block is if',TJSIfStatement,L.A));
+  Ic:=TJSRelationalExpressionInstanceOf(AssertElement('If condition is InstanceOf expression',TJSRelationalExpressionInstanceOf,I.Cond));
+  Assertidentifier('InstanceOf left is exception object',Ic.A,'jsexception');
+  // Lowercased exception - May need checking
+  Assertidentifier('InstanceOf right is original exception type',Ic.B,'exception');
+  L:=AssertListStatement('On block is always a list',i.btrue);
+  V:=TJSVarDeclaration(AssertElement('First statement in list is a var declaration',TJSVarDeclaration,L.A));
+  AssertEquals('Variable name is identifier in On A : Ex do','e',V.Name);
+  Assertidentifier('Variable init is exception object',v.init,'jsexception');
+  L:=AssertListStatement('Second statement is again list',L.B);
+  AssertAssignStatement('Original assignment in second statement',L.A,'b','c');
+end;
+
+Procedure TTestStatementConverter.TestReRaise;
+Var
+  T : TPasImplTry;
+  F : TPasImplTryExcept;
+  O : TPasImplExceptOn;
+  El : TJSTryFinallyStatement;
+  L : TJSStatementList;
+  I : TJSIfStatement;
+  IC : TJSRelationalExpressionInstanceOf;
+  R : TJSThrowStatement;
+  V : TJSVarDeclaration;
+
+begin
+  // Try a:=B except on E : exception do  b:=c end;
+  {
+    Becomes:
+    try {
+     a=b;
+    } catch (jsexception) {
+      if jsexception instanceof exception {
+        var e = jsexception;
+        throw jsexception;
+      }
+    }
+  }
+  T:=TPasImplTry.Create('',Nil);
+  T.AddElement(CreateAssignStatement('a','b'));
+  F:=T.AddExcept;
+  O:=F.AddExceptOn(CreateIdent('E'),CreateIdent('Exception'));
+  O.Body:=TPasImplRaise.Create('',Nil);
+  // Convert
+  El:=TJSTryFinallyStatement(Convert(T,TJSTryCatchStatement));
+  AssertEquals('Correct exception object name','jsexception',EL.Ident);
+  L:=AssertListStatement('try..except block is statement list',El.BCatch);
+  AssertNull('No second statement',L.B);
+  I:=TJSIfStatement(AssertElement('On block is if',TJSIfStatement,L.A));
+  Ic:=TJSRelationalExpressionInstanceOf(AssertElement('If condition is InstanceOf expression',TJSRelationalExpressionInstanceOf,I.Cond));
+  Assertidentifier('InstanceOf left is exception object',Ic.A,'jsexception');
+  // Lowercased exception - May need checking
+  L:=AssertListStatement('On block is always a list',i.btrue);
+  V:=TJSVarDeclaration(AssertElement('First statement in list is a var declaration',TJSVarDeclaration,L.A));
+  AssertEquals('Variable name is identifier in On A : Ex do','e',V.Name);
+  Assertidentifier('Variable init is exception object',v.init,'jsexception');
+  L:=AssertListStatement('Second statement is again list',L.B);
+  R:=TJSThrowStatement(AssertElement('On block is throw statement',TJSThrowStatement,L.A));
+  Assertidentifier('R expression is original exception ',R.A,'jsexception');
+end;
+
+Procedure TTestStatementConverter.TestVariableStatement;
+
+Var
+  S : TPasSection;
+  V : TPasVariable;
+  L : TJSStatementList;
+  JV : TJSVariableStatement;
+  JVD : TJSVarDeclaration;
+begin
+  S:=TPasSection.Create('',Nil);
+  V:=TPasVariable.Create('A',Nil);
+  S.Declarations.Add(V);
+  S.Variables.Add(V);
+  L:=TJSStatementList(Convert(S,TJSStatementList));
+  JV:=TJSVariableStatement(AssertElement('Variable statement',TJSVariableStatement,L.A));
+  JVD:=TJSVarDeclaration(AssertElement('Variable declaration',TJSVarDeclaration,JV.A));
+  AssertEquals('Correct variable name','a',JVD.Name);
+end;
+
+{ TTestExpressionConverter }
+
+Function TTestExpressionConverter.TestLiteralExpression(AElement: TPasElement;
+  AClass: TJSElementClass): TJSLIteral;
+
+Var
+  E : TJSElement;
+
+begin
+  E:=Convert(AElement,AClass);
+  if not (E is TJSLiteral) then
+    Fail('Do not have literal class, but: '+E.ClassName);
+  Result:=TJSLIteral(E);
+end;
+
+Function TTestExpressionConverter.TestUnaryExpression(AElement: TPasElement; AClass: TJSElementClass): TJSUnary;
+
+Var
+  E : TJSElement;
+
+begin
+  E:=Convert(AElement,AClass);
+  AssertNotNull('Convert returned a result',E);
+  if not (E is TJSUnary) then
+    Fail('Do not have unary class, but: '+E.ClassName);
+  Result:=TJSUnary(E);
+end;
+
+Function TTestExpressionConverter.TestBinaryExpression(AElement: TPasElement;
+  AClass: TJSElementClass): TJSBinary;
+
+Var
+  E : TJSElement;
+
+begin
+  E:=Convert(AElement,AClass);
+  if not (E is TJSBinary) then
+    Fail('Do not have literal class, but: '+E.ClassName);
+  Result:=TJSBinary(E);
+end;
+
+Procedure TTestExpressionConverter.TestPrimitiveString;
+
+Var
+  S : TPrimitiveExpr;
+  E : TJSLiteral;
+
+begin
+  S:=TPrimitiveExpr.Create(Nil,pekString,'''me''');
+  E:=TestLiteralExpression(S,TJSLiteral);
+  AssertEquals('Correct literal type',jstString,E.Value.ValueType);
+  AssertEquals('Correct literal value','me',E.Value.AsString);
+end;
+
+Procedure TTestExpressionConverter.TestPrimitiveNumber;
+Var
+  S : TPrimitiveExpr;
+  E : TJSLiteral;
+
+begin
+  S:=TPrimitiveExpr.Create(Nil,pekNumber,'1.23');
+  E:=TestLiteralExpression(S,TJSLiteral);
+  AssertEquals('Correct literal type',jstNumber,E.Value.ValueType);
+  AssertEquals('Correct literal value',1.23,E.Value.AsNumber);
+end;
+
+Procedure TTestExpressionConverter.TestPrimitiveNil;
+
+Var
+  S : TNilExpr;
+  E : TJSLiteral;
+
+begin
+  S:=TNilExpr.Create(Nil);
+  E:=TestLiteralExpression(S,TJSLiteral);
+  AssertEquals('Correct literal type',jstNull,E.Value.ValueType);
+  AssertEquals('Correct literal value',True,E.Value.IsNull);
+end;
+
+Procedure TTestExpressionConverter.TestPrimitiveBoolTrue;
+Var
+  S : TBoolConstExpr;
+  E : TJSLiteral;
+
+begin
+  S:=TBoolConstExpr.Create(Nil,pekBoolConst,True);
+  E:=TestLiteralExpression(S,TJSLiteral);
+  AssertEquals('Correct literal type',jstBoolean,E.Value.ValueType);
+  AssertEquals('Correct literal value',True,E.Value.AsBoolean);
+end;
+
+Procedure TTestExpressionConverter.TestPrimitiveBoolFalse;
+
+Var
+  S : TBoolConstExpr;
+  E : TJSLiteral;
+
+begin
+  S:=TBoolConstExpr.Create(Nil,pekBoolConst,False);
+  E:=TestLiteralExpression(S,TJSLiteral);
+  AssertEquals('Correct literal type',jstBoolean,E.Value.ValueType);
+  AssertEquals('Correct literal value',False,E.Value.AsBoolean);
+end;
+
+Procedure TTestExpressionConverter.TestPrimitiveIdent;
+
+Var
+  Id : TPrimitiveExpr;
+  Res : TJSPrimaryExpressionIdent;
+begin
+  Id:=TPrimitiveExpr.Create(Nil,pekIdent,'a');
+  Res:=TJSPrimaryExpressionIdent(Convert(Id,TJSPrimaryExpressionIdent));
+  AssertEquals('Correct identifier name','a',Res.Name);
+end;
+
+Procedure TTestExpressionConverter.TestUnaryMinus;
+Var
+  U : TUnaryExpr;
+  E : TJSUnaryMinusExpression;
+
+begin
+  U:=TUnaryExpr.Create(Nil,pekUnary,eopSubtract);
+  U.Operand:=CreateLiteral(1.23);
+  E:=TJSUnaryMinusExpression(TestUnaryExpression(U,TJSUnaryMinusExpression));
+  AssertLiteral('Correct literal for minus',E.A,1.23)
+end;
+
+Procedure TTestExpressionConverter.TestUnaryPlus;
+Var
+  U : TUnaryExpr;
+  E : TJSUnaryPlusExpression;
+
+begin
+  U:=TUnaryExpr.Create(Nil,pekUnary,eopAdd);
+  U.Operand:=CreateLiteral(1.23);
+  E:=TJSUnaryPlusExpression(TestUnaryExpression(U,TJSUnaryPlusExpression));
+  AssertLiteral('Correct literal for plus',E.A,1.23)
+end;
+
+Procedure TTestExpressionConverter.TestBinaryPlus;
+Var
+  B : TBinaryExpr;
+  E : TJSAdditiveExpressionPlus;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopAdd);
+  B.left:=CreateLiteral(1.23);
+  B.Right:=CreateLiteral(3.45);
+  E:=TJSAdditiveExpressionPlus(TestBinaryExpression(B,TJSAdditiveExpressionPlus));
+  AssertLiteral('Correct left literal for addition',E.A,1.23);
+  AssertLiteral('Correct right literal for addition',E.B,3.45);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryMinus;
+Var
+  B : TBinaryExpr;
+  E : TJSAdditiveExpressionMinus;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopSubtract);
+  B.left:=CreateLiteral(1.23);
+  B.Right:=CreateLiteral(3.45);
+  E:=TJSAdditiveExpressionMinus(TestBinaryExpression(B,TJSAdditiveExpressionMinus));
+  AssertLiteral('Correct left literal for subtract',E.A,1.23);
+  AssertLiteral('Correct right literal for subtract',E.B,3.45);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryMultiply;
+Var
+  B : TBinaryExpr;
+  E : TJSMultiplicativeExpressionMul;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopMultiply);
+  B.left:=CreateLiteral(1.23);
+  B.Right:=CreateLiteral(3.45);
+  E:=TJSMultiplicativeExpressionMul(TestBinaryExpression(B,TJSMultiplicativeExpressionMul));
+  AssertLiteral('Correct left literal for multiplication',E.A,1.23);
+  AssertLiteral('Correct right literal for multiplication',E.B,3.45);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryDivision;
+
+Var
+  B : TBinaryExpr;
+  E : TJSMultiplicativeExpressionDiv;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopDivide);
+  B.left:=CreateLiteral(1.23);
+  B.Right:=CreateLiteral(3.45);
+  E:=TJSMultiplicativeExpressionDiv(TestBinaryExpression(B,TJSMultiplicativeExpressionDiv));
+  AssertLiteral('Correct left literal for division',E.A,1.23);
+  AssertLiteral('Correct right literal for division',E.B,3.45);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryDiv;
+
+Var
+  B : TBinaryExpr;
+  E : TJSMultiplicativeExpressionDiv;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopDiv);
+  B.left:=CreateLiteral(1.23);
+  B.Right:=CreateLiteral(3.45);
+  E:=TJSMultiplicativeExpressionDiv(TestBinaryExpression(B,TJSMultiplicativeExpressionDiv));
+  AssertLiteral('Correct left literal for div',E.A,1.23);
+  AssertLiteral('Correct right literal for div',E.B,3.45);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryMod;
+Var
+  B : TBinaryExpr;
+  E : TJSMultiplicativeExpressionMod;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopMod);
+  B.left:=CreateLiteral(1.23);
+  B.Right:=CreateLiteral(3.45);
+  E:=TJSMultiplicativeExpressionMod(TestBinaryExpression(B,TJSMultiplicativeExpressionMod));
+  AssertLiteral('Correct left literal for mod',E.A,1.23);
+  AssertLiteral('Correct right literal for mod',E.B,3.45);
+end;
+
+Procedure TTestExpressionConverter.TestBinarySHL;
+Var
+  B : TBinaryExpr;
+  E : TJSLShiftExpression;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopSHL);
+  B.left:=CreateLiteral(13);
+  B.Right:=CreateLiteral(3);
+  E:=TJSLShiftExpression(TestBinaryExpression(B,TJSLShiftExpression));
+  AssertLiteral('Correct left literal for shl',E.A,13);
+  AssertLiteral('Correct right literal for shl',E.B,3);
+end;
+
+Procedure TTestExpressionConverter.TestBinarySHR;
+Var
+  B : TBinaryExpr;
+  E : TJSRShiftExpression;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopSHR);
+  B.left:=CreateLiteral(13);
+  B.Right:=CreateLiteral(3);
+  E:=TJSRShiftExpression(TestBinaryExpression(B,TJSRShiftExpression));
+  AssertLiteral('Correct left literal for shr',E.A,13);
+  AssertLiteral('Correct right literal for shr',E.B,3);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryEqual;
+Var
+  B : TBinaryExpr;
+  E : TJSEqualityExpressionEq;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopEqual);
+  B.left:=CreateLiteral(13);
+  B.Right:=CreateLiteral(3);
+  E:=TJSEqualityExpressionEq(TestBinaryExpression(B,TJSEqualityExpressionEq));
+  AssertLiteral('Correct left literal for equal',E.A,13);
+  AssertLiteral('Correct right literal for equal',E.B,3);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryNotEqual;
+Var
+  B : TBinaryExpr;
+  E : TJSEqualityExpressionNE;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopNotEqual);
+  B.left:=CreateLiteral(13);
+  B.Right:=CreateLiteral(3);
+  E:=TJSEqualityExpressionNE(TestBinaryExpression(B,TJSEqualityExpressionNE));
+  AssertLiteral('Correct left literal for not equal',E.A,13);
+  AssertLiteral('Correct right literal for not equal',E.B,3);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryLessThan;
+
+Var
+  B : TBinaryExpr;
+  E : TJSRelationalExpressionLT;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopLessThan);
+  B.left:=CreateLiteral(13);
+  B.Right:=CreateLiteral(3);
+  E:=TJSRelationalExpressionLT(TestBinaryExpression(B,TJSRelationalExpressionLT));
+  AssertLiteral('Correct left literal for less than',E.A,13);
+  AssertLiteral('Correct right literal for less than',E.B,3);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryLessThanEqual;
+
+Var
+  B : TBinaryExpr;
+  E : TJSRelationalExpressionLE;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopLessThanEqual);
+  B.left:=CreateLiteral(13);
+  B.Right:=CreateLiteral(3);
+  E:=TJSRelationalExpressionLE(TestBinaryExpression(B,TJSRelationalExpressionLE));
+  AssertLiteral('Correct left literal for less than or equal',E.A,13);
+  AssertLiteral('Correct right literal for less than or equal',E.B,3);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryGreater;
+Var
+  B : TBinaryExpr;
+  E : TJSRelationalExpressionGT;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopGreaterThan);
+  B.left:=CreateLiteral(13);
+  B.Right:=CreateLiteral(3);
+  E:=TJSRelationalExpressionGT(TestBinaryExpression(B,TJSRelationalExpressionGT));
+  AssertLiteral('Correct left literal for greater than',E.A,13);
+  AssertLiteral('Correct right literal for greater than',E.B,3);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryGreaterThanEqual;
+
+Var
+  B : TBinaryExpr;
+  E : TJSRelationalExpressionGE;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopGreaterThanEqual);
+  B.left:=CreateLiteral(13);
+  B.Right:=CreateLiteral(3);
+  E:=TJSRelationalExpressionGE(TestBinaryExpression(B,TJSRelationalExpressionGE));
+  AssertLiteral('Correct left literal for greater than or equal',E.A,13);
+  AssertLiteral('Correct right literal for greater than or equal',E.B,3);
+end;
+
+Procedure TTestExpressionConverter.TestBinaryIs;
+Var
+  B : TBinaryExpr;
+  E : TJSRelationalExpressionInstanceOf;
+
+begin
+  B:=TBinaryExpr.Create(Nil,pekBinary,eopIs);
+  B.left:=CreateIdent('a');
+  B.Right:=CreateIdent('b');
+  E:=TJSRelationalExpressionInstanceOf(TestBinaryExpression(B,TJSRelationalExpressionInstanceOf));
+  AssertIdentifier('Correct left literal for is',E.A,'a');
+  AssertIdentifier('Correct right literal for is',E.B,'b');
+end;
+
+Procedure TTestExpressionConverter.TestCallExpressionNone;
+Var
+  B : TParamsExpr;
+  E : TJSCallExpression;
+
+begin
+  // a();
+  B:=CreateFunctionCall('a',[]);
+  E:=TJSCallExpression(Convert(B,TJSCallExpression));
+  AssertIdentifier('Correct left literal for is',E.Expr,'a');
+  AssertNull('No arguments',E.Args);
+//  AssertEquals('No arguments',0,E.Args.Elements.Count);
+end;
+
+Procedure TTestExpressionConverter.TestCallExpressionOne;
+
+Var
+  B : TParamsExpr;
+  E : TJSCallExpression;
+
+begin
+  // a(b);
+  B:=CreateFunctionCall('a',['b']);
+  E:=TJSCallExpression(Convert(B,TJSCallExpression));
+  AssertIdentifier('Correct left literal for is',E.Expr,'a');
+  AssertNotNull('have arguments',E.Args);
+  AssertEquals('Argument count',1,E.Args.Elements.Count);
+  AssertIdentifier('Argument 1 identifier',E.Args.Elements[0].Expr,'b');
+end;
+
+Procedure TTestExpressionConverter.TestCallExpressionTwo;
+Var
+  B : TParamsExpr;
+  E : TJSCallExpression;
+
+begin
+  // a(b,c);
+  B:=CreateFunctionCall('a',['b','c']);
+  E:=TJSCallExpression(Convert(B,TJSCallExpression));
+  AssertIdentifier('Correct left literal for is',E.Expr,'a');
+  AssertNotNull('have arguments',E.Args);
+  AssertEquals('Argument count',2,E.Args.Elements.Count);
+  AssertIdentifier('Argument 1 identifier',E.Args.Elements[0].Expr,'b');
+  AssertIdentifier('Argument 2 identifier',E.Args.Elements[1].Expr,'c');
+end;
+
+Procedure TTestExpressionConverter.TestMemberExpressionArrayOneDim;
+
+Var
+  B : TParamsExpr;
+  E : TJSBracketMemberExpression;
+
+begin
+  // a[b];
+  B:=TParamsExpr.Create(Nil,pekArrayParams,eopNone);
+  B.Value:=CreateIdent('a');
+  B.AddParam(CreateIdent('b'));
+  E:=TJSBracketMemberExpression(Convert(B,TJSBracketMemberExpression));
+  AssertIdentifier('Correct array name',E.MExpr,'a');
+  AssertIdentifier('Correct array member name',E.Name,'b');
+end;
+
+Procedure TTestExpressionConverter.TestMemberExpressionArrayTwoDim;
+Var
+  B : TParamsExpr;
+  E : TJSBracketMemberExpression;
+
+begin
+  // a[b,c];
+  B:=TParamsExpr.Create(Nil,pekArrayParams,eopNone);
+  B.Value:=CreateIdent('a');
+  B.AddParam(CreateIdent('b'));
+  B.AddParam(CreateIdent('c'));
+  AttemptConvert:=B;
+  AssertException('Cannot yet convert 2-dim arrays',EPasToJS,@TryConvert);
+end;
+
+Procedure TTestExpressionConverter.TestVariable;
+
+Var
+  VD : TJSVarDeclaration;
+  R :TPasVariable;
+begin
+  R:=TPasVariable.Create('A',Nil);
+  VD:=TJSVarDeclaration(Convert(R,TJSVarDeclaration));
+  AssertEquals('Correct name, lowercased','a',VD.Name);
+  AssertNull('No init',VD.Init);
+end;
+
+Procedure TTestExpressionConverter.TestArrayVariable;
+Var
+  VD : TJSVarDeclaration;
+  R :TPasVariable;
+  A : TJSArrayLiteral;
+
+begin
+  R:=TPasVariable.Create('A',Nil);
+  R.VarType:=TPasArrayType.Create('myarray',Nil);
+  VD:=TJSVarDeclaration(Convert(R,TJSVarDeclaration));
+  AssertEquals('Correct name, lowercased','a',VD.Name);
+  A:=TJSArrayLiteral(AssertElement('Init is array literal',TJSArrayLiteral,VD.Init));
+  AssertEquals('No elements',0,A.Elements.Count);
+end;
+
+procedure TTestTestConverter.TestEmpty;
+begin
+  AssertNotNull('Have converter',Converter);
+end;
+
+procedure TTestConverter.SetUp;
+begin
+  FConverter:=TPasToJSConverter.Create;
+end;
+
+procedure TTestConverter.TearDown;
+begin
+  FreeAndNil(FRes);
+  FreeAndNil(FSource);
+  FreeAndNil(FConverter);
+end;
+
+Procedure TTestConverter.TryConvert;
+begin
+  Convert(FAC,TJSElement);
+end;
+
+Function TTestConverter.Convert(AElement: TPasElement; AClass: TJSElementClass
+  ): TJSElement;
+begin
+  FSource:=AElement;
+  Result:=FConverter.ConvertElement(AElement);
+  FRes:=Result;
+  if (AClass<>Nil) then
+    begin
+    AssertNotNull('Have conversion result',Result);
+    AssertEquals('Conversion result has correct class',AClass,Result.ClassType);
+    end;
+end;
+
+Class procedure TTestConverter.AssertEquals(Const Msg: String; AExpected, AActual: TJSType);
+begin
+  AssertEquals(Msg,GetEnumName(TypeInfo(TJSType),Ord(AExpected)),
+                   GetEnumName(TypeInfo(TJSType),Ord(AActual)));
+end;
+
+Class procedure TTestConverter.AssertLiteral(Const Msg : String; Lit: TJSElement; AType: TJSType);
+begin
+  AssertNotNull(Msg+': Have instance',Lit);
+  AssertEquals(Msg+': Correct class',TJSLIteral,Lit.ClassType);
+  AssertEquals(Msg+': Correct value type',AType,TJSLIteral(Lit).Value.ValueType);
+end;
+
+Class procedure TTestConverter.AssertLiteral(Const Msg : String; Lit: TJSElement; AValue: Boolean);
+begin
+  AssertLiteral(Msg,Lit,jstBoolean);
+  AssertEquals(Msg+': Correct value',AValue,TJSLiteral(Lit).Value.AsBoolean);
+end;
+
+Class procedure TTestConverter.AssertLiteral(Const Msg : String; Lit: TJSElement; AValue: TJSString);
+begin
+  AssertLiteral(Msg,Lit,jstString);
+  AssertEquals(Msg+': Correct value',AValue,TJSLiteral(Lit).Value.AsString);
+end;
+
+Class procedure TTestConverter.AssertLiteral(Const Msg : String; Lit: TJSElement; AValue: TJSNumber);
+begin
+  AssertLiteral(Msg,Lit,jstNumber);
+  AssertEquals(Msg+': Correct value',AValue,TJSLiteral(Lit).Value.AsNumber);
+end;
+
+Class procedure TTestConverter.AssertIdentifier(Const Msg: String;
+  Ident: TJSElement; AName: String);
+begin
+  AssertNotNull(Msg+': Have instance',Ident);
+  AssertEquals(Msg+': Correct class',TJSPrimaryExpressionIdent,Ident.ClassType);
+  AssertEquals(Msg+': Correct name',AName,TJSPrimaryExpressionIdent(Ident).Name);
+end;
+
+Class Function TTestConverter.CreateLiteral(AValue: String): TPasExpr;
+begin
+  Result:=TPrimitiveExpr.Create(Nil,pekString,'me');
+end;
+
+Class Function TTestConverter.CreateLiteral(AValue: Double): TPasExpr;
+
+Var
+  S : String;
+
+begin
+  Str(AValue,S);
+  Result:=TPrimitiveExpr.Create(Nil,pekNumber,S);
+end;
+
+Class Function TTestConverter.CreateIdent(AName: String): TPrimitiveExpr;
+begin
+  Result:=TPrimitiveExpr.Create(Nil,pekIdent,AName);
+end;
+
+Class Function TTestConverter.CreateCondition : TPasExpr;
+
+begin
+  Result:=CreateIdent('a');
+end;
+
+Class Function TTestConverter.CreateAssignStatement(LHS: String = 'a';RHS : String = 'b'): TPasImplAssign;
+
+begin
+  Result:=TPasImplAssign.Create('',Nil);
+  Result.left:=CreateIdent(LHS);
+  Result.right:=CreateIdent(RHS);
+end;
+
+Class Function TTestConverter.CreateFunctionCall(AName: String;
+  Params: Array of String): TParamsExpr;
+
+Var
+  I : Integer;
+
+begin
+  Result:=TParamsExpr.Create(Nil,pekFuncParams,eopNone);
+  Result.Value:=CreateIdent(AName);
+  For I:=Low(Params) to High(Params) do
+    Result.AddParam(TPasExpr(CreateIdent(Params[I])));
+end;
+
+Class Procedure TTestConverter.AssertAssignStatement(Const Msg : String; El : TJSElement;LHS: String = 'a';RHS : String = 'b');
+
+begin
+  AssertNotNull(Msg+': have statement',EL);
+  If not (El is TJSSimpleAssignStatement) then
+    Fail(Msg+': statement is not assign statement but is'+El.ClassName);
+  AssertIdentifier(Msg+': left hand side ('+LHS+')',TJSAssignStatement(EL).LHS,LHS);
+  AssertIdentifier(Msg+': left hand side ('+LHS+')',TJSAssignStatement(EL).Expr,RHS);
+end;
+
+Class Procedure TTestConverter.AssertEmptyBlockStatement(Const Msg: String;
+  El: TJSElement);
+begin
+  AssertNotNull(Msg+': have statement',EL);
+  If not (El is TJSEmptyBlockStatement) then
+    Fail(Msg+': statement is not empty block statement but is'+El.ClassName);
+end;
+
+class Function TTestConverter.AssertListStatement(Const Msg: String;
+  El: TJSElement): TJSStatementList;
+begin
+  AssertNotNull(Msg+': have statement',EL);
+  If not (El is TJSStatementList) then
+    Fail(Msg+': statement is not a list statement but is'+El.ClassName);
+  Result:=TJSStatementList(El);
+end;
+
+class Function TTestConverter.AssertElement(Const Msg: String;
+  AClass: TJSElementClass; El: TJSElement): TJSElement;
+begin
+  AssertNotNull(Msg+': have element',El);
+  if not (El is ACLass) then
+    Fail(Msg+': is not of class '+AClass.ClassName+' but is '+EL.ClassName);
+  Result:=El;
+end;
+
+Initialization
+  RegisterTests([TTestTestConverter,TTestExpressionConverter,TTestStatementConverter]);
+end.
+

+ 81 - 0
packages/pastojs/tests/testpas2js.lpi

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="9"/>
+    <General>
+      <SessionStorage Value="InProjectDir"/>
+      <MainUnit Value="0"/>
+      <Title Value="Pascal to Javascript converter tests"/>
+      <UseAppBundle Value="False"/>
+      <ResourceType Value="res"/>
+    </General>
+    <i18n>
+      <EnableI18N LFM="False"/>
+    </i18n>
+    <VersionInfo>
+      <StringTable ProductVersion=""/>
+    </VersionInfo>
+    <BuildModes Count="1">
+      <Item1 Name="Default" Default="True"/>
+    </BuildModes>
+    <PublishOptions>
+      <Version Value="2"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="2">
+      <Item1>
+        <PackageName Value="FPCUnitConsoleRunner"/>
+      </Item1>
+      <Item2>
+        <PackageName Value="FCL"/>
+      </Item2>
+    </RequiredPackages>
+    <Units Count="3">
+      <Unit0>
+        <Filename Value="testpas2js.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="testpas2js"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="tcconverter.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="tcconverter"/>
+      </Unit1>
+      <Unit2>
+        <Filename Value="../src/fppas2js.pp"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="fppas2js"/>
+      </Unit2>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="11"/>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)"/>
+      <OtherUnitFiles Value="../src"/>
+    </SearchPaths>
+    <Other>
+      <CompilerMessages>
+        <MsgFileName Value=""/>
+      </CompilerMessages>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions Count="3">
+      <Item1>
+        <Name Value="EAbort"/>
+      </Item1>
+      <Item2>
+        <Name Value="ECodetoolError"/>
+      </Item2>
+      <Item3>
+        <Name Value="EFOpenError"/>
+      </Item3>
+    </Exceptions>
+  </Debugging>
+</CONFIG>

+ 39 - 0
packages/pastojs/tests/testpas2js.pp

@@ -0,0 +1,39 @@
+{
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2014 by Michael Van Canneyt
+
+    Unit tests runner for Pascal-to-Javascript converter class.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program testpas2js;
+
+{$mode objfpc}{$H+}
+
+uses
+  Classes, consoletestrunner, tcconverter, fppas2js;
+
+type
+
+  TMyTestRunner = class(TTestRunner)
+  protected
+  end;
+
+var
+  Application: TMyTestRunner;
+
+begin
+  DefaultFormat:=fPlain;
+  DefaultRunAllTests:=True;
+  Application := TMyTestRunner.Create(nil);
+  Application.Initialize;
+  Application.Title:='Pascal to Javascript converter tests';
+  Application.Run;
+  Application.Free;
+end.

+ 81 - 0
packages/pastojs/todo.txt

@@ -0,0 +1,81 @@
+Things that need to be done:
+
+Var Arguments:
+
+Procedure A(var B : integer);
+
+begin
+  B:=123;
+end;
+  
+Var
+  C : Integer;
+
+begin
+  C:=456;
+  A(C);
+end.
+
+Callee, assume reference (needs examining arguments): 
+
+function a(b) {
+  b.r:=123;
+}
+
+Caller side: generate a temp object var
+var c = 0;
+c=456;
+var c$123 = {r : c};
+try {
+  a(c$123);
+} finally {
+ c=c$123.r;
+}
+Advantage: no transformations needed.
+Disadvantage: try/finally needed in case callee (a) throws an exception.
+
+Caller side: allocate variable as object from the very start.
+var
+  c = {r: 0};
+c.r=123;
+a(c);
+
+Overloads:
+----------
+Function A(S : String) : String;
+Function A(I : Integer) : String;
+
+Add suffix:
+function a$1(s) {
+}
+function a$2(i) {
+}
+when calling overloaded version, we need to determine which one needs to be
+called.
+
+Object model:
+-------------
+
+2 Possibilities:
+- Use Javascript Objects, java class model using prototype
+  Disadvantages: 
+  "this" is rather 'confused' in javascript, 
+  use of constructor ? 
+  delegation (procedure of object), event handlers ? (and this!)
+
+- Roll our own in a flat model, explicitly passing self.
+  TMyClass = Class
+    Function MyFunction(S : string);
+  end;
+  Defines a class. Class is an object
+  Var TMyClass = {
+    $_ClassName : "TMyClass",
+    $_ParentClass : "TObject",
+    myfunction : function (Self,s) {
+    }
+  }
+  A:=TMyClass.Create()
+  needs some helper magic:
+  A:=TMyClass.Create($NewClassInstance(TMyClass))
+
+  Disadvantage: not using javascript classes, how to import external javascript objects ?