jphp-group / jphp

JPHP - an implementation of PHP on Java VM
http://jphp.develnext.org
Apache License 2.0
1.71k stars 160 forks source link

Anonymous class using constant #420

Open lonadels opened 3 years ago

lonadels commented 3 years ago
new class {
  public const VERSION = 1.0;

  function __construct() {
    print(self::VERSION);
  }
};

На JPHP данный код, в отличие от PHP ⩾ 7.1, работает некорректно. Не удается обратиться к константе в анонимном классе.

Code_4UnYE8QjJ6

> jppm start
-> win
-> app:run 
-> install 

Fatal error: Uncaught exception 'php\lang\JavaException' with message 'java.lang.NullPointerException' in Unknown on line 0, position 0
Stack Trace:
#0 {main}
  thrown in Unknown on line 0

JVM Stack Trace:
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator$2.<init>(SimpleExprGenerator.java:608)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.processStaticAccess(SimpleExprGenerator.java:607)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.processSimpleToken(SimpleExprGenerator.java:1182)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.getToken(SimpleExprGenerator.java:1635)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.getToken(SimpleExprGenerator.java:1402)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.getNextExpression(SimpleExprGenerator.java:1390)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.getNextExpression(SimpleExprGenerator.java:1384)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.processPrint(SimpleExprGenerator.java:572)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.processSimpleToken(SimpleExprGenerator.java:1046)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.getToken(SimpleExprGenerator.java:1635)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.getToken(SimpleExprGenerator.java:1402)
  org.develnext.jphp.core.syntax.generators.ExprGenerator.processSimpleExpr(ExprGenerator.java:580)
  org.develnext.jphp.core.syntax.generators.ExprGenerator.getToken(ExprGenerator.java:731)
  org.develnext.jphp.core.syntax.generators.manually.BodyGenerator.getToken(BodyGenerator.java:46)
  org.develnext.jphp.core.syntax.generators.manually.BodyGenerator.getToken(BodyGenerator.java:33)
  org.develnext.jphp.core.syntax.generators.manually.BodyGenerator.getToken(BodyGenerator.java:27)
  org.develnext.jphp.core.syntax.generators.manually.BodyGenerator.getToken(BodyGenerator.java:103)
  org.develnext.jphp.core.syntax.generators.FunctionGenerator.processBody(FunctionGenerator.java:277)
  org.develnext.jphp.core.syntax.generators.FunctionGenerator.getToken(FunctionGenerator.java:348)
  org.develnext.jphp.core.syntax.generators.FunctionGenerator.getToken(FunctionGenerator.java:427)
  org.develnext.jphp.core.syntax.generators.ClassGenerator.processBody(ClassGenerator.java:482)
  org.develnext.jphp.core.syntax.generators.ClassGenerator.getToken(ClassGenerator.java:641)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.processNew(SimpleExprGenerator.java:846)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.processSimpleToken(SimpleExprGenerator.java:1050)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.getToken(SimpleExprGenerator.java:1635)
  org.develnext.jphp.core.syntax.generators.manually.SimpleExprGenerator.getToken(SimpleExprGenerator.java:1402)
  org.develnext.jphp.core.syntax.generators.ExprGenerator.processSimpleExpr(ExprGenerator.java:580)
  org.develnext.jphp.core.syntax.generators.ExprGenerator.getToken(ExprGenerator.java:731)
  org.develnext.jphp.core.syntax.generators.ExprGenerator.getToken(ExprGenerator.java:763)
  org.develnext.jphp.core.syntax.generators.ExprGenerator.getToken(ExprGenerator.java:26)
  org.develnext.jphp.core.syntax.SyntaxAnalyzer.generateToken(SyntaxAnalyzer.java:346)
  org.develnext.jphp.core.syntax.SyntaxAnalyzer.processNext(SyntaxAnalyzer.java:258)
  org.develnext.jphp.core.syntax.SyntaxAnalyzer.process(SyntaxAnalyzer.java:233)
  org.develnext.jphp.core.syntax.SyntaxAnalyzer.process(SyntaxAnalyzer.java:218)
  org.develnext.jphp.core.syntax.SyntaxAnalyzer.<init>(SyntaxAnalyzer.java:127)
  org.develnext.jphp.core.syntax.SyntaxAnalyzer.<init>(SyntaxAnalyzer.java:54)
  org.develnext.jphp.core.compiler.jvm.JvmCompiler.<init>(JvmCompiler.java:44)
  java.lang.reflect.Constructor.newInstance(Constructor.java:423)
  php.runtime.env.CompileScope$1.getCompiler(CompileScope.java:192)
  php.runtime.env.CompileScope.createCompiler(CompileScope.java:231)
  php.runtime.env.Environment.importModule(Environment.java:1250)
  php.runtime.env.ConcurrentEnvironment.importModule(ConcurrentEnvironment.java:175)
  php.runtime.env.ModuleManager.fetchTemporaryModule(ModuleManager.java:71)
  php.runtime.env.ModuleManager.fetchModule(ModuleManager.java:41)
  php.runtime.env.ModuleManager.fetchModule(ModuleManager.java:27)
  php.runtime.launcher.Launcher.loadFrom(Launcher.java:121)
  php.runtime.launcher.Launcher.run(Launcher.java:309)
  php.runtime.launcher.Launcher.run(Launcher.java:248)
  php.runtime.launcher.Launcher.run(Launcher.java:244)
  php.runtime.launcher.Launcher.main(Launcher.java:426)

В именованных классах всё нормально: Code_sAfvZ0zIT5

Результат работы на sandbox.onlinephpfunctions.com:

msedge_Q2BIwb7klv