Project

General

Profile

Bug #7135

NPE in conversion of OO looking for oldtype annotation

Added by Roger Borrello about 1 year ago. Updated about 1 year ago.

Status:
Closed
Priority:
High
Target version:
-
Start date:
Due date:
% Done:

100%

billable:
No
vendor_id:
GCD
case_num:

roger.cls.ast (41.6 KB) Roger Borrello, 02/20/2023 01:32 PM

History

#1 Updated by Roger Borrello about 1 year ago

  • Subject changed from NPE in conversion of OO looking for oldtyp annotation to NPE in conversion of OO looking for oldtype annotation

Using this testcase (placed in uast/oo:

USING Progress.Lang.*.
CLASS oo.roger: 
  USING com.goldencode.p2j.ui.chart.* FROM java.
  DEFINE PRIVATE VARIABLE ultraChartHandle               AS HANDLE  NO-UNDO.
  DEFINE PRIVATE VARIABLE ultraChart                     AS com.goldencode.p2j.ui.ChartWidget NO-UNDO.
  CONSTRUCTOR PUBLIC roger ( ):                      
     CREATE chart ultraChartHandle.
     ASSIGN 
        ultraChart = com.goldencode.p2j.util.handle:getResource(ultraChartHandle).
  END CONSTRUCTOR.
  METHOD PUBLIC VOID CreateTable ():
     ASSIGN
        ultraChart:labelHash = NEW java.util.HashMap().           // <--- This is the error line
  END METHOD.
END CLASS.

The conversion throws this error:

./uast/oo/roger.cls
Elapsed job time:  00:00:01.084
ERROR:
com.goldencode.p2j.pattern.TreeWalkException: ERROR!  Active Rule:
-----------------------
      RULE REPORT      
-----------------------
Rule Type :   WALK
Source AST:  [ = ] BLOCK/CLASS_DEF/BLOCK/METHOD_DEF/BLOCK/STATEMENT/KW_ASSIGN/ASSIGN/ @13:30 {292057776248}
Copy AST  :  [ = ] BLOCK/CLASS_DEF/BLOCK/METHOD_DEF/BLOCK/STATEMENT/KW_ASSIGN/ASSIGN/ @13:30 {292057776248}
Condition :  oldtype = #(int)(#(long) ref.getAnnotation("oldtype"))
Loop      :  false
--- END RULE REPORT ---

    at com.goldencode.p2j.pattern.PatternEngine.run(PatternEngine.java:1093)
    at com.goldencode.p2j.convert.TransformDriver.processTrees(TransformDriver.java:586)
    at com.goldencode.p2j.convert.ConversionDriver.back(ConversionDriver.java:585)
    at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:998)
    at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:1284)
Caused by: java.lang.NullPointerException
    at com.goldencode.expr.CE10330.execute(Unknown Source)
    at com.goldencode.expr.Expression.execute(Expression.java:373)
    at com.goldencode.p2j.pattern.Rule.apply(Rule.java:500)
    at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:751)
    at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:717)
    at com.goldencode.p2j.pattern.Rule.apply(Rule.java:537)
    at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:751)
    at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:717)
    at com.goldencode.p2j.pattern.Rule.apply(Rule.java:537)
    at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:751)
    at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:717)
    at com.goldencode.p2j.pattern.Rule.apply(Rule.java:537)
    at com.goldencode.p2j.pattern.RuleContainer.apply(RuleContainer.java:590)
    at com.goldencode.p2j.pattern.RuleSet.apply(RuleSet.java:98)
    at com.goldencode.p2j.pattern.RuleContainer.apply(RuleContainer.java:590)
    at com.goldencode.p2j.pattern.RuleSet.apply(RuleSet.java:98)
    at com.goldencode.p2j.pattern.AstWalker.walk(AstWalker.java:262)
    at com.goldencode.p2j.pattern.AstWalker.walk(AstWalker.java:210)
    at com.goldencode.p2j.pattern.PatternEngine.apply(PatternEngine.java:1685)
    at com.goldencode.p2j.pattern.PatternEngine.processAst(PatternEngine.java:1571)
    at com.goldencode.p2j.pattern.PatternEngine.processAst(PatternEngine.java:1504)
    at com.goldencode.p2j.pattern.PatternEngine.run(PatternEngine.java:1056)
    ... 4 more

At the beginning of the conversion, there are several warnings:

------------------------------------------------------------------------------
Scanning Progress Source (preprocessor, lexer, parser, persist ASTs)
------------------------------------------------------------------------------

uast/oo/roger.cls
   Lvl01 parse: ./uast/skeleton/oo4gl/Progress/Lang/Object.cls
Feb 20, 2023 1:25:25 PM org.reflections.Reflections scan
INFO: Reflections took 85 ms to scan 1 urls, producing 99 keys and 910 values 
WARNING: Could not find legacy builtin method javaname for 'Progress.Lang.Object:set-next-sibling(KW_INPUT object<? extends progress.lang.object>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Lang.Object:set-prev-sibling(KW_INPUT object<? extends progress.lang.object>)'
   Lvl02 parse: | ./uast/skeleton/oo4gl/Progress/Lang/Class.cls
Feb 20, 2023 1:25:26 PM org.reflections.Reflections scan
INFO: Reflections took 37 ms to scan 1 urls, producing 99 keys and 910 values 
WARNING: Could not find legacy builtin method javaname for 'Progress.Lang.Class:set-package(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Lang.Class:set-superclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Lang.Class:set-typename(KW_INPUT character)'
   Lvl03 parse: | | ./uast/skeleton/oo4gl/Progress/Lang/ParameterList.cls
   Lvl03 parse: | | ./uast/skeleton/oo4gl/Progress/Reflect/Constructor.cls
   Lvl04 parse: | | | ./uast/skeleton/oo4gl/Progress/Reflect/AccessMode.cls
   Lvl05 parse: | | | | ./uast/skeleton/oo4gl/Progress/Lang/Enum.cls
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Constructor:set-accessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Constructor:set-originatingclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Constructor:set-name(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Constructor:set-numparameters(KW_INPUT integer)'
   Lvl04 parse: | | | ./uast/skeleton/oo4gl/Progress/Reflect/Parameter.cls
   Lvl05 parse: | | | | ./uast/skeleton/oo4gl/Progress/Reflect/DataType.cls
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-datatype(KW_INPUT object<? extends progress.reflect.datatype>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-datatypename(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-extent(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-name(KW_INPUT character)'
   Lvl05 parse: | | | | ./uast/skeleton/oo4gl/Progress/Reflect/ParameterMode.cls
   Lvl06 parse: | | | | | ./uast/skeleton/oo4gl/Progress/Lang/FlagsEnum.cls
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-mode(KW_INPUT object<? extends progress.reflect.parametermode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-position(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-datatype(KW_INPUT object<? extends progress.reflect.datatype>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-datatypename(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-extent(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-name(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-mode(KW_INPUT object<? extends progress.reflect.parametermode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Parameter:set-position(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Constructor:set-accessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Constructor:set-originatingclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Constructor:set-name(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Constructor:set-numparameters(KW_INPUT integer)'
   Lvl03 parse: | | ./uast/skeleton/oo4gl/Progress/Reflect/Flags.cls
   Lvl03 parse: | | ./uast/skeleton/oo4gl/Progress/Reflect/Event.cls
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-accessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-declaringclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-isabstract(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-isoverride(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-isstatic(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-name(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-numhandlerparameters(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-originatingclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-accessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-declaringclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-isabstract(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-isoverride(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-isstatic(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-name(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-numhandlerparameters(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Event:set-originatingclass(KW_INPUT object<? extends progress.lang.class>)'
   Lvl03 parse: | | ./uast/skeleton/oo4gl/Progress/Reflect/Method.cls
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-accessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-declaringclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-isabstract(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-isfinal(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-isoverride(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-isstatic(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-name(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-numparameters(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-originatingclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-returnextent(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-returntype(KW_INPUT object<? extends progress.reflect.datatype>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-returntypename(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-accessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-declaringclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-isabstract(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-isfinal(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-isoverride(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-isstatic(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-name(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-numparameters(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-originatingclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-returnextent(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-returntype(KW_INPUT object<? extends progress.reflect.datatype>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Method:set-returntypename(KW_INPUT character)'
   Lvl03 parse: | | ./uast/skeleton/oo4gl/Progress/Reflect/Property.cls
   Lvl04 parse: | | | ./uast/skeleton/oo4gl/Progress/Reflect/Variable.cls
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-accessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-datatype(KW_INPUT object<? extends progress.reflect.datatype>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-datatypename(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-declaringclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-extent(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-isstatic(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-name(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-originatingclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-accessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-datatype(KW_INPUT object<? extends progress.reflect.datatype>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-datatypename(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-declaringclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-extent(KW_INPUT integer)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-isstatic(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-name(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Variable:set-originatingclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-getteraccessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-canread(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-canwrite(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-isabstract(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-isindexed(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-isoverride(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-setteraccessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-getteraccessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-canread(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-canwrite(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-isabstract(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-isindexed(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-isoverride(KW_INPUT logical)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Reflect.Property:set-setteraccessmode(KW_INPUT object<? extends progress.reflect.accessmode>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Lang.Class:set-package(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Lang.Class:set-superclass(KW_INPUT object<? extends progress.lang.class>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Lang.Class:set-typename(KW_INPUT character)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Lang.Object:set-next-sibling(KW_INPUT object<? extends progress.lang.object>)'
WARNING: Could not find legacy builtin method javaname for 'Progress.Lang.Object:set-prev-sibling(KW_INPUT object<? extends progress.lang.object>)'
   Lvl01 DONE:  ./uast/skeleton/oo4gl/Progress/Lang/Object.cls
   Lvl01 parse: ./uast/oo/roger.cls
   Lvl01 DONE:  ./uast/oo/roger.cls
Can not initialize handle's invalid access proxy:null

#2 Updated by Roger Borrello about 1 year ago

The AST is attached:

#3 Updated by Constantin Asofiei about 1 year ago

Roger, please try this patch (on top of trunk rev 14484):

=== modified file 'rules/convert/assignments.rules'
--- old/rules/convert/assignments.rules 2022-06-02 13:02:58 +0000
+++ new/rules/convert/assignments.rules 2023-02-20 18:47:40 +0000
@@ -428,7 +428,7 @@
          </rule>

          <!-- setters for assignable global vars -->
-         <rule>evalLib("vartype", ref.type) and ref.type != prog.sys_handle
+         <rule>evalLib("vartype", ref.type) and ref.type != prog.sys_handle and not evalLib("is_java_cls", ref)

             <!-- global variables are the only VAR_ types that don't have a refid -->
             <rule>!ref.isAnnotation("refid")

#4 Updated by Roger Borrello about 1 year ago

That results in a successful conversion. So those warnings are just red-herrings?

Is this a fix I should try against the customer's code?

#5 Updated by Constantin Asofiei about 1 year ago

Roger Borrello wrote:

Is this a fix I should try against the customer's code?

Yes.

#6 Updated by Roger Borrello about 1 year ago

  • % Done changed from 0 to 50
  • Status changed from New to WIP
  • Assignee set to Roger Borrello

Running conversion. Should I create a branch 7135a?

#7 Updated by Greg Shah about 1 year ago

Yes

#8 Updated by Roger Borrello about 1 year ago

  • Status changed from WIP to Review
  • % Done changed from 50 to 100

Branch 7135a rev 14485 ready for review.

#9 Updated by Greg Shah about 1 year ago

  • Status changed from Review to Test

Code Review Task Branch 7135a Revision 14485

No objections.

#10 Updated by Greg Shah about 1 year ago

If this passes testing, we will merge it to trunk.

#11 Updated by Roger Borrello about 1 year ago

  • Status changed from Test to WIP
  • % Done changed from 100 to 70

Greg Shah wrote:

If this passes testing, we will merge it to trunk.

There was an issue later in the conversion of the customer application:

     [java] EXPRESSION EXECUTION ERROR:
     [java] ---------------------------
     [java] rvalueType = ecw.expressionType(rvalueExp, false)
     [java]                  ^  { Unknown METH_POLY with oldtype of KW_GET_MOP }
     [java] ---------------------------
     [java] Elapsed job time:  00:07:56.534
     [java] ERROR:
     [java] com.goldencode.p2j.pattern.TreeWalkException: ERROR!  Active Rule:
     [java] -----------------------
     [java]       RULE REPORT       
     [java] -----------------------
     [java] Rule Type :   WALK
     [java] Source AST:  [ = ] BLOCK/PROCEDURE/BLOCK/STATEMENT/KW_ASSIGN/ASSIGN/ @7065:17 {876173354066}
     [java] Copy AST  :  [ = ] BLOCK/PROCEDURE/BLOCK/STATEMENT/KW_ASSIGN/ASSIGN/ @7065:17 {876173354066}
     [java] Condition :  rvalueType = ecw.expressionType(rvalueExp, false)
     [java] Loop      :  false
     [java] --- END RULE REPORT ---
     [java] 
     [java] 
     [java] 
     [java]     at com.goldencode.p2j.pattern.PatternEngine.run(PatternEngine.java:1093)
     [java]     at com.goldencode.p2j.convert.TransformDriver.processTrees(TransformDriver.java:586)
     [java]     at com.goldencode.p2j.convert.ConversionDriver.back(ConversionDriver.java:585)
     [java]     at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:998)
     [java]     at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:1284)
     [java] Caused by: com.goldencode.expr.ExpressionException: Expression execution error @1:18 [ASSIGN id=876173354066]

I will see if it is related to the change, versus a different issue.

#12 Updated by Roger Borrello about 1 year ago

  • % Done changed from 70 to 90

Roger Borrello wrote:

I will see if it is related to the change, versus a different issue.

I see that issue when I tried with the unpatched trunk_14484 revision, so it's a separate issue. Should I log a new error, or encapsulate both under the client's area of Redmine (or just morph this one to cover both)?

#13 Updated by Constantin Asofiei about 1 year ago

Please work on a standalone test and lets use this task for the customer's app issues with trunk (conversion or runtime).

#14 Updated by Roger Borrello about 1 year ago

Constantin Asofiei wrote:

Please work on a standalone test and lets use this task for the customer's app issues with trunk (conversion or runtime).

Working on it... I crashed because I was out of disk space.

#15 Updated by Roger Borrello about 1 year ago

This testcase:

PROCEDURE getMousePoint :
  DEFINE INPUT  PARAMETER pcObject AS HANDLE NO-UNDO.

  DEFINE VARIABLE iMouseLoc AS INTEGER NO-UNDO EXTENT 2.

    ASSIGN 
      iMouseLoc = pcObject:FRAME:GET-MOUSE-POSITION().
END PROCEDURE.

creates the same error:

------------------------------------------------------------------------------
Core Code Conversion
------------------------------------------------------------------------------

Optional rule set [customer_specific_conversion] not found.
./uast/roger.w
Elapsed job time:  00:00:00.966
ERROR:
com.goldencode.p2j.pattern.TreeWalkException: ERROR!  Active Rule:
-----------------------
      RULE REPORT      
-----------------------
Rule Type :   WALK
Source AST:  [ = ] BLOCK/PROCEDURE/BLOCK/STATEMENT/KW_ASSIGN/ASSIGN/ @7:17 {347892351023}
Copy AST  :  [ = ] BLOCK/PROCEDURE/BLOCK/STATEMENT/KW_ASSIGN/ASSIGN/ @7:17 {347892351023}
Condition :  rvalueType = ecw.expressionType(rvalueExp, false)
Loop      :  false
--- END RULE REPORT ---

    at com.goldencode.p2j.pattern.PatternEngine.run(PatternEngine.java:1093)
    at com.goldencode.p2j.convert.TransformDriver.processTrees(TransformDriver.java:586)
    at com.goldencode.p2j.convert.ConversionDriver.back(ConversionDriver.java:585)
    at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:998)
    at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:1284)
Caused by: java.lang.UnsupportedOperationException: Unknown METH_POLY with oldtype of KW_GET_MOP
    at com.goldencode.p2j.convert.ExpressionConversionWorker.expressionType(ExpressionConversionWorker.java:2085)
    at com.goldencode.p2j.convert.ExpressionConversionWorker.expressionType(ExpressionConversionWorker.java:1423)
    at com.goldencode.p2j.convert.ExpressionConversionWorker.expressionType(ExpressionConversionWorker.java:1183)
    at com.goldencode.p2j.convert.ExpressionConversionWorker$ExpressionHelper.expressionType(ExpressionConversionWorker.java:3691)
    at com.goldencode.expr.CE10013.execute(Unknown Source)
    at com.goldencode.expr.Expression.execute(Expression.java:373)
    at com.goldencode.p2j.pattern.Rule.apply(Rule.java:500)
    at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:751)
    at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:717)
    at com.goldencode.p2j.pattern.Rule.apply(Rule.java:537)
    at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:751)
    at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:717)
    at com.goldencode.p2j.pattern.Rule.apply(Rule.java:537)
    at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:751)
    at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:717)
    at com.goldencode.p2j.pattern.Rule.apply(Rule.java:537)
    at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:751)
    at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:717)
    at com.goldencode.p2j.pattern.Rule.apply(Rule.java:537)
    at com.goldencode.p2j.pattern.Rule.executeActions(Rule.java:751)
    at com.goldencode.p2j.pattern.Rule.coreProcessing(Rule.java:717)
    at com.goldencode.p2j.pattern.Rule.apply(Rule.java:537)
    at com.goldencode.p2j.pattern.RuleContainer.apply(RuleContainer.java:590)
    at com.goldencode.p2j.pattern.RuleSet.apply(RuleSet.java:98)
    at com.goldencode.p2j.pattern.RuleContainer.apply(RuleContainer.java:590)
    at com.goldencode.p2j.pattern.RuleSet.apply(RuleSet.java:98)
    at com.goldencode.p2j.pattern.AstWalker.walk(AstWalker.java:262)
    at com.goldencode.p2j.pattern.AstWalker.walk(AstWalker.java:210)
    at com.goldencode.p2j.pattern.PatternEngine.apply(PatternEngine.java:1685)
    at com.goldencode.p2j.pattern.PatternEngine.processAst(PatternEngine.java:1571)
    at com.goldencode.p2j.pattern.PatternEngine.processAst(PatternEngine.java:1504)
    at com.goldencode.p2j.pattern.PatternEngine.run(PatternEngine.java:1056)
    ... 4 more

Tree looks:

       <ast col="0" id="347892351020" line="0" text="statement" type="STATEMENT">
          <ast col="5" id="347892351021" line="6" text="ASSIGN" type="KW_ASSIGN">
            <annotation datatype="java.lang.Long" key="support_level" value="16400"/>
            <annotation datatype="java.lang.Boolean" key="bracket" value="false"/>
            <ast col="17" id="347892351023" line="7" text="=" type="ASSIGN">
              <ast col="7" id="347892351026" line="7" text="iMouseLoc" type="VAR_INT">
                <annotation datatype="java.lang.Long" key="oldtype" value="2947"/>
                <annotation datatype="java.lang.Long" key="extent" value="2"/>
                <annotation datatype="java.lang.Long" key="refid" value="347892351003"/>
                <annotation datatype="java.lang.Long" key="support_level" value="16400"/>
              </ast>
              <ast col="0" id="347892351027" line="0" text="expression" type="EXPRESSION">
                <annotation datatype="java.lang.Long" key="support_level" value="16400"/>
                <ast col="33" id="347892351028" line="7" text=":" type="COLON">
                  <ast col="27" id="347892351029" line="7" text=":" type="COLON">
                    <ast col="19" id="347892351030" line="7" text="pcObject" type="VAR_HANDLE">
                      <annotation datatype="java.lang.Long" key="oldtype" value="2947"/>
                      <annotation datatype="java.lang.Long" key="refid" value="347892350987"/>
                      <annotation datatype="java.lang.Long" key="support_level" value="16400"/>
                    </ast>
                    <ast col="28" id="347892351031" line="7" text="FRAME" type="ATTR_HANDLE">
                      <annotation datatype="java.lang.Long" key="oldtype" value="660"/>
                      <annotation datatype="java.lang.Long" key="support_level" value="16400"/>
                    </ast>
                  </ast>
                  <ast col="34" id="347892351032" line="7" text="GET-MOUSE-POSITION" type="METH_POLY">
                    <annotation datatype="java.lang.Long" key="oldtype" value="1503"/>
                  </ast>
                </ast>
              </ast>
            </ast>
          </ast>
        </ast>

#16 Updated by Constantin Asofiei about 1 year ago

Roger, please try this patch:

=== modified file 'src/com/goldencode/p2j/convert/ExpressionConversionWorker.java'
--- old/src/com/goldencode/p2j/convert/ExpressionConversionWorker.java  2023-01-12 15:38:22 +0000
+++ new/src/com/goldencode/p2j/convert/ExpressionConversionWorker.java  2023-02-21 19:05:57 +0000
@@ -1898,6 +1898,11 @@
                   jcls = "memptr";
                   break;

+               case KW_GET_MOP:
+                  // TODO: check if we can improve on this
+                  jcls = "integer[]";
+                  break;
+                  
                case KW_IF:
                   // by default return the same type as the second operand
                   jcls = expressionType(source.getChildAt(1), false, fuzzy);

Greg, I don't see something cleaner - GET-MOUSE-POSITION is marked as METH_POLY in progress.g and SignatureHelper, I think because it returns integer[].

#17 Updated by Greg Shah about 1 year ago

It is fine for now.

#18 Updated by Roger Borrello about 1 year ago

  • Status changed from WIP to Review
  • % Done changed from 90 to 100

Committed revision 7135a_14486. Re-running customer app conversion.

#19 Updated by Roger Borrello about 1 year ago

  • % Done changed from 100 to 90
  • Status changed from Review to WIP

The app converted successfully with both changes in place!

But there were compilation errors:

    [javac] Compiling 31406 source files to app_7135a-14486_20230215a/build/classes
    [javac] Compiling 9108 source files to app_7135a-14486_20230215a/build/classes
    [javac] Note: Some input files use or override a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
    [javac] Compiling 3203 source files to app_7135a-14486_20230215a/build/classes
    [javac] app_7135a-14486_20230215a/src/.../ultrachart/RenderLabelData.java:36: error: RenderLabelData is not abstract and does not override abstract method toLegacyString(jobject<? extends Map>) in LabelRenderer
    [javac] public class RenderLabelData
    [javac]        ^
    [javac] app_7135a-14486_20230215a/src/.../ultrachart/RenderLabelItemToDateShort.java:29: error: RenderLabelItemToDateShort is not abstract and does not override abstract method toLegacyString(jobject<? extends Map>) in LabelRenderer
    [javac] public class RenderLabelItemToDateShort
    [javac]        ^
    [javac] app_7135a-14486_20230215a/src/.../ultrachart/RenderLabelLegend.java:29: error: RenderLabelLegend is not abstract and does not override abstract method toLegacyString(jobject<? extends Map>) in LabelRenderer
    [javac] public class RenderLabelLegend
    [javac]        ^
    [javac] app_7135a-14486_20230215a/src/.../ultrachart/RenderLabelSeriesToDateShort.java:29: error: RenderLabelSeriesToDateShort is not abstract and does not override abstract method toLegacyString(jobject<? extends Map>) in LabelRenderer
    [javac] public class RenderLabelSeriesToDateShort
    [javac]        ^
    [javac] app_7135a-14486_20230215a/src/.../ultrachart/RenderLabelTooltip.java:36: error: RenderLabelTooltip is not abstract and does not override abstract method toLegacyString(jobject<? extends Map>) in LabelRenderer
    [javac] public class RenderLabelTooltip
    [javac]        ^
    [javac] Note: Some input files use or override a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
    [javac] Note: app_7135a-14486_20230215a/src/.../ChartPopup.java uses unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.
    [javac] 5 errors

BUILD FAILED

Did the conversion changes contribute to these errors, or do I need to look for something else?

#20 Updated by Greg Shah about 1 year ago

This is probably something different. The toLegacyString(jobject) is our replacement name for toString() which conflicts with Object.toString() in Java. This version has a special signature that takes jobject which would actually not conflict with the no-arg Object version. Anyway, look at the LabelRenderer and the non-abstract child classes as see what we are generating here and why.

#21 Updated by Roger Borrello about 1 year ago

For this class:

USING Progress.Lang.*.  
                              /* FWD mode */
  USING com.goldencode.p2j.ui.chart.* FROM java.
  USING java.util.*                   FROM java. 

CLASS sy.UltraChart.RenderLabelData 
                              /* FWD mode */
 IMPLEMENTS com.goldencode.p2j.ui.chart.LabelRenderer:

  DEFINE PRIVATE VARIABLE id AS CHARACTER NO-UNDO
    INITIAL "x".

                                 /* FWD mode */
    METHOD PUBLIC CHARACTER ToString (INPUT pChartHash AS java.util.Map): 
      DEFINE VARIABLE fValue AS DECIMAL NO-UNDO.

      ASSIGN fValue = DECIMAL(pChartHash:get("DATA_VALUE"):toString()) NO-ERROR.
      CASE pChartHash:get("DATA_VALUE_TYPE"):toString():
        WHEN "£" THEN       
          RETURN "£ " + TRIM(STRING(fValue,"->>>,>>>,>>9")). 
        WHEN "%" THEN 
          RETURN STRING(ROUND(fValue,2)) + " %".
        OTHERWISE
          RETURN pChartHash:get("DATA_VALUE"):toString().
      END CASE.    

    END METHOD. 

END CLASS. 

We are generating:

public class RenderLabelData
extends BaseObject
implements com.goldencode.p2j.ui.chart.LabelRenderer
{
   @LegacySignature(type = Type.VARIABLE, name = "id")
   private character id = TypeFactory.character("x");

   public void __client_clientnet_sy_ultrachart_RenderLabelData_execute__()
   {
      /* FWD mode */
      externalProcedure(RenderLabelData.class, RenderLabelData.this, new Block((Body) () -> 
      {
         {
         }
      }));
      /* FWD mode */
   }

   @LegacySignature(type = Type.CONSTRUCTOR)
   public void __client_clientnet_sy_ultrachart_renderLabelData_constructor__()
   {
      internalProcedure(RenderLabelData.class, this, "__client_clientnet_sy_ultrachart_renderLabelData_constructor__", new Block((Body) () -> 
      {
         __lang_BaseObject_constructor__();
      }));
   }

   @LegacySignature(type = Type.METHOD, name = "ToString", returns = "CHARACTER", parameters = 
   {
      @LegacyParameter(name = "pChartHash", type = "JOBJECT", qualified = "java.util.Map", mode = "INPUT")
   })
   /* FWD mode */   
   public character toString_(final jobject<? extends java.util.Map> _pChartHash)
   {
      jobject<? extends java.util.Map> pChartHash = TypeFactory.initInput(_pChartHash);
      decimal fValue = TypeFactory.decimal();

      return function(RenderLabelData.class, this, "ToString", character.class, new Block((Body) () -> 
      {
         silent(() -> fValue.assign(new decimal(pChartHash.ref().get("DATA_VALUE").toString())));

         switch (StringHelper.safeTrimTrailing(pChartHash.ref().get("DATA_VALUE_TYPE").toString()))
         {
            case "£":
               {
                  storeReturnValue(concat("£ ", trim(valueOf(fValue, "->>>,>>>,>>9"))));
                  return;
               }
            case "%":
               {
                  storeReturnValue(concat(valueOf(round(fValue, 2)), " %"));
                  return;
               }
            default:
               {
                  storeReturnValue(pChartHash.ref().get("DATA_VALUE").toString());
                  return;
               }
         }
      }));
   }
}

LabelRenderer class is:

public interface LabelRenderer
{
   public character toLegacyString(jobject<? extends Map> formats);
}

#22 Updated by Greg Shah about 1 year ago

We are choosing to emit toString_() name instead of toLegacyString() in the child classes.

The com.goldencode.p2j.ui.chart.LabelRenderer does not include the normal legacy signature annotations (at either the class or method levels). I suspect that is at least part of the problem.

#23 Updated by Roger Borrello about 1 year ago

Greg Shah wrote:

The com.goldencode.p2j.ui.chart.LabelRenderer does not include the normal legacy signature annotations (at either the class or method levels). I suspect that is at least part of the problem.

Is there a good example which I could follow to address that? In looking through some of the com.goldencode.p2j.ui.chart classes, there aren't any annotations to model after.

#24 Updated by Greg Shah about 1 year ago

Look at anything in com.goldencode.p2j.oo.

#25 Updated by Constantin Asofiei about 1 year ago

Greg, adding the LegacySignature at a Java interface method will not work.

Before 6129c, toString I think had a special meaning during conversion, that it got converted to toLegacyString. For now, I propose for the 4GL method name to match exactly the overridden Java method name, toLegacyString.

I think for Java inheritance in the 4GL code, we need to hard-code the method names, and do not convert them at all - treat them as their Java counterpart.

#26 Updated by Greg Shah about 1 year ago

You are proposing that we just hand-edit the 4GL source code to change the names?

#27 Updated by Constantin Asofiei about 1 year ago

Greg Shah wrote:

You are proposing that we just hand-edit the 4GL source code to change the names?

Correct. If a 4GL-style class is inherited from a Java class, then the method names must be treated as Java names.

#28 Updated by Roger Borrello about 1 year ago

So the 4GL would need to be patched to have toString become toLegacyString:

  &IF DEFINED(FWD-VERSION) = 0 &THEN  /* NOT FWD */
    METHOD PUBLIC CHARACTER ToString (INPUT pChartHash AS System.Collections.Hashtable): 

      DEFINE VARIABLE fValue AS DECIMAL NO-UNDO.

      ASSIGN fValue = DECIMAL(pChartHash["DATA_VALUE"]:ToString()) NO-ERROR.
      CASE pChartHash["DATA_VALUE_TYPE"]:ToString():
        WHEN "£" THEN       
          RETURN "£ " + TRIM(STRING(fValue,"->>>,>>>,>>9")). 
        WHEN "%" THEN 
          RETURN STRING(ROUND(fValue,2)) + " %".
        OTHERWISE
          RETURN pChartHash["DATA_VALUE"]:ToString().
      END CASE.    

    END METHOD. 
  &ELSE                               /* FWD mode */
    METHOD PUBLIC CHARACTER ToString (INPUT pChartHash AS java.util.Map): 
      DEFINE VARIABLE fValue AS DECIMAL NO-UNDO.

      ASSIGN fValue = DECIMAL(pChartHash:get("DATA_VALUE"):toLegacyString()) NO-ERROR.
      CASE pChartHash:get("DATA_VALUE_TYPE"):toString():
        WHEN "£" THEN       
          RETURN "£ " + TRIM(STRING(fValue,"->>>,>>>,>>9")). 
        WHEN "%" THEN 
          RETURN STRING(ROUND(fValue,2)) + " %".
        OTHERWISE
          RETURN pChartHash:get("DATA_VALUE"):toLegacyString().
      END CASE.    

    END METHOD. 
  &ENDIF 

#29 Updated by Greg Shah about 1 year ago

Yes

#30 Updated by Constantin Asofiei about 1 year ago

Roger, sorry, in this case rename toLegacyString in the Java class to toString. That name was chosen because of the way FWD hard coded that name at the time.

#31 Updated by Roger Borrello about 1 year ago

Constantin Asofiei wrote:

Roger, sorry, in this case rename toLegacyString in the Java class to toString. That name was chosen because of the way FWD hard coded that name at the time.

OK... so you mean change FWD's LabelRenderer method:

public interface LabelRenderer
{
   /**
    * Get the string representation for a certain value from format map.
    * 
    * @param    formats
    *           The map holding the values and formats.
    * 
    * @return   The string representation.
    */
   public character toString(jobject<? extends Map> formats);
}

Is that the only rename necessary?

#32 Updated by Constantin Asofiei about 1 year ago

Roger, is a little more tricky than this, NameConverter will automatically append an underscore because toString belongs to java.lang.Object and is a reserved name.

I think for this case of Java inheritance from within 4GL code, FWD needs to preserve the method name if this is an override; so, if we mark the method with OVERRIDE (although 4GL doesn't require it...) in the 4GL code, this will also allow the Java compiler to force the override, and for the FWD conversion to know to preserve this method name because it matches a super-method.

In our ToString case, the other problem is that if you use ToString from the 4GL code, you actually really need to use toString, because this is the 'real Java method name inherited from the LabelRenderer interface'. In the customer's app, can you easily identify and replace ToString with toString in the 4GL code?

Greg, if we start going with LegacySignature, we are adding a binding only for Java code from within FWD, which does not solve the problem if the interface/class is from another Java library.

#33 Updated by Constantin Asofiei about 1 year ago

Roger, as a fast way to solve it: in the 4GL code, can we change all RenderLabelData.ToString(INPUT pChartHash AS java.util.Map) references + definition to be renamed asString, and the same with FWD's LabelRenderer.toString, renamed to LabelRenderer.asString?

This will move out of the way all the problems we have with toString, and I'll create a task to deal with the points discussed in previous notes.

#34 Updated by Roger Borrello about 1 year ago

So the five 4GL procedures that had issues with LabelRenderer.toLegacyString:
  1. app_7135a-14486_20230215a/src/.../ultrachart/RenderLabelData.java
  2. app_7135a-14486_20230215a/src/.../ultrachart/RenderLabelItemToDateShort.java
  3. app_7135a-14486_20230215a/src/.../ultrachart/RenderLabelLegend.java
  4. app_7135a-14486_20230215a/src/.../ultrachart/RenderLabelSeriesToDateShort.java
  5. app_7135a-14486_20230215a/src/.../ultrachart/RenderLabelTooltip.java

to be modified similar to:

  &ELSE                               /* FWD mode */
    METHOD PUBLIC CHARACTER ToString (INPUT pChartHash AS java.util.Map): 
      DEFINE VARIABLE fValue AS DECIMAL NO-UNDO.

      ASSIGN fValue = DECIMAL(pChartHash:get("DATA_VALUE"):asString()) NO-ERROR.
      CASE pChartHash:get("DATA_VALUE_TYPE"):asString():
        WHEN "£" THEN       
          RETURN "£ " + TRIM(STRING(fValue,"->>>,>>>,>>9")). 
        WHEN "%" THEN 
          RETURN STRING(ROUND(fValue,2)) + " %".
        OTHERWISE
          RETURN pChartHash:get("DATA_VALUE"):asString().
      END CASE.    

    END METHOD. 
  &ENDIF 

And src/com/goldencode/p2j/ui/chart/LabelRenderer.java to be modified:

=== modified file 'src/com/goldencode/p2j/ui/chart/LabelRenderer.java'
--- src/com/goldencode/p2j/ui/chart/LabelRenderer.java    2020-03-04 19:24:49 +0000
+++ src/com/goldencode/p2j/ui/chart/LabelRenderer.java    2023-02-23 18:33:22 +0000
@@ -2,10 +2,11 @@
 ** Module   : LabelRenderer.java
 ** Abstract : Definition for a label renderer.
 **
-** Copyright (c) 2020, Golden Code Development Corporation.
+** Copyright (c) 2020-2023, Golden Code Development Corporation.
 **
 ** -#- -I- --Date-- ---------------------------------Description---------------------------------
 ** 001 CA  20200304 Created initial version.
+** 002 RFB 20230223 Changed method name from toLegacyString to asString. Ref. #TBD.
 */

 /*
@@ -84,5 +85,5 @@
     * 
     * @return   The string representation.
     */
-   public character toLegacyString(jobject<? extends Map> formats);
+   public character asString(jobject<? extends Map> formats);
 }

#35 Updated by Constantin Asofiei about 1 year ago

Something like this, and ToString (INPUT pChartHash AS java.util.Map): needs to be asString (INPUT pChartHash AS java.util.Map):

But, I can't find who calls the original ToString(java.util.Map) method - can you look in the Java code for a previous conversion of the customer's app and find the toLegacyString(java.util.Map) calls? I don't have any converted code for the app, and looking through the abl/ code I have, I can't find any.

#36 Updated by Constantin Asofiei about 1 year ago

I think LabelRenderer is part of the FWD's ChartWidget.labelHash, which is not implemented at this time.

#37 Updated by Greg Shah about 1 year ago

FYI, officially we do not support subclassing 4GL code from Java parent classes or implementing Java interfaces in 4GL code. I like the idea that we bypass this restriction for now.

#38 Updated by Roger Borrello about 1 year ago

I see this:

rfb@rfb:~$ grep -R toLegacyString\( .
./client/clientnet/sy/ultrachart/RenderLabelSeriesToDateShort.java:   public character toLegacyString(final jobject<? extends java.util.Map> _pChartHash)
./client/clientnet/sy/ultrachart/RenderLabelItemToDateShort.java:   public character toLegacyString(final jobject<? extends java.util.Map> _pChartHash)
./client/clientnet/sy/ultrachart/RenderLabelTooltip.java:   public character toLegacyString(final jobject<? extends java.util.Map> _pChartHash)
./client/clientnet/sy/ultrachart/RenderLabelData.java:   public character toLegacyString(final jobject<? extends java.util.Map> _pChartHash)
./client/clientnet/sy/ultrachart/RenderLabelLegend.java:   public character toLegacyString(final jobject<? extends java.util.Map> _pChartHash)

So should I make those changes? Or is there more to this?
That's the same list of errors.

#39 Updated by Constantin Asofiei about 1 year ago

Roger, thanks, that confirms what you posted. Just change the 4GL method definitions in these classes to be asString and the same with LabelRenderer. This should solve the problem.

#40 Updated by Constantin Asofiei about 1 year ago

I've just noticed something in your patch - I mean to change:

METHOD PUBLIC CHARACTER ToString (INPUT pChartHash AS java.util.Map):

to

METHOD PUBLIC CHARACTER asString (INPUT pChartHash AS java.util.Map):

Only the ToString which has an argument as java.util.Map needs to change. Do not touch plain ToString() calls. I don't know what those are.

#41 Updated by Roger Borrello about 1 year ago

Constantin Asofiei wrote:

Only the ToString which has an argument as java.util.Map needs to change. Do not touch plain ToString() calls. I don't know what those are.

Got it... just the signatures:

diff -r old/abl/client/clientnet/sy/UltraChart/RenderLabelData.cls new/abl/client/clientnet/sy/UltraChart/RenderLabelData.cls
46c46
<     METHOD PUBLIC CHARACTER ToString (INPUT pChartHash AS System.Collections.Hashtable): 
---
>     METHOD PUBLIC CHARACTER asString (INPUT pChartHash AS System.Collections.Hashtable): 
diff -r old/abl/client/clientnet/sy/UltraChart/RenderLabelItemToDateShort.cls new/abl/client/clientnet/sy/UltraChart/RenderLabelItemToDateShort.cls
45c45
<     METHOD PUBLIC CHARACTER ToString (INPUT pChartHash AS java.util.Map): 
---
>     METHOD PUBLIC CHARACTER asString (INPUT pChartHash AS java.util.Map): 
diff -r old/abl/client/clientnet/sy/UltraChart/RenderLabelLegend.cls new/abl/client/clientnet/sy/UltraChart/RenderLabelLegend.cls
49c49
<     METHOD PUBLIC CHARACTER ToString (INPUT pChartHash AS java.util.Map): 
---
>     METHOD PUBLIC CHARACTER asString (INPUT pChartHash AS java.util.Map): 
diff -r old/abl/client/clientnet/sy/UltraChart/RenderLabelSeriesToDateShort.cls new/abl/client/clientnet/sy/UltraChart/RenderLabelSeriesToDateShort.cls
45c45
<     METHOD PUBLIC CHARACTER ToString (INPUT pChartHash AS java.util.Map): 
---
>     METHOD PUBLIC CHARACTER asString (INPUT pChartHash AS java.util.Map): 
diff -r old/abl/client/clientnet/sy/UltraChart/RenderLabelTooltip.cls new/abl/client/clientnet/sy/UltraChart/RenderLabelTooltip.cls
62c62
<     METHOD PUBLIC CHARACTER ToString (INPUT pChartHash AS java.util.Map): 
---
>     METHOD PUBLIC CHARACTER asString (INPUT pChartHash AS java.util.Map):

#42 Updated by Roger Borrello about 1 year ago

So the incremental build completed, including the compilation. I will need to do some testing, but this is committed to 7135 as revision 14487.

#43 Updated by Roger Borrello about 1 year ago

There's a lot of issues. Noted one for the GUI application in #6851-203. The ChUI app gets ** LABEL is not a setable attribute for LITERAL ?. (4052) at one point.

#44 Updated by Greg Shah about 1 year ago

Open bugs for these runtime issues. If conversion works now, we move on and close this task.

#45 Updated by Roger Borrello about 1 year ago

  • Status changed from WIP to Review
  • % Done changed from 90 to 100

Opened task #7145 to handle the first of the runtime errors.

#48 Updated by Roger Borrello about 1 year ago

Opened task #7146 for the other runtime issue.

Is the patching of the customer app procedures as noted in #7135-34 (and show below) required to be ongoing? Or is there a FWD change that will render it unnecessary?

--- sy/UltraChart/RenderLabelData.cls
+++ sy/UltraChart/RenderLabelData.cls
@@ -59,7 +59,7 @@

     END METHOD. 
   &ELSE                               /* FWD mode */
-    METHOD PUBLIC CHARACTER ToString (INPUT pChartHash AS java.util.Map): 
+    METHOD PUBLIC CHARACTER asString (INPUT pChartHash AS java.util.Map): 
       DEFINE VARIABLE fValue AS DECIMAL NO-UNDO.

       ASSIGN fValue = DECIMAL(pChartHash:get("DATA_VALUE"):toString()) NO-ERROR.

#49 Updated by Constantin Asofiei about 1 year ago

Roger Borrello wrote:

Opened task #7146 for the other runtime issue.

Is the patching of the customer app procedures as noted in #7135-34 (and show below) required to be ongoing? Or is there a FWD change that will render it unnecessary?

[...]

The patch is permanent.

#50 Updated by Roger Borrello about 1 year ago

Constantin Asofiei wrote:

The patch is permanent.

Thanks... I will pursue the customer checking the patched versions into their change control.

#51 Updated by Roger Borrello about 1 year ago

7135a has been rebased to trunk_14490.

#52 Updated by Roger Borrello about 1 year ago

Roger Borrello wrote:

7135a has been rebased to trunk_14490.

If there are other customers that might have the same type of code as the customer that found this issue, please let me know (or perhaps this branch has already been used to do a conversion for them).

#53 Updated by Greg Shah about 1 year ago

Not at this time.

#54 Updated by Roger Borrello about 1 year ago

  • Status changed from Review to Test

7135a was merged to trunk as revision 14493. It was archived.

#55 Updated by Greg Shah about 1 year ago

  • Status changed from Test to Closed

Also available in: Atom PDF