Автор Тема: [CP][GPCP] java.lang.VerifyError  (Прочитано 3898 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
[CP][GPCP] java.lang.VerifyError
« : Май 18, 2013, 01:35:37 pm »
Пока нет ответа от Ominc по поводу бага компилятора, я решил попробовать этот же модуль на GPCP for jvm, благо сама java показала очень приличные результаты по производительности. Изменил импорты, пока убрал замер времени, остальное оставил всё как есть:

MODULE Blur;
   IMPORT CPmain;
   
   CONST
      width = 640;
      height = 480;
      N = 13;
      frames = 1000;
     
      red = 0;
      green = 1;
      blue = 2;
     
   TYPE
      Frame = ARRAY width*height*(blue+1) OF SHORTCHAR;
         
   PROCEDURE Index(x,y,color : INTEGER) : INTEGER;
   BEGIN
      RETURN ((x+y*width)*3+color)
   END Index;
   
   PROCEDURE Blur(IN in : Frame; OUT out : Frame);
   VAR
      x,y,c : INTEGER;
   BEGIN
      FOR y:=1 TO height-2 DO
         FOR x:=1 TO width-2 DO
            FOR c:=red TO blue DO
               out[Index(x,y,c)] := SHORT(CHR( ( ORD(in[Index(x,y-1,c)]) + ORD(in[Index(x,y+1,c)]) +
                                             ORD(in[Index(x-1,y,c)]) + ORD(in[Index(x+1,y,c)]) ) DIV 4  ));
            END;
         END;
      END;
   END Blur;
   
   PROCEDURE Do*;
   VAR
      time : LONGINT;
      f, n : INTEGER;
      a1, a2 : POINTER TO Frame;
   BEGIN
      NEW(a1);
      NEW(a2);
     
      FOR f:=1 TO frames DO
         FOR n:=1 TO N DO           
            Blur(a1,a2);
            Blur(a2,a1)
         END
      END;
   END Do;   
BEGIN
    Do;
END Blur.

Компилируется все на ура. Но при запуска вылетает - ругается верификатор жабы:
>cprun Blur
Exception in thread "main" java.lang.VerifyError: (class: CP/Blur/Blur, method: Do signature: ()V) Incompatible argument to function
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

Кто-нибудь знает что ему не нравится и почему компилятор молчит?
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: [CP][GPCP] java.lang.VerifyError
« Ответ #1 : Май 18, 2013, 02:45:05 pm »
Поздравляю. Ты написал убийцу компиляторов оберона.  ;D

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [CP][GPCP] java.lang.VerifyError
« Ответ #2 : Май 18, 2013, 02:47:21 pm »
Поздравляю. Ты написал убийцу компиляторов оберона.  ;D
Ну, пока всего лишь Компонентного Паскаля :-) Хотя, по идее, оно может убить и "OP2: A PORTABLE OBERON–2 COMPILER".
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [CP][GPCP] java.lang.VerifyError
« Ответ #3 : Май 25, 2013, 12:42:33 am »
Похоже все дело в SHORTCHAR, что-то с реализацией этого типа в GPCP не то. Вот такое приложение тоже падает:

MODULE Test;
    IMPORT CPmain;

    PROCEDURE Test1 (a : SHORTCHAR); BEGIN END Test1;
   
    PROCEDURE Do*;
    VAR
        a  : SHORTCHAR;
    BEGIN       
        a := "a";
        Test1(a);
    END Do;
BEGIN
    Do;
END Test.

Падает так:
Exception in thread "main" java.lang.VerifyError: (class: CP/Test/Test, method: Do signature: ()V) Expecting to find integer on stack
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

Попробую .net версию gpcp. Может полегчает.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [CP][GPCP] java.lang.VerifyError
« Ответ #4 : Май 25, 2013, 12:55:59 am »
.net-версия работает.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [CP][GPCP] java.lang.VerifyError
« Ответ #5 : Май 25, 2013, 01:07:28 am »
Зарепортил баг: https://gpcp.codeplex.com/workitem/1562
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: [CP][GPCP] java.lang.VerifyError
« Ответ #6 : Июнь 04, 2013, 11:05:31 am »
Вроде бы пофиксили:
[quite]
The source has been fixed for both of the SHORTCHAR dependent errors mentioned by valexey.
There were two separate code errors here. An incorrect mapping from GPCP's ordinal for built-in types and the enumeration used by the JVM; The other error was the incorrect implicit conversion for literal strings of length equal to one converted to SHORTCHAR that I mentioned in my previous post.

The fixes have been committed to the repository, in revision 29756. Unless anyone turns up any new SHORTCHAR related problems in the next few days I will generate and release version 1.3.17.
[/quote]

http://gpcp.codeplex.com/workitem/1562
Y = λf.(λx.f (x x)) (λx.f (x x))