Esempio n. 1
0
        public ScriptEngine(WebClient client)
        {
            m_Client = client;

            m_AppDomain = AppDomain.CreateDomain("ScriptEngine");

            m_Site = new MyVsaSite(this);

            m_Engine             = new Microsoft.JScript.Vsa.VsaEngine(false);
            m_Engine.RootMoniker = "Cb://Web/Scripting";
            //m_Engine.Site = (IJSVsaSite) m_Site;
            m_Engine.InitNew();
            m_Engine.RootNamespace = GetType().Namespace;
            m_Engine.SetOption("AlwaysGenerateIL", false);
            m_Engine.SetOption("CLSCompliant", false);
            m_Engine.GenerateDebugInfo = true;
            m_Engine.SetOutputStream(new EmptyMessageReceiver());


            SetGlobalObject("Context", this);

            AddCodeBlock("__init",
                         @"
					function alert(msg) { Context.Alert(msg); }
					function confirm(msg) { return Context.Confirm(msg); }
					function setInterval(funcName, delay) { Context.SetInterval(funcName, delay); }
			"            );
        }
Esempio n. 2
0
        public JScriptEngine(object scriptGlobal) : base(scriptGlobal)
        {
            engine             = new Microsoft.JScript.Vsa.VsaEngine();
            engine.RootMoniker = "sharpvectors://jsengine/" + counter++;
            engine.Site        = this;
            engine.InitNew();
            engine.RootNamespace     = "SharpVectors.Scripting";
            engine.GenerateDebugInfo = false;
            engine.RevokeCache();
            engine.SetOption("Fast", false);

            items = engine.Items;
            Assembly          asm     = typeof(SharpVectors.Scripting.JScriptEngine).Assembly;
            IVsaReferenceItem refItem = (IVsaReferenceItem)items.CreateItem(asm.Location, VsaItemType.Reference, VsaItemFlag.None);

            refItem.AssemblyName = asm.Location;
        }
Esempio n. 3
0
        public JScriptEngine(object scriptGlobal)
            : base(scriptGlobal)
        {
            engine = new Microsoft.JScript.Vsa.VsaEngine();
              engine.RootMoniker = "sharpvectors://jsengine/" + counter++;
              engine.Site = this;
              engine.InitNew();
              engine.RootNamespace = "SharpVectors.Scripting";
              engine.GenerateDebugInfo = false;
              engine.RevokeCache();
              engine.SetOption("Fast", false);

              items = engine.Items;
              Assembly asm = typeof(SharpVectors.Scripting.JScriptEngine).Assembly;
              IVsaReferenceItem refItem = (IVsaReferenceItem)items.CreateItem(asm.Location, VsaItemType.Reference, VsaItemFlag.None);
              refItem.AssemblyName = asm.Location;
        }
        private void ParseCompilerOptions(VsaEngine engine, StringCollection args, TextWriter output, bool generateExe)
        {
            string environmentVariable = Environment.GetEnvironmentVariable("LIB");
            bool flag = false;
            Hashtable defines = new Hashtable(10);
            Hashtable resources = new Hashtable(10);
            Hashtable resourceFiles = new Hashtable(10);
            bool flag2 = false;
            StringBuilder builder = null;
            if (this.debugCommandLine != null)
            {
                builder = new StringBuilder(this.debugCommandLine);
            }
            string str2 = (Path.DirectorySeparatorChar == '/') ? "-" : "/";
            int num = 0;
            int count = args.Count;
            while (num < count)
            {
                object obj2;
                string str4 = args[num];
                if ((str4 == null) || (str4.Length == 0))
                {
                    goto Label_09C7;
                }
                if (str4[0] == '@')
                {
                    throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "@<filename>", engine.ErrorCultureInfo);
                }
                if (('-' != str4[0]) && (('/' != str4[0]) || (Path.DirectorySeparatorChar == '/')))
                {
                    break;
                }
                string option = str4.Substring(1);
                if (option.Length > 0)
                {
                    switch (option[0])
                    {
                        case '?':
                            throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/?", engine.ErrorCultureInfo);

                        case 'A':
                        case 'a':
                            goto Label_01DE;

                        case 'C':
                        case 'c':
                            goto Label_0223;

                        case 'D':
                        case 'd':
                            goto Label_024E;

                        case 'F':
                        case 'f':
                            goto Label_02F5;

                        case 'L':
                        case 'l':
                            goto Label_033A;

                        case 'N':
                        case 'n':
                            goto Label_0488;

                        case 'O':
                        case 'o':
                            goto Label_04DB;

                        case 'P':
                        case 'p':
                            goto Label_0506;

                        case 'R':
                        case 'r':
                            goto Label_0631;

                        case 'T':
                        case 't':
                            goto Label_06AD;

                        case 'U':
                        case 'u':
                            goto Label_07C8;

                        case 'V':
                        case 'v':
                            goto Label_07F3;

                        case 'W':
                        case 'w':
                            goto Label_0838;
                    }
                }
                goto Label_09B4;
            Label_01DE:
                obj2 = CmdLineOptionParser.IsBooleanOption(option, "autoref");
                if (obj2 == null)
                {
                    goto Label_09B4;
                }
                engine.SetOption("autoref", obj2);
                if (builder != null)
                {
                    builder.Append(str4);
                    builder.Append(" ");
                }
                goto Label_09C7;
            Label_0223:
                if (CmdLineOptionParser.IsArgumentOption(option, "codepage") == null)
                {
                    goto Label_09B4;
                }
                throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/codepage:<id>", engine.ErrorCultureInfo);
            Label_024E:
                obj2 = CmdLineOptionParser.IsBooleanOption(option, "debug");
                if (obj2 != null)
                {
                    engine.GenerateDebugInfo = (bool) obj2;
                    if (builder != null)
                    {
                        builder.Append(str4);
                        builder.Append(" ");
                    }
                }
                else
                {
                    obj2 = CmdLineOptionParser.IsArgumentOption(option, "d", "define");
                    if (obj2 == null)
                    {
                        goto Label_09B4;
                    }
                    this.GetAllDefines((string) obj2, defines, engine);
                    if (builder != null)
                    {
                        builder.Append(str2 + "d:\"");
                        builder.Append((string) obj2);
                        builder.Append("\" ");
                    }
                }
                goto Label_09C7;
            Label_02F5:
                obj2 = CmdLineOptionParser.IsBooleanOption(option, "fast");
                if (obj2 == null)
                {
                    goto Label_09B4;
                }
                engine.SetOption("fast", obj2);
                if (builder != null)
                {
                    builder.Append(str4);
                    builder.Append(" ");
                }
                goto Label_09C7;
            Label_033A:
                obj2 = CmdLineOptionParser.IsArgumentOption(option, "lcid");
                if (obj2 != null)
                {
                    if (((string) obj2).Length == 0)
                    {
                        throw new CmdLineException(CmdLineError.NoLocaleID, str4, engine.ErrorCultureInfo);
                    }
                    try
                    {
                        engine.LCID = int.Parse((string) obj2, CultureInfo.InvariantCulture);
                        goto Label_09C7;
                    }
                    catch
                    {
                        throw new CmdLineException(CmdLineError.InvalidLocaleID, (string) obj2, engine.ErrorCultureInfo);
                    }
                }
                obj2 = CmdLineOptionParser.IsArgumentOption(option, "lib");
                if (obj2 != null)
                {
                    string str5 = (string) obj2;
                    if (str5.Length == 0)
                    {
                        throw new CmdLineException(CmdLineError.MissingLibArgument, engine.ErrorCultureInfo);
                    }
                    environmentVariable = str5.Replace(',', Path.PathSeparator) + Path.PathSeparator + environmentVariable;
                    if (builder != null)
                    {
                        builder.Append(str2 + "lib:\"");
                        builder.Append((string) obj2);
                        builder.Append("\" ");
                    }
                    goto Label_09C7;
                }
                obj2 = CmdLineOptionParser.IsArgumentOption(option, "linkres", "linkresource");
                if (obj2 == null)
                {
                    goto Label_09B4;
                }
                try
                {
                    ResInfo resinfo = new ResInfo((string) obj2, true);
                    this.AddResourceFile(resinfo, resources, resourceFiles, engine);
                    goto Label_09C7;
                }
                catch (CmdLineException)
                {
                    throw;
                }
                catch
                {
                    throw new CmdLineException(CmdLineError.ManagedResourceNotFound, engine.ErrorCultureInfo);
                }
            Label_0488:
                if (CmdLineOptionParser.IsBooleanOption(option, "nologo") != null)
                {
                    throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/nologo[+|-]", engine.ErrorCultureInfo);
                }
                if (CmdLineOptionParser.IsBooleanOption(option, "nostdlib") == null)
                {
                    goto Label_09B4;
                }
                throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/nostdlib[+|-]", engine.ErrorCultureInfo);
            Label_04DB:
                if (CmdLineOptionParser.IsArgumentOption(option, "out") == null)
                {
                    goto Label_09B4;
                }
                throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/out:<filename>", engine.ErrorCultureInfo);
            Label_0506:
                obj2 = CmdLineOptionParser.IsBooleanOption(option, "print");
                if (obj2 != null)
                {
                    engine.SetOption("print", obj2);
                    if (builder != null)
                    {
                        builder.Append(str4);
                        builder.Append(" ");
                    }
                }
                else
                {
                    PortableExecutableKinds iLOnly;
                    ImageFileMachine machine;
                    obj2 = CmdLineOptionParser.IsArgumentOption(option, "platform");
                    if (obj2 == null)
                    {
                        goto Label_09B4;
                    }
                    string strA = (string) obj2;
                    if (string.Compare(strA, "x86", StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        iLOnly = PortableExecutableKinds.Required32Bit | PortableExecutableKinds.ILOnly;
                        machine = ImageFileMachine.I386;
                    }
                    else if (string.Compare(strA, "Itanium", StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        iLOnly = PortableExecutableKinds.PE32Plus | PortableExecutableKinds.ILOnly;
                        machine = ImageFileMachine.IA64;
                    }
                    else if (string.Compare(strA, "x64", StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        iLOnly = PortableExecutableKinds.PE32Plus | PortableExecutableKinds.ILOnly;
                        machine = ImageFileMachine.AMD64;
                    }
                    else
                    {
                        if (string.Compare(strA, "anycpu", StringComparison.OrdinalIgnoreCase) != 0)
                        {
                            throw new CmdLineException(CmdLineError.InvalidPlatform, (string) obj2, engine.ErrorCultureInfo);
                        }
                        iLOnly = PortableExecutableKinds.ILOnly;
                        machine = ImageFileMachine.I386;
                    }
                    engine.SetOption("PortableExecutableKind", iLOnly);
                    engine.SetOption("ImageFileMachine", machine);
                    if (builder != null)
                    {
                        builder.Append(str4);
                        builder.Append(" ");
                    }
                }
                goto Label_09C7;
            Label_0631:
                if (CmdLineOptionParser.IsArgumentOption(option, "r", "reference") != null)
                {
                    throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/r[eference]:<file list>", engine.ErrorCultureInfo);
                }
                obj2 = CmdLineOptionParser.IsArgumentOption(option, "res", "resource");
                if (obj2 == null)
                {
                    goto Label_09B4;
                }
                try
                {
                    ResInfo info2 = new ResInfo((string) obj2, false);
                    this.AddResourceFile(info2, resources, resourceFiles, engine);
                    goto Label_09C7;
                }
                catch (CmdLineException)
                {
                    throw;
                }
                catch
                {
                    throw new CmdLineException(CmdLineError.ManagedResourceNotFound, engine.ErrorCultureInfo);
                }
            Label_06AD:
                obj2 = CmdLineOptionParser.IsArgumentOption(option, "t", "target");
                if (obj2 == null)
                {
                    goto Label_09B4;
                }
                if (string.Compare((string) obj2, "exe", StringComparison.OrdinalIgnoreCase) == 0)
                {
                    if (!generateExe)
                    {
                        throw new CmdLineException(CmdLineError.IncompatibleTargets, str4, engine.ErrorCultureInfo);
                    }
                    if (flag2)
                    {
                        throw new CmdLineException(CmdLineError.MultipleTargets, engine.ErrorCultureInfo);
                    }
                    flag2 = true;
                }
                else if (string.Compare((string) obj2, "winexe", StringComparison.OrdinalIgnoreCase) == 0)
                {
                    if (!generateExe)
                    {
                        throw new CmdLineException(CmdLineError.IncompatibleTargets, str4, engine.ErrorCultureInfo);
                    }
                    if (flag2)
                    {
                        throw new CmdLineException(CmdLineError.MultipleTargets, engine.ErrorCultureInfo);
                    }
                    engine.SetOption("PEFileKind", PEFileKinds.WindowApplication);
                    flag = true;
                    flag2 = true;
                }
                else
                {
                    if (string.Compare((string) obj2, "library", StringComparison.OrdinalIgnoreCase) != 0)
                    {
                        throw new CmdLineException(CmdLineError.InvalidTarget, (string) obj2, engine.ErrorCultureInfo);
                    }
                    if (generateExe)
                    {
                        throw new CmdLineException(CmdLineError.IncompatibleTargets, engine.ErrorCultureInfo);
                    }
                    if (flag2)
                    {
                        throw new CmdLineException(CmdLineError.MultipleTargets, engine.ErrorCultureInfo);
                    }
                    flag2 = true;
                }
                goto Label_09C7;
            Label_07C8:
                if (CmdLineOptionParser.IsArgumentOption(option, "utf8output") == null)
                {
                    goto Label_09B4;
                }
                throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/utf8output[+|-]", engine.ErrorCultureInfo);
            Label_07F3:
                obj2 = CmdLineOptionParser.IsBooleanOption(option, "VersionSafe");
                if (obj2 == null)
                {
                    goto Label_09B4;
                }
                engine.SetOption("VersionSafe", obj2);
                if (builder != null)
                {
                    builder.Append(str4);
                    builder.Append(" ");
                }
                goto Label_09C7;
            Label_0838:
                obj2 = CmdLineOptionParser.IsArgumentOption(option, "w", "warn");
                if (obj2 != null)
                {
                    if (((string) obj2).Length == 0)
                    {
                        throw new CmdLineException(CmdLineError.NoWarningLevel, str4, engine.ErrorCultureInfo);
                    }
                    if (((string) obj2).Length == 1)
                    {
                        if (builder != null)
                        {
                            builder.Append(str4);
                            builder.Append(" ");
                        }
                        switch (((string) obj2)[0])
                        {
                            case '0':
                                engine.SetOption("WarningLevel", 0);
                                goto Label_09C7;

                            case '1':
                                engine.SetOption("WarningLevel", 1);
                                goto Label_09C7;

                            case '2':
                                engine.SetOption("WarningLevel", 2);
                                goto Label_09C7;

                            case '3':
                                engine.SetOption("WarningLevel", 3);
                                goto Label_09C7;

                            case '4':
                                engine.SetOption("WarningLevel", 4);
                                goto Label_09C7;
                        }
                    }
                    throw new CmdLineException(CmdLineError.InvalidWarningLevel, str4, engine.ErrorCultureInfo);
                }
                obj2 = CmdLineOptionParser.IsBooleanOption(option, "warnaserror");
                if (obj2 != null)
                {
                    engine.SetOption("warnaserror", obj2);
                    if (builder != null)
                    {
                        builder.Append(str4);
                        builder.Append(" ");
                    }
                    goto Label_09C7;
                }
                if (CmdLineOptionParser.IsArgumentOption(option, "win32res") != null)
                {
                    throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/win32res:<filename>", engine.ErrorCultureInfo);
                }
            Label_09B4:
                throw new CmdLineException(CmdLineError.UnknownOption, str4, engine.ErrorCultureInfo);
            Label_09C7:
                num++;
            }
            if (builder != null)
            {
                if (generateExe)
                {
                    if (flag)
                    {
                        builder.Append(str2 + "t:winexe ");
                    }
                    else
                    {
                        builder.Append(str2 + "t:exe ");
                    }
                }
                else
                {
                    builder.Append(str2 + "t:library ");
                }
                this.debugCommandLine = builder.ToString();
            }
            engine.SetOption("libpath", environmentVariable);
            engine.SetOption("defines", defines);
        }
 private VsaEngine CreateAndInitEngine(CompilerParameters options, string[] sourceFiles, string outputFile, TextWriter output)
 {
     VsaEngine engine = new VsaEngine(true);
     VsaSite site = new VsaSite(output);
     engine.InitVsaEngine("JSCodeGenerator://Microsoft.JScript.Vsa.VsaEngine", site);
     this.ValidateOptions(options, engine);
     engine.GenerateDebugInfo = options.IncludeDebugInformation;
     engine.SetOption("referenceLoaderAPI", "LoadFile");
     engine.SetOption("fast", true);
     engine.SetOption("print", false);
     engine.SetOption("VersionSafe", false);
     engine.SetOption("output", options.OutputAssembly);
     if (options.GenerateExecutable)
     {
         engine.SetOption("PEFileKind", PEFileKinds.ConsoleApplication);
     }
     else
     {
         engine.SetOption("PEFileKind", PEFileKinds.Dll);
     }
     site.treatWarningsAsErrors = options.TreatWarningsAsErrors;
     engine.SetOption("warnaserror", options.TreatWarningsAsErrors);
     site.warningLevel = options.WarningLevel;
     engine.SetOption("WarningLevel", options.WarningLevel);
     if ((options.Win32Resource != null) && (options.Win32Resource.Length > 0))
     {
         engine.SetOption("win32resource", options.Win32Resource);
     }
     bool flag = false;
     foreach (string str in options.ReferencedAssemblies)
     {
         if (string.Compare(Path.GetFileName(str), "mscorlib.dll", StringComparison.OrdinalIgnoreCase) == 0)
         {
             flag = true;
         }
         this.AddAssemblyReference(engine, str);
     }
     if (!flag)
     {
         this.AddAssemblyReference(engine, "mscorlib.dll");
     }
     StringCollection args = this.SplitCmdLineArguments(options.CompilerOptions);
     this.ParseCompilerOptions(engine, args, output, options.GenerateExecutable);
     for (int i = 0; i < sourceFiles.Length; i++)
     {
         this.AddSourceFile(engine, sourceFiles[i]);
     }
     return engine;
 }
      private void ParseCompilerOptions(VsaEngine engine, StringCollection args, TextWriter output, bool generateExe){
        // Process compiler options and return command line fragment to complete the partial debug command line
        // that was formed by examining the CompilerParameters structure only.
        string libpath = System.Environment.GetEnvironmentVariable("LIB");
        bool generateWinExe = false;
        Hashtable defines = new Hashtable(10);
        Hashtable resources = new Hashtable(10);
        Hashtable resourceFiles = new Hashtable(10);
        bool targetSpecified = false;

        StringBuilder fullCmdLine = null;
        if (this.debugCommandLine != null)
          fullCmdLine = new StringBuilder(this.debugCommandLine);

        // if '/' separates dir, use '-' as switch
        string cmdLineSwitch = Path.DirectorySeparatorChar == '/' ? "-" : "/" ;

        for (int i = 0, n = args.Count; i < n; i++){
          object argument;
          string option;

          string arg = args[i];
          if (arg == null || arg.Length == 0) continue;

          if (arg[0] == '@')
            throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "@<filename>", engine.ErrorCultureInfo);
         
          // slash ('/') character is a valid filename character on UNIX, so we can't use it as a switch
          if ('-' != arg[0] && ('/' != arg[0] || Path.DirectorySeparatorChar == '/'))
            break;

          option = arg.Substring(1);

          if (option.Length > 0){
            switch (option[0]){
            case '?':
              throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/?", engine.ErrorCultureInfo);
            case 'a':
            case 'A':
              argument = CmdLineOptionParser.IsBooleanOption(option, "autoref");
              if (argument != null){
                engine.SetOption("autoref", argument);
                if (fullCmdLine != null){
                  fullCmdLine.Append(arg);
                  fullCmdLine.Append(" ");
                }
                continue;
              }
              break;
            case 'c':
            case 'C':
              argument = CmdLineOptionParser.IsArgumentOption(option, "codepage");
              if (argument != null)
                throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/codepage:<id>", engine.ErrorCultureInfo);
              break;
            case 'd':
            case 'D':
              argument = CmdLineOptionParser.IsBooleanOption(option, "debug");
              if (argument != null){
                engine.GenerateDebugInfo = (bool)argument;
                if (fullCmdLine != null){
                  fullCmdLine.Append(arg);
                  fullCmdLine.Append(" ");
                }
                continue;                        
              }
              argument = CmdLineOptionParser.IsArgumentOption(option, "d", "define");
              if (argument != null){
                this.GetAllDefines((string)argument, defines, engine);
                if (fullCmdLine != null){
                  fullCmdLine.Append(cmdLineSwitch + "d:\"");
                  fullCmdLine.Append((string)argument);
                  fullCmdLine.Append("\" ");
                }
                continue;
              }
              break;
            case 'f':
            case 'F':
              argument = CmdLineOptionParser.IsBooleanOption(option, "fast");
              if (argument != null){
                engine.SetOption("fast", argument);
                if (fullCmdLine != null){
                  fullCmdLine.Append(arg);
                  fullCmdLine.Append(" ");
                }
                continue;
              }
              break;
            case 'l':
            case 'L':
              argument = CmdLineOptionParser.IsArgumentOption(option, "lcid");
              if (argument != null){
                if (((string)argument).Length == 0)
                  throw new CmdLineException(CmdLineError.NoLocaleID, arg, engine.ErrorCultureInfo);
                try{
                  engine.LCID = Int32.Parse((string)argument, CultureInfo.InvariantCulture);
                }catch{
                  throw new CmdLineException(CmdLineError.InvalidLocaleID, (string)argument, engine.ErrorCultureInfo);
                }
                continue;
              }
              argument = CmdLineOptionParser.IsArgumentOption(option, "lib");
              if (argument != null){
                string newPaths = (string)argument;
                if (newPaths.Length == 0)
                  throw new CmdLineException(CmdLineError.MissingLibArgument, engine.ErrorCultureInfo);
                newPaths = newPaths.Replace(',', Path.PathSeparator);
                libpath = newPaths + Path.PathSeparator + libpath;
                if (fullCmdLine != null){
                  fullCmdLine.Append(cmdLineSwitch + "lib:\"");
                  fullCmdLine.Append((string)argument);
                  fullCmdLine.Append("\" ");
                }
                continue;
              }
              argument = CmdLineOptionParser.IsArgumentOption(option, "linkres", "linkresource");
              if (argument != null){
                try{
                  ResInfo resinfo = new ResInfo((string)argument, true /* isLinked */);
                  this.AddResourceFile(resinfo, resources, resourceFiles, engine);
                }catch(CmdLineException){
                  throw;
                }catch{
                  throw new CmdLineException(CmdLineError.ManagedResourceNotFound, engine.ErrorCultureInfo);
                }
                continue;
              }
              break;
            case 'n':
            case 'N':
              argument = CmdLineOptionParser.IsBooleanOption(option, "nologo");
              if (argument != null)
                throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/nologo[+|-]", engine.ErrorCultureInfo);
              argument = CmdLineOptionParser.IsBooleanOption(option, "nostdlib");
              if (argument != null)
                throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/nostdlib[+|-]", engine.ErrorCultureInfo);
              break;
            case 'o':
            case 'O':
              argument = CmdLineOptionParser.IsArgumentOption(option, "out");
              if (argument != null)
                throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/out:<filename>", engine.ErrorCultureInfo);
              break;
            case 'p':
            case 'P':
              argument = CmdLineOptionParser.IsBooleanOption(option, "print");
              if (argument != null){
                engine.SetOption("print", argument);
                if (fullCmdLine != null){
                  fullCmdLine.Append(arg);
                  fullCmdLine.Append(" ");
                }
                continue;
              }
              argument = CmdLineOptionParser.IsArgumentOption(option, "platform");
              if (argument != null){
                string platform = (string)argument;
                PortableExecutableKinds PEKindFlags;
                ImageFileMachine PEMachineArchitecture;
                if (String.Compare(platform, "x86", StringComparison.OrdinalIgnoreCase) == 0) {
                  PEKindFlags = PortableExecutableKinds.ILOnly | PortableExecutableKinds.Required32Bit;
                  PEMachineArchitecture = ImageFileMachine.I386;
                } else if (String.Compare(platform, "Itanium", StringComparison.OrdinalIgnoreCase) == 0) {
                  PEKindFlags = PortableExecutableKinds.ILOnly | PortableExecutableKinds.PE32Plus;
                  PEMachineArchitecture = ImageFileMachine.IA64;
                } else if (String.Compare(platform, "x64", StringComparison.OrdinalIgnoreCase) == 0) {
                  PEKindFlags = PortableExecutableKinds.ILOnly | PortableExecutableKinds.PE32Plus;
                  PEMachineArchitecture = ImageFileMachine.AMD64;            
                } else if (String.Compare(platform, "anycpu", StringComparison.OrdinalIgnoreCase) == 0) {
                  PEKindFlags = PortableExecutableKinds.ILOnly;
                  PEMachineArchitecture = ImageFileMachine.I386;
                } else
                  throw new CmdLineException(CmdLineError.InvalidPlatform, (string)argument, engine.ErrorCultureInfo);
                engine.SetOption("PortableExecutableKind", PEKindFlags);
                engine.SetOption("ImageFileMachine", PEMachineArchitecture);
                if (fullCmdLine != null){
                  fullCmdLine.Append(arg);
                  fullCmdLine.Append(" ");
                }
                continue;
              }
              break;
            case 'r':
            case 'R':
              argument = CmdLineOptionParser.IsArgumentOption(option, "r", "reference");
              if (argument != null)
                throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/r[eference]:<file list>", engine.ErrorCultureInfo);
              argument = CmdLineOptionParser.IsArgumentOption(option, "res", "resource");
              if (argument != null){
                try{
                  ResInfo resinfo = new ResInfo((string)argument, false /* isLinked */);
                  this.AddResourceFile(resinfo, resources, resourceFiles, engine);
                }catch(CmdLineException){
                  throw;
                }catch{
                  throw new CmdLineException(CmdLineError.ManagedResourceNotFound, engine.ErrorCultureInfo);
                }
                continue;
              }
              break;
            case 't':
            case 'T':
              argument = CmdLineOptionParser.IsArgumentOption(option, "t", "target");
              if (argument != null){
                if (String.Compare((string)argument, "exe", StringComparison.OrdinalIgnoreCase) == 0){
                  if (!generateExe)
                    throw new CmdLineException(CmdLineError.IncompatibleTargets, arg, engine.ErrorCultureInfo);
                  if (targetSpecified)
                    throw new CmdLineException(CmdLineError.MultipleTargets, engine.ErrorCultureInfo);
                  // no change -- /t:exe is the default when GenerateExecutable is true
                  targetSpecified = true;
                  continue;
                }
                if (String.Compare((string)argument, "winexe", StringComparison.OrdinalIgnoreCase) == 0){
                  if (!generateExe)
                    throw new CmdLineException(CmdLineError.IncompatibleTargets, arg, engine.ErrorCultureInfo);
                  if (targetSpecified)
                    throw new CmdLineException(CmdLineError.MultipleTargets, engine.ErrorCultureInfo);
                  engine.SetOption("PEFileKind", PEFileKinds.WindowApplication);
                  generateWinExe = true;
                  targetSpecified = true;
                  continue;
                }
                if (String.Compare((string)argument, "library", StringComparison.OrdinalIgnoreCase) == 0){
                  if (generateExe)
                    throw new CmdLineException(CmdLineError.IncompatibleTargets, engine.ErrorCultureInfo);
                  if (targetSpecified)
                    throw new CmdLineException(CmdLineError.MultipleTargets, engine.ErrorCultureInfo);
                  // no change -- /t:library is the default when GenerateExecutable is false
                  targetSpecified = true;
                  continue;
                }
                throw new CmdLineException(CmdLineError.InvalidTarget, (string)argument, engine.ErrorCultureInfo);
              }
              break;
            case 'u':
            case 'U':
              argument = CmdLineOptionParser.IsArgumentOption(option, "utf8output");
              if (argument != null)
                throw new CmdLineException(CmdLineError.InvalidForCompilerOptions, "/utf8output[+|-]", engine.ErrorCultureInfo);
              break;
            case 'v':
            case 'V':
              argument = CmdLineOptionParser.IsBooleanOption(option, "VersionSafe");
              if (argument != null){
                engine.SetOption("VersionSafe", argument);
                if (fullCmdLine != null){
                  fullCmdLine.Append(arg);
                  fullCmdLine.Append(" ");
                }
                continue;
              }
              break;
            case 'w':
            case 'W':
              argument = CmdLineOptionParser.IsArgumentOption(option, "w", "warn");
              if (argument != null){
                if (((string)argument).Length == 0){
                  throw new CmdLineException(CmdLineError.NoWarningLevel, arg, engine.ErrorCultureInfo);
                }
                if (((string)argument).Length == 1){
                  if (fullCmdLine != null){
                    fullCmdLine.Append(arg);
                    fullCmdLine.Append(" ");
                  }
                  switch (((string)argument)[0]){
                  case '0': engine.SetOption("WarningLevel", (object)0); continue;
                  case '1': engine.SetOption("WarningLevel", (object)1); continue;
                  case '2': engine.SetOption("WarningLevel", (object)2); continue;
                  case '3': engine.SetOption("WarningLevel", (object)3); continue;
                  case '4': engine.SetOption("WarningLevel", (object)4); continue;
                  }
                }
                throw new CmdLineException(CmdLineError.InvalidWarningLevel, arg, engine.ErrorCultureInfo);
              }
              argument = CmdLineOptionParser.IsBooleanOption(option, "warnaserror");
              if (argument != null){
                engine.SetOption("warnaserror", argument);
                if (fullCmdLine != null){
                  fullCmdLine.Append(arg);
                  fullCmdLine.Append(" ");
                }
                continue;
              }
              break;
            default:
              break;
            }
          }
          throw new CmdLineException(CmdLineError.UnknownOption, arg, engine.ErrorCultureInfo);
        }
        if (fullCmdLine != null){
          // append target type to debug command line
          if (generateExe){
            if (generateWinExe)
              fullCmdLine.Append(cmdLineSwitch + "t:winexe ");
            else
              fullCmdLine.Append(cmdLineSwitch + "t:exe ");
          }else{
            fullCmdLine.Append(cmdLineSwitch + "t:library ");
          }
          this.debugCommandLine = fullCmdLine.ToString();
        }
        // set options on engine that were possibly built from multiple arguments
        engine.SetOption("libpath", libpath);
        engine.SetOption("defines", defines);
      }
      private VsaEngine CreateAndInitEngine(CompilerParameters options, string[] sourceFiles, string outputFile, TextWriter output){
        VsaEngine engine = new VsaEngine(true);
        VsaSite site = new VsaSite(output);
        engine.InitVsaEngine("JSCodeGenerator://Microsoft.JScript.Vsa.VsaEngine", site);

        // Ensure that all options are valid; throw a CmdLineException otherwise
        this.ValidateOptions(options, engine);

        // Set options on the engine (equivalent of cmdline args in out-of-proc scenario)
        engine.GenerateDebugInfo = options.IncludeDebugInformation;
        engine.SetOption("referenceLoaderAPI", "LoadFile");
        engine.SetOption("fast", true);
        engine.SetOption("print", false);
        engine.SetOption("VersionSafe", false);
        engine.SetOption("output", options.OutputAssembly);
        if (options.GenerateExecutable)
          engine.SetOption("PEFileKind", PEFileKinds.ConsoleApplication);
        else
          engine.SetOption("PEFileKind", PEFileKinds.Dll);
        site.treatWarningsAsErrors = options.TreatWarningsAsErrors;
        engine.SetOption("warnaserror", options.TreatWarningsAsErrors);
        site.warningLevel = options.WarningLevel;
        engine.SetOption("WarningLevel", options.WarningLevel);
        bool stdLibAdded = false;
        foreach (string assemblyName in options.ReferencedAssemblies){
          if (String.Compare(Path.GetFileName(assemblyName), "mscorlib.dll", StringComparison.OrdinalIgnoreCase) == 0)
            stdLibAdded = true;
          this.AddAssemblyReference(engine, assemblyName);
        }
        if (!stdLibAdded)
          this.AddAssemblyReference(engine, "mscorlib.dll");

        // Parse any additional compiler options
        StringCollection compilerOptions = this.SplitCmdLineArguments(options.CompilerOptions);
        this.ParseCompilerOptions(engine, compilerOptions, output, options.GenerateExecutable);

        // Add the source files to the engine (as IVsaCodeItems)
        for (int j = 0; j < sourceFiles.Length; j++)
          this.AddSourceFile(engine, sourceFiles[j]);

        return engine;
      }
Esempio n. 8
0
File: mjs.cs Progetto: nobled/mono
		//
		// Entry point
		//
		private static void Main (string [] args) {
			if (args.Length < 1) {
				Usage ();
				Environment.Exit (0);
			}			
			MainDriver (args);
			VsaEngine engine = new VsaEngine ();
			engine.InitVsaEngine ("mjs:com.mono-project", new MonoEngineSite ());
			
			foreach (string asm in references) {
				IVsaReferenceItem item = (IVsaReferenceItem) engine.Items.CreateItem (asm, VsaItemType.Reference, VsaItemFlag.None);
				item.AssemblyName = asm;
			}

			string asm_name = String.Empty;
			
			foreach (Assembly assembly in assemblies) {
				asm_name = assembly.GetName ().FullName;
				IVsaReferenceItem item = (IVsaReferenceItem) engine.Items.CreateItem (asm_name, VsaItemType.Reference, VsaItemFlag.None);
				item.AssemblyName = asm_name;
			}

			foreach (string file in files) {
				IVsaCodeItem item = (IVsaCodeItem) engine.Items.CreateItem (file, VsaItemType.Code, VsaItemFlag.None);
				item.SourceText = GetCodeFromFile (file);
			}
			engine.SetOption ("debug", want_debugging_support);
			engine.SetOption ("link_path", link_paths);
			engine.SetOption ("first_source", first_source);
			engine.SetOption ("assemblies", assemblies);
			engine.SetOption ("out", output_file);
			if (warning_level != -1)
				engine.SetOption ("WarningLevel", warning_level);
			engine.Compile ();
		}
Esempio n. 9
0
    bool Compile(CompilerOptions options)
    {
        if (this.fPrintTargets)
        {
            Console.WriteLine(Localize("Compiling", options.strOutputFileName));
        }

        VsaEngine engine = new Microsoft.JScript.Vsa.VsaEngine();

        if (null == engine)
        {
            throw new CmdLineException(CmdLineError.CannotCreateEngine, JScriptCompiler.GetCultureInfo());
        }
        engine.InitVsaEngine("JSC://Microsoft.JScript.Vsa.VsaEngine", new EngineSite(options));
        engine.LCID = JScriptCompiler.LCID;
        engine.GenerateDebugInfo = options.fDebug;

        engine.SetOption("AutoRef", options.autoRef);
        engine.SetOption("fast", options.fFast);
        engine.SetOption("output", options.strOutputFileName);
        engine.SetOption("PEFileKind", options.PEFileKind);
        engine.SetOption("print", options.fPrint);
        engine.SetOption("libpath", options.libpath);
        if (options.versionInfo != null)
        {
            engine.SetOption("version", options.versionInfo);
        }
        engine.SetOption("VersionSafe", options.fVersionSafe);
        engine.SetOption("defines", options.Defines);
        engine.SetOption("warnaserror", options.fTreatWarningsAsErrors);
        engine.SetOption("WarningLevel", options.nWarningLevel);
        if (options.ManagedResources.Count > 0)
        {
            engine.SetOption("managedResources", options.ManagedResources.Values);
        }

        bool fStdlibAdded   = false;
        bool fWinFormsAdded = false;

        foreach (string assemblyName in options.ImportFileNames)
        {
            this.AddAssemblyReference(engine, assemblyName);
            string filename = Path.GetFileName(assemblyName);
            if (String.Compare(filename, "mscorlib.dll", true, CultureInfo.InvariantCulture) == 0)
            {
                fStdlibAdded = true;
            }
            else if (String.Compare(filename, "System.Windows.Forms.dll", true, CultureInfo.InvariantCulture) == 0)
            {
                fWinFormsAdded = true;
            }
        }

        // Only add mscorlib if it hasn't already been added.
        if (!options.fNoStdlib && !fStdlibAdded)
        {
            AddAssemblyReference(engine, "mscorlib.dll");
        }
        // add System.Windows.Forms if target is winexe and it hasn't already been added
        if ((options.PEFileKind == PEFileKinds.WindowApplication) && !options.fNoStdlib && !fWinFormsAdded)
        {
            AddAssemblyReference(engine, "System.Windows.Forms.dll");
        }

        for (int j = 0; j < options.SourceFileNames.Count; j++)
        {
            AddSourceFile(engine, (string)options.SourceFileNames[j], options.codepage, options.fForceCodepage);
        }

        bool isCompiled = false;

        try{
            isCompiled = engine.Compile();
        }catch (VsaException e) {
            // check for expected errors
            if (e.ErrorCode == VsaError.AssemblyExpected)
            {
                if (e.InnerException != null && e.InnerException is System.BadImageFormatException)
                {
                    // the reference was not for an assembly
                    CmdLineException cmdLineError = new CmdLineException(CmdLineError.InvalidAssembly, e.Message, JScriptCompiler.GetCultureInfo());
                    Console.WriteLine(cmdLineError.Message);
                }
                else if (e.InnerException != null && (e.InnerException is System.IO.FileNotFoundException || e.InnerException is System.IO.FileLoadException))
                {
                    // the referenced file not valid
                    CmdLineException cmdLineError = new CmdLineException(CmdLineError.AssemblyNotFound, e.Message, JScriptCompiler.GetCultureInfo());
                    Console.WriteLine(cmdLineError.Message);
                }
                else
                {
                    CmdLineException cmdLineError = new CmdLineException(CmdLineError.InvalidAssembly, JScriptCompiler.GetCultureInfo());
                    Console.WriteLine(cmdLineError.Message);
                }
            }
            else if (e.ErrorCode == VsaError.SaveCompiledStateFailed)
            {
                CmdLineException cmdLineError = new CmdLineException(CmdLineError.ErrorSavingCompiledState, e.Message, JScriptCompiler.GetCultureInfo());
                Console.WriteLine(cmdLineError.Message);
            }
            else if (e.ErrorCode == VsaError.AssemblyNameInvalid && e.InnerException != null)
            {
                CmdLineException cmdLineError = new CmdLineException(CmdLineError.InvalidCharacters, e.Message, JScriptCompiler.GetCultureInfo());
                Console.WriteLine(cmdLineError.Message);
            }
            else
            {
                Console.WriteLine(Localize("INTERNAL COMPILER ERROR"));
                Console.WriteLine(e);
            }
            return(false);
        }catch (Exception e) {
            Console.WriteLine(Localize("INTERNAL COMPILER ERROR"));
            Console.WriteLine(e);
            return(false);
        }
        return(isCompiled);
    }
Esempio n. 10
0
  bool Compile(CompilerOptions options){
    if (this.fPrintTargets)
      Console.WriteLine(Localize("Compiling", options.strOutputFileName));

    VsaEngine engine = new Microsoft.JScript.Vsa.VsaEngine();
    if (null == engine)
      throw new CmdLineException(CmdLineError.CannotCreateEngine, JScriptCompiler.GetCultureInfo());
    engine.InitVsaEngine("JSC://Microsoft.JScript.Vsa.VsaEngine", new EngineSite(options));
    engine.LCID = JScriptCompiler.GetCultureInfo().LCID;
    engine.GenerateDebugInfo = options.fDebug;

    engine.SetOption("ReferenceLoaderAPI", "ReflectionOnlyLoadFrom");
    engine.SetOption("AutoRef", options.autoRef);
    engine.SetOption("fast", options.fFast);
    engine.SetOption("output", options.strOutputFileName);
    engine.SetOption("PEFileKind", options.PEFileKind);
    engine.SetOption("PortableExecutableKind", options.PEKindFlags);
    engine.SetOption("ImageFileMachine", options.PEMachineArchitecture);
    engine.SetOption("print", options.fPrint);
    engine.SetOption("libpath", options.libpath);
    if (options.versionInfo != null)
      engine.SetOption("version", options.versionInfo);
    engine.SetOption("VersionSafe", options.fVersionSafe);
    engine.SetOption("defines", options.Defines);
    engine.SetOption("warnaserror", options.fTreatWarningsAsErrors);
    engine.SetOption("WarningLevel", options.nWarningLevel);
    if (options.ManagedResources.Count > 0)
      engine.SetOption("managedResources", options.ManagedResources.Values);

    bool fStdlibAdded = false;
    bool fWinFormsAdded = false;
    foreach (string assemblyName in options.ImportFileNames){
      AddAssemblyReference(engine, assemblyName);
      string filename = Path.GetFileName(assemblyName);
      if (String.Compare(filename, "mscorlib.dll", StringComparison.OrdinalIgnoreCase) == 0)
        fStdlibAdded = true;
      else if (String.Compare(filename, "System.Windows.Forms.dll", StringComparison.OrdinalIgnoreCase) == 0)
        fWinFormsAdded = true;
    }

    // Only add mscorlib if it hasn't already been added.
    if (!options.fNoStdlib && !fStdlibAdded)
      AddAssemblyReference(engine, "mscorlib.dll");
    // add System.Windows.Forms if target is winexe and it hasn't already been added
    if ((options.PEFileKind == PEFileKinds.WindowApplication) && !options.fNoStdlib && !fWinFormsAdded)
      AddAssemblyReference(engine, "System.Windows.Forms.dll");

    for (int j = 0; j < options.SourceFileNames.Count; j++)
      AddSourceFile(engine, (string)options.SourceFileNames[j], options.codepage);

    bool isCompiled = false;
    try{
      isCompiled = engine.Compile();
    }catch(VsaException e){
      // check for expected errors
      if (e.ErrorCode == VsaError.AssemblyExpected){
        if (e.InnerException != null && e.InnerException is System.BadImageFormatException){
          // the reference was not for an assembly
          CmdLineException cmdLineError = new CmdLineException(CmdLineError.InvalidAssembly, e.Message, JScriptCompiler.GetCultureInfo());
          Console.WriteLine(cmdLineError.Message);
        }else if (e.InnerException != null && (e.InnerException is System.IO.FileNotFoundException || e.InnerException is System.IO.FileLoadException)){
          // the referenced file not valid
          CmdLineException cmdLineError = new CmdLineException(CmdLineError.AssemblyNotFound, e.Message, JScriptCompiler.GetCultureInfo());
          Console.WriteLine(cmdLineError.Message);
        }else{
          CmdLineException cmdLineError = new CmdLineException(CmdLineError.InvalidAssembly, JScriptCompiler.GetCultureInfo());
          Console.WriteLine(cmdLineError.Message);
        }
      }else if (e.ErrorCode == VsaError.SaveCompiledStateFailed){
        CmdLineException cmdLineError = new CmdLineException(CmdLineError.ErrorSavingCompiledState, e.Message, JScriptCompiler.GetCultureInfo());
        Console.WriteLine(cmdLineError.Message);
      }else if (e.ErrorCode == VsaError.AssemblyNameInvalid && e.InnerException != null){
        CmdLineException cmdLineError = new CmdLineException(CmdLineError.InvalidCharacters, e.Message, JScriptCompiler.GetCultureInfo());
        Console.WriteLine(cmdLineError.Message);
      }else{
        Console.WriteLine(Localize("INTERNAL COMPILER ERROR"));
        Console.WriteLine(e);
      }
      return false;
    }catch(Exception e){
      Console.WriteLine(Localize("INTERNAL COMPILER ERROR"));
      Console.WriteLine(e);
      return false;
    }catch{
      Console.WriteLine(Localize("INTERNAL COMPILER ERROR"));
      return false;
    }
    return isCompiled;
  }