DEVSENSE / Phalanger

PHP 5.4 compiler for .NET/Mono frameworks. Predecessor to the opensource PeachPie project (www.peachpie.io).
http://v4.php-compiler.net/
Apache License 2.0
381 stars 92 forks source link

Cannot compile using static methods #44

Closed endel closed 9 years ago

endel commented 9 years ago

Hi @jakubmisek,

I'm trying to compile hook with Phalanger, but the following line of code is causing "method or operation is not implemented:": https://github.com/doubleleft/hook/blob/bde2b2e705a5f1d6323b6c7684be19e17afbae96/src/Database/Schema/Builder.php#L84

return static::migrate($model, $config);

After changing from static::migrate to self::migrate it compiles. It's strange because there is other static:: call in the same file here.

Do you have any hint?

Compilation error:

Error   70  Internal error! 
Please, report this bug via http://phalanger.codeplex.com/workitem/list/basic.
Additional information: 
The method or operation is not implemented.
   at PHP.Core.CodeGenerator.EmitLoadStaticTypeDesc(ResolveTypeFlags flags)
   at PHP.Core.Reflection.StaticType.EmitLoadTypeDesc(CodeGenerator codeGenerator, ResolveTypeFlags flags)
   at PHP.Core.CodeGenerator.EmitRoutineOperatorCall(DType type, Expression targetExpr, String routineFullName, String fallbackRoutineFullname, Expression routineNameExpr, CallSignature callSignature, AccessType access)
   at PHP.Core.Reflection.UnknownMethod.EmitCall(CodeGenerator codeGenerator, String fallbackQualifiedName, CallSignature callSignature, IPlace instance, Boolean runtimeVisibilityCheck, Int32 overloadIndex, DType type, Span position, AccessType access, Boolean callVirt)
   at PHP.Core.Compiler.AST.NodeCompilers.DirectStMtdCallCompiler.Emit(DirectStMtdCall node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.ExpressionCompiler`1.PHP.Core.Compiler.AST.IExpressionCompiler.Emit(Expression node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.AstNodeExtension.Emit(Expression node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.JumpStmtCompiler.EmitReturnObject(Expression expr, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.JumpStmtCompiler.Emit(JumpStmt node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.StatementCompiler`1.PHP.Core.Compiler.AST.IStatementCompiler.Emit(Statement node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.StatementUtils.Emit(Statement statement, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.StatementUtils.Emit(IEnumerable`1 statements, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.BlockStmtCompiler.Emit(BlockStmt node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.StatementCompiler`1.PHP.Core.Compiler.AST.IStatementCompiler.Emit(Statement node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.StatementUtils.Emit(Statement statement, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.IfStmtCompiler.Emit(IfStmt node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.StatementCompiler`1.PHP.Core.Compiler.AST.IStatementCompiler.Emit(Statement node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.StatementUtils.Emit(Statement statement, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.StatementUtils.Emit(IEnumerable`1 statements, CodeGenerator codeGenerator)
   at PHP.Core.CodeGenerator.EmitArgfullOverloadBody(PhpRoutine routine, IEnumerable`1 body, Span entirePosition, Int32 declarationBodyPosition)
   at PHP.Core.Compiler.AST.NodeCompilers.MethodDeclCompiler.Emit(MethodDecl node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.TypeMemberDeclCompiler`1.PHP.Core.Compiler.AST.ITypeMemberDeclCompiler.Emit(TypeMemberDecl node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.TypeDeclCompiler.EmitDefinition(CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.TypeDeclCompiler.Emit(TypeDecl node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.StatementCompiler`1.PHP.Core.Compiler.AST.IStatementCompiler.Emit(Statement node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.StatementUtils.Emit(Statement statement, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.NamespaceDeclCompiler.Emit(NamespaceDecl node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.StatementCompiler`1.PHP.Core.Compiler.AST.IStatementCompiler.Emit(Statement node, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.StatementUtils.Emit(Statement statement, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.NodeCompilers.GlobalCodeCompiler.Emit(GlobalCode ast, CodeGenerator codeGenerator)
   at PHP.Core.Compiler.AST.GlobalCodeCompilerHelper.Emit(GlobalCode ast, CodeGenerator codeGenerator)
   at PHP.Core.Reflection.CompilationSourceUnit.Emit(CodeGenerator codeGenerator)
   at PHP.Core.Reflection.ScriptCompilationUnit.Emit(CodeGenerator codeGenerator)
   at PHP.Core.Reflection.InclusionGraphBuilder.EmitAllUnits(CodeGenerator codeGenerator)
   at PHP.Core.Emit.ScriptAssemblyBuilder.CompileScripts(IEnumerable`1 sourceFiles, CompilationContext context)
   at PHP.Core.Emit.ScriptAssemblyBuilder.Build(IEnumerable`1 sourceFiles, CompilationContext context)
   at PHP.Core.ApplicationCompiler.Compile(ApplicationContext applicationContext, CompilerConfiguration config, ErrorSink errorSink, CompilationParameters ps)
        -1  0   HookDotNet

Another thing to note is that static and self are different according to class inheritance in PHP.

jakubmisek commented 9 years ago

Hi,

It seams lambda confuses compiler and it won't handle static then. I'll try to fix this one.

jakubmisek commented 9 years ago

Fixed in 84ca0d9c7f7e742215d924361e911d07ea92640c

endel commented 9 years ago

Wow, you're fast. I'll try to compile now!