Commit Graph

35053 Commits

Author SHA1 Message Date
Jonas Maebe
48710a5a3f * print the owning class/record of internally generated methods when
parsing their implementation if -vd is specified

git-svn-id: branches/jvmbackend@18754 -
2011-08-20 08:32:57 +00:00
Jonas Maebe
d33f71460f * don't initialize static arrays of records twice (g_newarray already
initializes them)

git-svn-id: branches/jvmbackend@18753 -
2011-08-20 08:32:52 +00:00
Jonas Maebe
0b7b6361fe * ignore methods that are added for the purpose of the JVM (inherited
constructors, inherited virtual class methods) when deciding which
    overloaded version of a routine to call. Otherwise they can change
    which variant is called compared to code on platforms where such
    implicit methods are not added

git-svn-id: branches/jvmbackend@18752 -
2011-08-20 08:32:47 +00:00
Jonas Maebe
a73d5b6da7 * only set the assignmentside flag for typeconversion nodes in
valid_for_assign() if that routine returns true (in some cases,
    it's used to simply check whether we could possibly put it on
    the assignment side)

git-svn-id: branches/jvmbackend@18751 -
2011-08-20 08:32:41 +00:00
Jonas Maebe
da5bd3b0bd * use invokespecial for "strict private" (= Java "private") rather than for
plain "private" (~ Java "package") methods

git-svn-id: branches/jvmbackend@18750 -
2011-08-20 08:32:37 +00:00
Jonas Maebe
7f22a2f223 + support for range checking calculations with hlcgobj
* added runerror number to JVM FpcRunTimeError exceptions
  * enabled calling errorproc when a run time error occurs on the
    JVM target

git-svn-id: branches/jvmbackend@18749 -
2011-08-20 08:32:31 +00:00
Jonas Maebe
851cb65021 * activate code to remove unnecessary widenings to 64 bit in case
cpu64bitaddr is not defined rather than if cpu64bitalu is not
    defined, because whether or not operations should be 64 bit by
    default depends on cpu64bitaddr, and even if a cpu can perform
    64 bit alu operations, 32 bit ones are likely faster

git-svn-id: branches/jvmbackend@18748 -
2011-08-20 08:32:26 +00:00
Jonas Maebe
d48fa1d7e2 * for all managed VM targets, reject ord->ptr typecasts (except for 0),
typeof(), typeinfo(), seg(), ofs(), settextbuf(), slice(), resourcestring,
    new(), dispose()

git-svn-id: branches/jvmbackend@18747 -
2011-08-20 08:32:21 +00:00
Jonas Maebe
8a95a04e16 * extracted dynarray helpers from system unit into jdynarr.inc (were
in the system unit for easier debugging)
  * disabled a bunch more feature flags by default for the JVM target
  * incorporate modified version of inc/systemh.inc (split into two parts:
    jsystemh_types.inc and jsystemh.inc, because some of the types are
    required for the declaration of the shortstring/ansistring/set/...
    classes, which in turn are required for the routine declarations) and
    inc/system.inc (as jsystem.inc)
   o moved some routines around from old to new locations based on where
     they appear in the common files
   o added a number of defines that allow skipping more common implementations
     in case a platform-specific one is already available
  * all base classes (AnsistringClass etc) are now descendants of
    JLObject rather than TObject, because their declaration is now parsed
    before TObject is known (and there's no need for them to inherit from
    TObject)
  * incorporate modified version of inc/system.inc
  * use the common version of generic.inc, currh.inc, gencurr.inc and
    genmath.inc (with small modification to those files)
  + addition of quite a bit of system unit functionality (halt, runerror,
    random, round, str() for integer types, abs, odd, endian swapping helpers,
    bit scanning, trigonometric functions, ln, exp, ...)
   o round()/trunc() for comp-types has been renamed trunc_comp() on the
     JVM target because their JVM signature conflicts with trunc(currency)
   o the unsigned versions of swapendian() and other endian helpers are not
     available on the JVM target because of JVM signature conflicts

git-svn-id: branches/jvmbackend@18746 -
2011-08-20 08:32:13 +00:00
Jonas Maebe
1418faf854 * converted tcginlinenode.second_abs_long() to hlcgobj
git-svn-id: branches/jvmbackend@18745 -
2011-08-20 08:32:05 +00:00
Jonas Maebe
f4690f90ad * keep maximum used evaluation stack size up-to-date when putting a
default return value on the stack for fpu routines

git-svn-id: branches/jvmbackend@18744 -
2011-08-20 08:31:53 +00:00
Jonas Maebe
27c004807f * typecast the indices generated for array constants in the node-based
typed constant parser to the rangedef of the array (can be an enum,
    char, etc)

git-svn-id: branches/jvmbackend@18743 -
2011-08-20 08:31:41 +00:00
Jonas Maebe
fe82e2481b + import java.lang.Math in the system unit
+ include mathh.inc in the system unit, implement most routines based
    on java.lang.Math, and use (an unmodified!) genmath for the rest
  - removed now obsolete jmathh.inc (was partial copy of mathh.inc)
  - removed commented out overrides for several math routines in
    njvminl (doesn't make sense to handle them inline in the compiler)

git-svn-id: branches/jvmbackend@18742 -
2011-08-20 08:31:24 +00:00
Jonas Maebe
af489b99de * fixed handling of currency in int_to_int conversions
git-svn-id: branches/jvmbackend@18741 -
2011-08-20 08:31:12 +00:00
Jonas Maebe
48d63f2c75 * when taking the address of an expression for a with-statement, make
it a typed address to prevent unnecessary checkcast instructions
    on the JVM target

git-svn-id: branches/jvmbackend@18740 -
2011-08-20 08:30:57 +00:00
Jonas Maebe
72c81d9eb1 * always create a new call node when replacing virtual class method calls
with wrapper calls, because the parameter nodes are already bound to the
    paravarsyms of the current procdef so simply replacing the procsym and
    procdef is not enough

git-svn-id: branches/jvmbackend@18739 -
2011-08-20 08:30:38 +00:00
Jonas Maebe
084c76119b * use unsigned type for unsigned comparison
git-svn-id: branches/jvmbackend@18738 -
2011-08-20 08:30:26 +00:00
Jonas Maebe
a216707cf2 * also generate wrappers for inherited virtual class methods, because their
visibility can change. However, simply call the inherited version in
    those rather than re-adding the complete dispatching code again

git-svn-id: branches/jvmbackend@18737 -
2011-08-20 08:30:15 +00:00
Jonas Maebe
c2f2a8c900 * make sure that the expression representing the ansi/unicodestring argument
to length is never evaluated more than once

git-svn-id: branches/jvmbackend@18736 -
2011-08-20 08:30:02 +00:00
Jonas Maebe
707b41b159 + allocate space of local typed consts that are implicit pointer types
in the enclosing class/unit init code

git-svn-id: branches/jvmbackend@18735 -
2011-08-20 08:29:47 +00:00
Jonas Maebe
9253d990d9 * use the signedness of the comparison operation rather than of the
types involved to determine whether or not the comparison is
    unsigned (they don't always match due to bugs in the compiler,
    and the sign of the comparison operation is what's used in
    other code generators too)

git-svn-id: branches/jvmbackend@18734 -
2011-08-20 08:29:36 +00:00
Jonas Maebe
6fe124507e * fixed calling procvars with copyout parameters
git-svn-id: branches/jvmbackend@18733 -
2011-08-20 08:29:24 +00:00
Jonas Maebe
8fcc8f92ca * allow taking the address of var-parameters in normal Pascal code (not just
via internal njvmaddrnodes), because we need it for procvar dispatching

git-svn-id: branches/jvmbackend@18732 -
2011-08-20 08:29:11 +00:00
Jonas Maebe
c7f6ee94e6 * always get the real class definition before writing out a mangled name
git-svn-id: branches/jvmbackend@18731 -
2011-08-20 08:28:57 +00:00
Jonas Maebe
441787672d * migrated java.lang.NoSuchMethodException to java_sys.inc
* catch java.lang.NoSuchMethodException exceptions when resolving a procvar,
    because java.lang.Class.getDeclaredMethod() only searches that particular
    class itself and not its parents -> in case we get the address of a method
    that's not overridden in the current class, also search the parent classes

git-svn-id: branches/jvmbackend@18730 -
2011-08-20 08:28:45 +00:00
Jonas Maebe
2338463a4b * don't mark non-virtual class methods automatically as "final"
git-svn-id: branches/jvmbackend@18729 -
2011-08-20 08:28:30 +00:00
Jonas Maebe
13d68da2be * translated Pascal 'protected' also in JVM 'protected', because 'protected'
in the JVM means "accessible to subclasses *and* to classes in the same
    package" (and all classes in the same unit are by definition also in the
    same package) -- before, such fields were declared as "package" which means
    that they could not be accessed by subclasses in other packages

git-svn-id: branches/jvmbackend@18728 -
2011-08-20 08:28:17 +00:00
Jonas Maebe
3791f0de1c * fixed mangled name of JVM class vars with an external name in case their
type is a forward-defined class whose full definition hasn't been parsed
    yet and if the full definition changes the external name of the class

git-svn-id: branches/jvmbackend@18727 -
2011-08-20 08:28:09 +00:00
Jonas Maebe
9bdcb1d7e5 * also write the stativarsym section information when symansistr is defined
git-svn-id: branches/jvmbackend@18726 -
2011-08-20 08:28:04 +00:00
Jonas Maebe
b59df3f2fd * reparsed with new version of javapp that doesn't mark final static
methods as "virtual" anymore (since they're not virtual, and the
    compiler now handles virtual class methods differently)

git-svn-id: branches/jvmbackend@18725 -
2011-08-20 08:27:59 +00:00
Jonas Maebe
df5fc421ce + support for increasing the visibility of fields using properties
on the JVM target (at the Pascal level), by automatically generating
    getters/setters of the same visibility as the property that are used
    instead of directly accessing the fields when translating the property

git-svn-id: branches/jvmbackend@18724 -
2011-08-20 08:27:53 +00:00
Jonas Maebe
b3072b3dab * extracted the code to deal with static fields into a routine
(make_field_static() ) and replaced semi-duplicates of that
    code with calls to this routine
  * made the handling of static fields for the JVM target more
    similar to that on the other targets, so that class properties
    now also work there (-> updated JVM-specific code in several
    places to deal with this new handling)

git-svn-id: branches/jvmbackend@18723 -
2011-08-20 08:27:48 +00:00
Jonas Maebe
1c74072748 * moved handle_staticfield_access() from pexpr to nutils so it can
be reused elsewhere
  * moved check_hints() from htypechk to symsym (so it can be called
    from nutils, and it's also more about symbols than about types)

git-svn-id: branches/jvmbackend@18722 -
2011-08-20 08:27:42 +00:00
Jonas Maebe
dbe55d1f6f * only override "clone" for records that contain fields that require a
deep copy, and for those records no longer call the inherited clone.
    Instead, declare a local variable of the record type, assign its
    address to the function and then copy all field contents to this local
    variable. Since it's dynamically allocated at the JVM level, it will
    survive the function exit.

    The problem with calling the inherited clone function is that it will
    copy the pointers of the implicit pointer fields (records, sets, …)
    from the old to the new instance, and that we (currently) have no way
    at the Pascal level to change those and make them point to new
    instances.

git-svn-id: branches/jvmbackend@18721 -
2011-08-20 08:27:37 +00:00
Jonas Maebe
e7528bbc05 * allow non-virtual class methods to be declared as "final" in Java classes,
since virtual class methods are handled differently from regular ones and
    the JDK contains several (non-virtual, since Java does not support virtual
    class methods) final class methods

git-svn-id: branches/jvmbackend@18720 -
2011-08-20 08:27:32 +00:00
Jonas Maebe
7092f2957a * use deep copies rather than cloning when copying array contents
(since the elements in the destination array are guaranteed to
     exist already)

git-svn-id: branches/jvmbackend@18719 -
2011-08-20 08:27:27 +00:00
Jonas Maebe
3ac950eed7 * changed the parameter of fpcDeepCopy() from an out-parameter of the
actual recordtype into FpcBaseRecordType so we can also use
    the deep copy routine in the RTL
  + added abstract fpcDeepCopy() declaration to FpcBaseRecordType class

git-svn-id: branches/jvmbackend@18718 -
2011-08-20 08:27:22 +00:00
Jonas Maebe
469bda2710 * fixed ShortStringClass.toString() (skipped last char) and also use it
in ShortStringClass.toUnicodeString()

git-svn-id: branches/jvmbackend@18717 -
2011-08-20 08:27:16 +00:00
Jonas Maebe
d583243fbb * only generate the dispatch wrapper for virtual class methods and virtual
constructors in the base class that defines them, rather than also in
    every class that overrides them (since the dispatch routine is the same
    everywhere)

git-svn-id: branches/jvmbackend@18716 -
2011-08-20 08:27:11 +00:00
Jonas Maebe
ad871b6acd * automatically generate versions of inherited virtual class methods that
call through to the parent method in case they are not overridden in
    the child class, because otherwise the dynamic dispatch fails (looking
    up a class method only checks that particular class, since they are
    never virtual in Java and hence not inherited either)

git-svn-id: branches/jvmbackend@18715 -
2011-08-20 08:27:07 +00:00
Jonas Maebe
57c7e21d8f * support propagating a function result (if any) from functions called
via tsk_anon_inherited synthetic functions

git-svn-id: branches/jvmbackend@18714 -
2011-08-20 08:27:02 +00:00
Jonas Maebe
18310034d7 * never allow hiding an inherited virtual class method or virtual constructor
by a non-virtual classmethod/constructor on the JVM target, because they
    would also be picked up by the dynamic dispatch

git-svn-id: branches/jvmbackend@18713 -
2011-08-20 08:26:57 +00:00
Jonas Maebe
7419c97e0a * do not call the virtual class method/constructor dispatching lookup
when calling the inherited version, since that one is also known at
    compile time

git-svn-id: branches/jvmbackend@18712 -
2011-08-20 08:26:52 +00:00
Jonas Maebe
ddf6591f7f + support "reintroduce" for Java classes. Although in most cases this won't
work because you cannot start new inheritance trees, it can work under some
    circumstances if the parameters are not exact. In case there is a problem,
    this will be detected later by TVMTBuilder.is_new_vmt_entry().

git-svn-id: branches/jvmbackend@18711 -
2011-08-20 08:26:46 +00:00
Jonas Maebe
1d0388d40a + support for virtual constructors for the JVM platform. We simply
create a virtual class (factory) method that calls the constructor,
    and then let the existing support for virtual class methods handle
    everything

git-svn-id: branches/jvmbackend@18710 -
2011-08-20 08:26:40 +00:00
Jonas Maebe
e38cfc307b * renamed pc_procvar2bareproc to pc_bareproc, and allow it also to
be used to create bare procdef->procdef copy

git-svn-id: branches/jvmbackend@18709 -
2011-08-20 08:26:35 +00:00
Jonas Maebe
2a9043f4bc * keep the node flags when replacing a call to a virtual class method with
a call to its wrapper

git-svn-id: branches/jvmbackend@18708 -
2011-08-20 08:26:30 +00:00
Jonas Maebe
e9d27c3efe * mark copied virtual parent constructors as "override"
git-svn-id: branches/jvmbackend@18707 -
2011-08-20 08:26:26 +00:00
Jonas Maebe
f20e206849 * make compatible_childmethod_resultdef() also work for Java classes
(so that you can override a method in a child class with one that
     returns a descendent of the original return type -- since the JVM
     will always select the version with the most specific return type,
     that even corresponds perfectly to standard JVM behaviour)

git-svn-id: branches/jvmbackend@18706 -
2011-08-20 08:26:21 +00:00
Jonas Maebe
3eb588cca7 * some improvements to replace_scanner():
o also save/restore orgpattern (and restore pattern) when saving/restoring
     the scanner state, since it's used by e.g. the _INTCONST token
   o also bail out on _CWCHAR and _CWSTRING tokens, since that requires saving
     the scanner widestring state

git-svn-id: branches/jvmbackend@18705 -
2011-08-20 08:26:16 +00:00