Commit Graph

34927 Commits

Author SHA1 Message Date
Jonas Maebe
2964ea3e9b * don't generate typed constant initializers for interfaces (since they
can't have class constructors)

git-svn-id: branches/jvmbackend@18478 -
2011-08-20 08:03:14 +00:00
Jonas Maebe
5b915178fa + support for deep copy of array of strings
git-svn-id: branches/jvmbackend@18477 -
2011-08-20 08:03:09 +00:00
Jonas Maebe
23539dcfaf * only call add_synthetic_method_implementations() for the localst after
parsing a routine if the localst is in fact a localsymtable, otherwise
    they can be generated twice for for the staticsymtable (the localst
    of the init/final code of a unit is the staticsymtable)

git-svn-id: branches/jvmbackend@18476 -
2011-08-20 08:03:03 +00:00
Jonas Maebe
43c5ed20c2 + support for initialising typed constants via compiler-generated
assignment-nodes. For global typed constants and typed constants/
    local variable initialisers in regular functions/procedurs, the
    assignments are performed in the unit initialisation code. For
    those in object/record definitions and their methods, it's done
    in the class constructor. Since we may not yet have parsed all
    method implementations when the class constructor is parsed, part
    of these may be initialised in a helper routine called from the
    class constructor. The ones known when the class constructor is
    parsed are inited there, because the ones marked as "final" and
    declared as static class fields must be initialised in the class
    constructor for Java
   o new set systems_typed_constants_node_init in systems unit that
     indicates that a target uses node trees to initialise typed consts
     instead of an initialised data section
   o mark typed constants in {$j-} mode as "final" for JVM
   o mangle the name of staticvarsyms inside localtables a bit to avoid
     name clashes (only with procedure names for now, no parameters yet
     so can still cause problems with overloaded routines)
   o after a routine has been parsed, it is now processed by
     cnodeutils.wrap_proc_body(), which can add extra nodes before code
     generation (used for injected the typed constant node trees)

git-svn-id: branches/jvmbackend@18475 -
2011-08-20 08:02:58 +00:00
Jonas Maebe
91e06f7139 * also process nested records/objects when generating implementations
for synthetic methods

git-svn-id: branches/jvmbackend@18474 -
2011-08-20 08:02:52 +00:00
Jonas Maebe
1c54d3a758 * fixed handling of static varsyms used for typed constants
* also print staticvarsyms inside localsymtables of procdefs
    (used for typed constants and variable initialisers)

git-svn-id: branches/jvmbackend@18473 -
2011-08-20 08:02:48 +00:00
Jonas Maebe
fa841f8011 * migrated most typed constant parsing code to separate methods so
that the actual generation of the data can be overridden

git-svn-id: branches/jvmbackend@18472 -
2011-08-20 08:02:43 +00:00
Jonas Maebe
d248b5992e * moved most code from ptconst to ngtcon; it will be generalised so
it can either generate an asmlist containing data definitions (like
    it does now), or a node tree with explicit initialisation statements
    (for the JVM target)

git-svn-id: branches/jvmbackend@18471 -
2011-08-20 08:02:38 +00:00
Jonas Maebe
91855becfe + unicodestring support for the JVM target (except for multiple adds
in a single statement, to be added later)
   o the unicodestrings are internally simply java.lang.String instances
   o at the language level, the unicodestrings are assignment-compatible
     with java.lang.String
   o constant strings can be implicitly converted to java.lang.String
   o since java.lang.String is immutable, in particular changing a
     single character in a string is extremely inefficient. This could
     be solved by letting unicodestring map to java.lang.StringBuilder,
     but that would make integration with plain Java code harder

git-svn-id: branches/jvmbackend@18470 -
2011-08-20 08:02:33 +00:00
Jonas Maebe
d759598c70 * set the namespace of the system unit to org.freepascal.rtl
git-svn-id: branches/jvmbackend@18469 -
2011-08-20 08:02:27 +00:00
Jonas Maebe
bf21cd7a15 + support for (non-variant) arrayconstructornodes for the JVM target
o when allocating array temps for the JVM target, use the specified
     "forcesize" for the first dimension, since the arraydef size may
     be invalid (e.g., in case it's an array constructor)

git-svn-id: branches/jvmbackend@18468 -
2011-08-20 08:02:22 +00:00
Jonas Maebe
d13769204e * check for a tclassrefdef as the target conversion type in
asis_target_specific_typecheck, and if so get the real
    definition of its pointedtype rather than of the classrefdef
    itself (the latter would never be different from the original
    one, since there are no formal external classrefdef definitions)

git-svn-id: branches/jvmbackend@18467 -
2011-08-20 08:02:17 +00:00
Jonas Maebe
03af03e696 * changed TObject from an alias for JLObject into a derived class from
JLObject with the method "Free" and a virtual destructor "Destroy"
    (and Free is automatically called from the "finalize" method,
     which in turn is called by the JVM when the instance is collected;
     note that there is no final collection before the JVM shuts down,
     so it may never be called if you don't call Free explicitly yourself)
  * if you don't specify an explicit ancestor for a Java class, set
    the parent to TObject instead of to JLObject (for better compatibility
    with regular Pascal code)

git-svn-id: branches/jvmbackend@18466 -
2011-08-20 08:02:12 +00:00
Jonas Maebe
00df370d36 * don't give an internalerror when adding a constructor to a Java
class (by default it will never be called either though)

git-svn-id: branches/jvmbackend@18465 -
2011-08-20 08:02:06 +00:00
Jonas Maebe
d6a56cfda6 * change the realname of procsyms belonging to overriding methods to
that of the overridden method for Java classes, since the realname
    is used as method identifier (and overriding is name-based and
    case-sensitive in Java)

git-svn-id: branches/jvmbackend@18464 -
2011-08-20 08:02:02 +00:00
Jonas Maebe
7310bbbaf6 * set import_lib to current namespace (if any) for records
git-svn-id: branches/jvmbackend@18463 -
2011-08-20 08:01:56 +00:00
Jonas Maebe
e663f0f31f + support for class constructors for the JVM target
o initialise class vars that need initialisations (records, arrays) in
     class constructors
   o treat class constructors as having a "void" resultdef rather than the
     class type for JVM (maybe has to be done in general?)
   o make it possible to specify pno_noleadingdollar to
     tprocdef.customprocname() so it can be used for class constructors
     (their name is lower cased because it mustn't conflict with other
      identifiers, since their name doesn't matter anyway)
   o added tsk_empty synthetic procdef kind which, as the name implies,
     generates an empty body (for class generated constructors)
  + auto-generate class constructors in case a class has class vars that
    need initialisation

git-svn-id: branches/jvmbackend@18462 -
2011-08-20 08:01:51 +00:00
Jonas Maebe
6bcf796f8b * get the real objectdef before checking whether it's equal to
java_jlobject/java_fpcbaserecordtype in trecorddef.is_related()
    (could be a formal external definition)

git-svn-id: branches/jvmbackend@18461 -
2011-08-20 08:01:46 +00:00
Jonas Maebe
c264c24fb0 + support for unit initialisation sections for the JVM target,
and initialise global variables that are wrapped (records, arrays)
    in those sections
   o check whether pd.localst is assigned in dbgjasm, because it's
     not for the unit initialisation routine
   o moved insertbssdata() from ncgutil to ngenutil and override it
     njvmutil (it does nothing in the latter, since global variables
     are added as fields to the class representing the unit; the
     initialisation is done in gen_initialize_code() in thlcgjvm)
   o added force_init() and force_final() methods to ngenutil, so
     that targets can force init/final routines separate from the
     regular managed types infrastructure (used by JVM for forcing
     an init section in case of records/arrays)

git-svn-id: branches/jvmbackend@18460 -
2011-08-20 08:01:39 +00:00
Jonas Maebe
7eef5e1c74 * don't mark compiler-generated routines as "synthetic", because that
makes them uncallable from actual Java code (javac hides them), which
    is not the idea (otherwise you can't e.g. create record types in Java)

git-svn-id: branches/jvmbackend@18459 -
2011-08-20 08:01:33 +00:00
Jonas Maebe
d79160a6af * correctly handle explicit typecasts between records and jlobject/
fpcbaserecordtype for the JVM target (intercept in ncnv via new
    target_specific_general_typeconv helper, handle in as/is code)
  * not only check for related types in htypechk in case they are
    objdefs, but always do so (records are related to jlobject/fpcbaserecord
    on the JVM target)

git-svn-id: branches/jvmbackend@18458 -
2011-08-20 08:01:29 +00:00
Jonas Maebe
cc6a303ee2 * allocate/initialize implicit pointer type fields (arrays, records) in
JVM classes after calling the inherited constructor (before doing
    so, self is not yet valid)

git-svn-id: branches/jvmbackend@18456 -
2011-08-20 08:01:24 +00:00
Jonas Maebe
a5af71a8d8 * don't remove regalloc/regdealloc pair if it's immediately followed by a
use of the register (can happen if the register is unused afterwards;
    remove the alloc/dealloc results in no temp being allocated for the
    register, so that instruction becomes invalid)

git-svn-id: branches/jvmbackend@18455 -
2011-08-20 08:01:19 +00:00
Jonas Maebe
da064b0ad6 * changed trgcpu.do_spill_replace_all() from a function (that doesn't set
its function result) into a procedure

git-svn-id: branches/jvmbackend@18454 -
2011-08-20 08:01:15 +00:00
Jonas Maebe
89e70f347c * do nothing for initialising temps in advance for the JVM target as that
happens automatically when required (for constructing arrays/records;
    reference counted types don't need special treatment since everything
    is garbage collected)

git-svn-id: branches/jvmbackend@18453 -
2011-08-20 08:01:10 +00:00
Jonas Maebe
f57e9778d4 * migrated gen_initialize_code and gen_finalize_code from ncgutil to
hlcgobj so it can be overridden with target-specific code (e.g.,
    the JVM target has to add initialisation code to allocate regular
    arrays and records in constructors and unit/program initialisation)

git-svn-id: branches/jvmbackend@18452 -
2011-08-20 08:01:03 +00:00
Jonas Maebe
53e6853667 * removed a bunch of cg. and hlcg. prefixes (left-overs from migrations
of ncgutil routines)

git-svn-id: branches/jvmbackend@18451 -
2011-08-20 08:00:55 +00:00
Jonas Maebe
40e0b4677a + support for (only named, for now) records in the JVM target:
implemented via classes, all descending from system.FpcBaseRecordType
    (records are also considered to be "related" to system.FpcBaseRecordType
     on the JVM target)
  * several routines are auto-generated for all record-classes: apart
    from a default constructor (if there is none), also clone (which
    returns a new instance containing a deep copy of the current
    instance) and deepCopy (which copies all fields of one instance
    into another one)
   o added new field "synthetickind" to tprocdef that indicates what
     kind of synthetically generated method it is (if any), and
     mark such methods also as "synthetic" in the JVM assembler code
   o split off the JVM-specific parser code (e.g., to add default
     constructors) into pjvm.pas

git-svn-id: branches/jvmbackend@18450 -
2011-08-20 08:00:50 +00:00
Jonas Maebe
f17936e598 * moved import_lib (for JVM package name) and jvm_full_typename()
from tobjectdef to tabstractrecorddef, since records are implemented
    via Java classes on the JVM target (and hence have an associated
    package name, and we have to be able to generate their JVM-style
    mangled name)
  * adapted ppudump to this change

git-svn-id: branches/jvmbackend@18449 -
2011-08-20 08:00:37 +00:00
Jonas Maebe
88df6573a0 * moved de2regtyp() from defutil to hlcgobj, so it can be overridden
(and override for the JVM, making the register type for records
     R_ADDRESSREGISTER instead of R_INTREGISTER there)

git-svn-id: branches/jvmbackend@18448 -
2011-08-20 08:00:31 +00:00
Jonas Maebe
921b54f9fb * properly handle virtual/override for Java classes, instead of semi-forcing
treating all methods as if they are declared virtual on the JVM platform

git-svn-id: branches/jvmbackend@18447 -
2011-08-20 08:00:25 +00:00
Jonas Maebe
2514c4ddb1 * mark classes representing units as "final", since you're not supposed to
descend from them

git-svn-id: branches/jvmbackend@18446 -
2011-08-20 08:00:18 +00:00
Jonas Maebe
f1c7e018c4 * don't complain if the external name of a complete definition and that
of a forward definition don't match, since forward definitions can't
    have an external name (nor can they be used in a situation where it's
    necessary)

git-svn-id: branches/jvmbackend@18445 -
2011-08-20 08:00:13 +00:00
Jonas Maebe
fc7725efba + systems_managed_vm set of targets that run inside a managed vm
* don't define the pvmt (and related types) and methodpointertype
    for systems_managed_vm

git-svn-id: branches/jvmbackend@18444 -
2011-08-20 08:00:05 +00:00
Jonas Maebe
c5b39823e5 + internalerror when passing handling invalid integer size in loadstoreopc()
git-svn-id: branches/jvmbackend@18443 -
2011-08-20 07:59:59 +00:00
Jonas Maebe
009a30d8cf * reworked saving/restoring the scanner state (immediately replace scanner
with temporary one when saving, since it's also freed when restoring ->
    called replace_scanner() instead of save_scanner() now)
  * when using -vd, print out the text that is internally generated for
    injecting into the scanner

git-svn-id: branches/jvmbackend@18442 -
2011-08-20 07:59:54 +00:00
Jonas Maebe
698deb08c5 * parsed with latest version, adds "virtual" modifiers
git-svn-id: branches/jvmbackend@18441 -
2011-08-20 07:59:49 +00:00
Jonas Maebe
a6a60e3e26 * also mark all non-virtual methods as "final" (since regular methods
don't exist in Java)

git-svn-id: branches/jvmbackend@18440 -
2011-08-20 07:59:45 +00:00
Jonas Maebe
6dd7d9db41 * generate a declaration with an dynamic array and one with an open array
parameter in case of array parameters (and in case of constructors,
    make the open array as "const"; heuristic, not guaranteed 100% safe!)
  + support for generating include files rather than full units (e.g., for
    the system unit types), -i option
  * don't generate imports for anonymous inner types ($1 etc)
  * mark routines with 'package' visibility as 'public', because some packages
    are split over multiple units (system unit and jdk import unit) -> allows
    using these routines in illegal ways, which will result in run time errors
  + support to also select individual classes with the -x/-a parameters
  + add "virtual" modifier to methods where appropriate (so the compiler won't
    force it automatically anymore)

git-svn-id: branches/jvmbackend@18439 -
2011-08-20 07:59:40 +00:00
Jonas Maebe
fc2d239f95 * fixed checking for missing "override" for Java code
git-svn-id: branches/jvmbackend@18438 -
2011-08-20 07:59:35 +00:00
Jonas Maebe
30d9fdb0af + is_class_or_interface_or_objc_or_java() function
git-svn-id: branches/jvmbackend@18437 -
2011-08-20 07:59:31 +00:00
Jonas Maebe
0700e2d7ef + support for {$namespace x.y.z} directive to specify the namespace
for the current unit and all types/routines declared in it. The
    unit itself becomes a member of this namespace as well, so in
    case it's called unit1, it will be x.y.z.unit1, and type tclass
    declared in it will be x.y.z.tclass. Only used for the JVM
    target currently

git-svn-id: branches/jvmbackend@18436 -
2011-08-20 07:59:26 +00:00
Jonas Maebe
1aac04a639 * mark classes that represent units, and classes declared in the interface
of a unit, as public (the rest has "package" visibility)

git-svn-id: branches/jvmbackend@18435 -
2011-08-20 07:59:21 +00:00
Jonas Maebe
20e55cd54e * mark unit-level routines as "final", since they can't be overridden
git-svn-id: branches/jvmbackend@18434 -
2011-08-20 07:59:17 +00:00
Jonas Maebe
3f436deb16 * set the visibility of a newly create staticsymtable to vis_private
(it's used for the implementation section, corrects the visibility
     of functions in the implementation of Pascal units for the JVM target)

git-svn-id: branches/jvmbackend@18433 -
2011-08-20 07:59:12 +00:00
Jonas Maebe
d47f26bbca * for now only auto-generate a parameterless constructor in case no
constructor is declared, rather than all constructors from the parent
    class (because it cannot be done via scanner-injection, since some
    parameter types of the parent constructors may not be visible in the
    current unit, and there is no full-blown tprocdef.getcopy yet nor
    a way to replace the type of the self-parameter afterwards)
  * added sanity checks when inserting the parameterless constructor
    (check for other identifiers called "create", and other parameterless
     methods)

git-svn-id: branches/jvmbackend@18432 -
2011-08-20 07:59:08 +00:00
Jonas Maebe
c05bc8a931 * let procdef typename-related routines return ansistrings instead of
shortstrings to prevent cut-offs
  + ReplaceCase() ansistring overload in cutils to support the above
  * always use the fully qualified name in case of nested types inside
    the parameter lists of procdefs
  * put extra information about array parameters between {} so they
    can be passed back into the parser

git-svn-id: branches/jvmbackend@18431 -
2011-08-20 07:59:02 +00:00
Jonas Maebe
0d9948a61b + tprocsym.find_procdef_bypara_no_rettype() that looks for a procdef
based on the parameters, but ignoring the result type. Used to
    find out whether a function/procedures with these parameters
    can still be added in terms of overloading (since overloading
    ignores different result types, it only depends on the parameters)

git-svn-id: branches/jvmbackend@18430 -
2011-08-20 07:58:58 +00:00
Jonas Maebe
fa49ddac11 * constructors are not inherited in Java
git-svn-id: branches/jvmbackend@18429 -
2011-08-20 07:58:53 +00:00
Jonas Maebe
42798fd26b * fixed saving/restoring scanner state
git-svn-id: branches/jvmbackend@18428 -
2011-08-20 07:58:49 +00:00