当前位置: 首页>>代码示例>>C#>>正文


C# ExecutionContext.PopScope方法代码示例

本文整理汇总了C#中FlexWiki.ExecutionContext.PopScope方法的典型用法代码示例。如果您正苦于以下问题:C# ExecutionContext.PopScope方法的具体用法?C# ExecutionContext.PopScope怎么用?C# ExecutionContext.PopScope使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在FlexWiki.ExecutionContext的用法示例。


在下文中一共展示了ExecutionContext.PopScope方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: ValueOf

		public override IBELObject ValueOf(string name, System.Collections.ArrayList arguments, ExecutionContext ctx)
		{
			Hashtable members = ctx.CurrentFederation.GetTopicProperties(Name);
			string val = (string)(members[name]);
			if (val == null)
				return null;
			val = val.Trim();
			bool isBlock = val.StartsWith("{");
			if (!isBlock)
				return new BELString(val);
			// It's a block, so fire up the interpreter
			if (!val.EndsWith("}"))
				throw new ExecutionException("Topic member " + name + " defined in " + Name.Fullname + " is not well-formed; missing closing '}' for code block.");
			ContentBase cb = CurrentFederation.ContentBaseForTopic(Name);
			TopicContext newContext = new TopicContext(ctx.CurrentFederation, cb, CurrentTopicInfo);
			BehaviorInterpreter interpreter = new BehaviorInterpreter(val, CurrentFederation, CurrentFederation.WikiTalkVersion, ctx.Presenter);
			if (!interpreter.Parse())
				throw new ExecutionException("Parsing error evaluating topic member " + name + " defined in " + Name.Fullname + ": " + interpreter.ErrorString);
			
			IBELObject b1 = interpreter.EvaluateToObject(newContext, ctx.ExternalWikiMap);
			if (b1 == null)
				throw new ExecutionException("Error while evaluating topic member " + name + " defined in " + Name.Fullname + ": " + interpreter.ErrorString);
			Block block = (Block)b1;
			ArrayList evaluatedArgs = new ArrayList();
			foreach (object each in arguments)
			{
				IBELObject add = null;
				if (each != null && each is IBELObject)
					add = each as IBELObject;
				else
				{
					ExposableParseTreeNode ptn = each as ExposableParseTreeNode;
					add = ptn.Expose(ctx);
				}
				evaluatedArgs.Add(add);
			}

			InvocationFrame invocationFrame = new InvocationFrame();
			ctx.PushFrame(invocationFrame);

			TopicScope topicScope = new TopicScope(null, this);
			ctx.PushScope(topicScope);		// make sure we can use local references
			IBELObject answer = block.Value(ctx, evaluatedArgs);
			ctx.PopScope();

			ctx.PopFrame();

			// make sure to transfer any new cache rules
			// BELTODO - want a test case for this 
			foreach (CacheRule r in interpreter.CacheRules)
				ctx.AddCacheRule(r);

			return answer;
		}
开发者ID:nuxleus,项目名称:flexwiki,代码行数:54,代码来源:DynamicTopic.cs

示例2: ValueOf

        public override IBELObject ValueOf(string name, System.Collections.ArrayList arguments, ExecutionContext ctx)
        {
            TopicPropertyCollection members = ctx.CurrentFederation.GetTopicProperties(Name);
            string val = members[name].LastValue;
            if (val == null)
                return null;
            val = val.Trim();
            bool isBlock = val.StartsWith("{");
            if (!isBlock)
                return new BELString(val);
            // It's a block, so fire up the interpreter
            if (!val.EndsWith("}"))
                throw new ExecutionException(ctx.CurrentLocation, "Topic member " + name + " defined in " + Name.DottedName + " is not well-formed; missing closing '}' for code block.");
            NamespaceManager cb = CurrentFederation.NamespaceManagerForTopic(Name);
            TopicContext newContext = new TopicContext(ctx.CurrentFederation, cb, CurrentTopicInfo);
            BehaviorInterpreter interpreter = new BehaviorInterpreter(Name.DottedName + "#" + name, val, CurrentFederation, CurrentFederation.WikiTalkVersion, ctx.Presenter);
            if (!interpreter.Parse())
                throw new ExecutionException(ctx.CurrentLocation, "Syntax error in " + interpreter.ErrorString);

            IBELObject b1 = interpreter.EvaluateToObject(newContext, ctx.ExternalWikiMap);
            if (b1 == null)
                throw new ExecutionException(ctx.CurrentLocation, "Execution error in " + interpreter.ErrorString);
            Block block = (Block) b1;
            ArrayList evaluatedArgs = new ArrayList();
            foreach (object each in arguments)
            {
                IBELObject add = null;
                if (each != null && each is IBELObject)
                    add = each as IBELObject;
                else
                {
                    ExposableParseTreeNode ptn = each as ExposableParseTreeNode;
                    add = ptn.Expose(ctx);
                }
                evaluatedArgs.Add(add);
            }

            InvocationFrame invocationFrame = new InvocationFrame();
            ctx.PushFrame(invocationFrame);

            TopicScope topicScope = new TopicScope(null, this);
            ctx.PushScope(topicScope);		// make sure we can use local references
            IBELObject answer = block.Value(ctx, evaluatedArgs);
            ctx.PopScope();

            ctx.PopFrame();

            return answer;
        }
开发者ID:nuxleus,项目名称:flexwiki,代码行数:49,代码来源:DynamicTopic.cs

示例3: EvaluateToObject

		public IBELObject EvaluateToObject(TopicContext topicContext,  Hashtable externalWikimap)
		{
			_CacheRules = new ArrayList();
			if (ParseTree == null)
			{
				ErrorString = "Expression can not be evaluated; parse failed.";
				State = InterpreterState.EvaluationFailure;
				return null;
			}
			ExecutionContext ctx = new ExecutionContext(topicContext);
			ctx.WikiTalkVersion = WikiTalkVersion;
			IBELObject answer = null;
			try 
			{
				ctx.ExternalWikiMap = externalWikimap;
				IScope theScope = null;

				ctx.Presenter = Presenter;

				TopicInfo topic = topicContext != null ? topicContext.CurrentTopic : null;
				if (topic != null && topic.Fullname != null)
				{
					// Locate any topics via the NamespaceWith property to see if there's anybody else we should import (for all topics in the namespace)
					ArrayList nswith = topicContext.CurrentFederation.GetTopicInfo(ctx, topicContext.CurrentTopic.ContentBase.DefinitionTopicName.Fullname).GetListProperty("NamespaceWith");
					if (nswith != null)
					{
						nswith.Reverse();
						foreach (string top in nswith)
						{
							AbsoluteTopicName abs = topic.ContentBase.UnambiguousTopicNameFor(new RelativeTopicName(top));
							if (abs == null)
							{
								throw new Exception("No such topic: " + top + " (as specifed in NamespaceWith: property for " + topicContext.CurrentTopic.ContentBase.DefinitionTopicName.Fullname + ")");
							}
							theScope = new TopicScope(theScope, new DynamicTopic(topic.Federation, abs));
							ctx.AddCacheRule(new TopicsCacheRule(topic.Federation, abs));
						}
					}
					
					// Locate any topics via the with property to see if there's anybody else we should import
					ArrayList with = topicContext.CurrentTopic.GetListProperty("With");
					if (with != null)
					{
						with.Reverse();
						foreach (string top in with)
						{
							AbsoluteTopicName abs = topic.ContentBase.UnambiguousTopicNameFor(new RelativeTopicName(top));
							if (abs == null)
							{
								throw new Exception("No such topic: " + top + " (as specifed in With: property for " + topicContext.CurrentTopic + ")");
							}
							theScope = new TopicScope(theScope, new DynamicTopic(topic.Federation, abs));
							ctx.AddCacheRule(new TopicsCacheRule(topic.Federation, abs));
						}
					}
					// add the topic to the current scope (this guy goes at the front of the queue!)
					theScope = new TopicScope(theScope, new DynamicTopic(topic.Federation, topic.Fullname));

				}
				if (theScope != null)
					ctx.PushScope(theScope); // make sure we can use local references
				// parse tree -> live objects
				answer = ParseTree.Expose(ctx);
				if (theScope != null)
					ctx.PopScope();

				_CacheRules = ctx.CacheRules;
			}
			catch (Exception e)
			{
				_CacheRules = ctx.CacheRules;
				ErrorString = e.Message;
				State = InterpreterState.EvaluationFailure;
				return  null;
			}
			State = InterpreterState.EvaluationSuccess;
			return answer;
		}
开发者ID:nuxleus,项目名称:flexwiki,代码行数:78,代码来源:BehaviorInterpreter.cs

示例4: Value

        public IBELObject Value(ExecutionContext ctx, ArrayList args)
        {
            if (ParseTree == null)
                return UndefinedObject.Instance;
            BlockScope blockScope = new BlockScope(ContainingScope);
            if (args != null)
            {
                if (args.Count != ParameterCount)
                    throw new ArgumentException("Incorrect number of parameters for block.  Need " + ParameterCount + "; got " + args.Count);
                // Determine desired types
                ArrayList neededTypes = new ArrayList();
                foreach (BlockParameter parm in Parameters)
                {
                    if (parm.TypeName == null)
                    {
                        neededTypes.Add(null);	 // they said it could be anything
                        continue;
                    }
                    BELType t = (BELType)(ctx.TypeRegistry.Registry[parm.TypeName]);
                    if (t == null)
                        throw new ArgumentException("Block parameter (" + parm.Identifier + ") requires unknown type (" + parm.TypeName + ")");
                    neededTypes.Add(t);
                }

                // Check types, as requested
                ArrayList convertedArgs = new ArrayList();
                for(int i = 0; i < ParameterCount; i++)
                {
                    BlockParameter bp = (BlockParameter)(Parameters[i]);
                    convertedArgs.Add(BELType.ConvertToBELObjectIfNeeded(args[i]));
                    if (bp.TypeName == null)
                        continue; 	 // they said it could be anything
                    IBELObject arg = (IBELObject)(convertedArgs[i]);
                    Type parmType = ((BELType)(neededTypes[i])).CLRType;
                    if (!parmType.IsAssignableFrom(arg.GetType()))
                        throw new MemberInvocationException(ctx.CurrentLocation, "Block parameter " + bp.Identifier + " is not of the correct type (was "
                            + ExternalTypeNameForType(arg.GetType()) +
                            ", but needed " + ExternalTypeNameForType(parmType) + ")");
                }

                // OK, we have them and they're type correct and converted to CLR types where needed.  Add them into the block scope
                for(int i = 0; i < ParameterCount; i++)
                {
                    BlockParameter bp = (BlockParameter)(Parameters[i]);
                    blockScope.AddParameter(bp.Identifier, (IBELObject)(convertedArgs[i]));
                }
            }
            ctx.PushScope(blockScope);
            IBELObject answer = ParseTree.Expose(ctx);
            ctx.PopScope();
            return answer;
        }
开发者ID:nuxleus,项目名称:flexwikicore,代码行数:52,代码来源:Block.cs

示例5: with

        public IBELObject with(ExecutionContext ctx)
        {
            InvocationFrame frame = ctx.TopFrame;
            WithScope with = new WithScope(ctx.CurrentScope);
            if (frame.ExtraArguments.Count < 1)
                throw new ArgumentException("With requires at least a block to execute; zero arguments supplied.");
            int pushCount = frame.ExtraArguments.Count - 1;
            for (int i = pushCount - 1; i >= 0; i--)
            {
                ExposableParseTreeNode e = (ExposableParseTreeNode)frame.ExtraArguments[i];
                IBELObject ex = e.Expose(ctx);
                with.AddObject(ex);
            }
            ctx.PushScope(with);

            // OK, now we have the new scope on the stack -- now it's safe to create the Block (since it'll "live in" the top scope
            ExposableParseTreeNode blockTree = (ExposableParseTreeNode)(frame.ExtraArguments[frame.ExtraArguments.Count - 1]);
            Block block = (blockTree.Expose(ctx)) as Block;
            if (block == null)
                throw new ArgumentException("With requires last argument to be a block; it isn't.");

            IBELObject answer = block.Value(ctx);
            ctx.PopScope();
            return answer;
        }
开发者ID:nuxleus,项目名称:flexwiki,代码行数:25,代码来源:Home.cs


注:本文中的FlexWiki.ExecutionContext.PopScope方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。