コード例 #1
0
        /// <summary>
        /// The argument <paramref name="completeSource" /> determines whether the source code
        /// is complete PHP script file, which is a case in dynamic includ in Silverlight
        /// </summary>
        public TransientCompilationUnit Build(string /*!*/ sourceCode, SourceCodeDescriptor descriptor,
                                              EvalKinds kind, CompilationContext /*!*/ context, ScriptContext /*!*/ scriptContext,
                                              DTypeDesc referringType, NamingContext namingContext, bool completeSource)
        {
            PhpSourceFile source_file = new PhpSourceFile(context.Config.Compiler.SourceRoot,
                                                          RelativePath.ParseCanonical(descriptor.ContainingSourcePath));

            Encoding encoding = context.Config.Globalization.PageEncoding;

            TransientCompilationUnit result = new TransientCompilationUnit
                                                  (sourceCode, source_file, encoding, namingContext, descriptor.Line, descriptor.Column, completeSource);

            if (!result.PreCompile(context, scriptContext, descriptor, kind, referringType))
            {
                return(null);
            }

            DefineGlobalType(((TransientModuleBuilder)result.ModuleBuilder).AssemblyBuilder.RealModuleBuilder);
            if (!result.Compile(context, kind))
            {
                return(null);
            }

            BakeGlobals();
            result.PostCompile(descriptor);
            return(result);
        }
コード例 #2
0
        public TransientModuleBuilder /*!*/ DefineModule(TransientCompilationUnit /*!*/ compilationUnit, bool debuggable,
                                                         int containerId, EvalKinds kind, string sourcePath)
        {
            InitializeRealAssembly(debuggable);
            Debug.Assert(this.debuggable == debuggable);

            return(TransientAssembly.DefineModule(this, compilationUnit, containerId, kind, sourcePath));
        }
コード例 #3
0
        internal TransientModuleBuilder(int id, EvalKinds kind, TransientCompilationUnit /*!*/ compilationUnit,
                                        TransientAssemblyBuilder /*!*/ assemblyBuilder, TransientModule containingModule, string sourcePath)
            : base(id, kind, compilationUnit, assemblyBuilder.TransientAssembly, containingModule, sourcePath)
        {
            this.assemblyBuilder = assemblyBuilder;

            if (!compilationUnit.IsDynamic)
            {
                this.globalBuilder = assemblyBuilder.RealModuleBuilder.DefineType(MakeName("<Global>", true),
                                                                                  TypeAttributes.SpecialName | TypeAttributes.Class | TypeAttributes.Public);
            }
            else
            {
                this.globalBuilder = null;
            }
        }
コード例 #4
0
        /// <summary>
        /// Implements PHP <c>eval</c> construct with given code prefix and suffix.
        /// A result of concatanation prefix + code + suffix is compiled.
        /// Prefix should contain no new line characters.
        /// </summary>
        internal static object EvalInternal(
            string prefix,
            string code,
            string suffix,
            EvalKinds kind,
            ScriptContext /*!*/ scriptContext,
            Dictionary <string, object> localVariables,
            DObject self,
            DTypeDesc referringType,
            SourceCodeDescriptor descriptor,
            bool entireFile,
            NamingContext namingContext)
        {
            Debug.Assert(prefix != null && suffix != null);

            // composes code to be compiled:
            code = String.Concat(prefix, code, suffix);

            TransientAssemblyBuilder assembly_builder = scriptContext.ApplicationContext.TransientAssemblyBuilder;

            // looks up the cache:
            TransientModule module = assembly_builder.TransientAssembly.GetModule(scriptContext, referringType, code, descriptor);

            if (module == null)
            {
                // double checked lock,
                // if module != null, it is definitely completed
                // since module is added into TransientAssembly at the end
                // of assembly_builder.Build
                lock (assembly_builder.TransientAssembly)
                {
                    // lookup again, since it could be added into TransientAssembly while lock
                    module = assembly_builder.TransientAssembly.GetModule(scriptContext, referringType, code, descriptor);

                    if (module == null)
                    {
                        if (kind == EvalKinds.SyntheticEval)
                        {
                            Debug.WriteLine("SYN EVAL", "Eval cache missed: '{0}'", code.Substring(0, Math.Max(code.IndexOf('{'), 0)).TrimEnd());
                        }
                        else
                        {
                            Debug.WriteLine("EVAL", "Eval cache missed: '{0}'({1},{2})", descriptor.ContainingSourcePath, descriptor.Line, descriptor.Column);
                        }

                        CompilerConfiguration config = new CompilerConfiguration(Configuration.Application);

                        CompilationContext context = new CompilationContext(scriptContext.ApplicationContext, null, config,
                                                                            new EvalErrorSink(-prefix.Length, config.Compiler.DisabledWarnings, config.Compiler.DisabledWarningNumbers),
                                                                            scriptContext.WorkingDirectory);

                        TransientCompilationUnit unit = assembly_builder.Build(code, descriptor, kind, context,
                                                                               scriptContext, referringType, namingContext, entireFile);

                        // compilation failed:
                        if (unit == null)
                        {
                            return(false);
                        }
                        module = unit.TransientModule;
                    }
                }
            }

            // activates unconditionally declared types, functions and constants:
            module.TransientCompilationUnit.Declare(scriptContext);

            return(module.Main(scriptContext, localVariables, self, referringType, true));
        }