From 620f7926f3f2ad05fdb72050a87e49d0fa2357dd Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Wed, 16 Jul 2008 01:00:40 +0000 Subject: Mantis#1753. Thank you kindly, Kinoc for a patch that: Brings Yield Prolog up to date with sourceforge version 0.9.10 Patched applies to both DotNet and XEngine. --- .../Api/Runtime/YieldProlog/PrologException.cs | 118 ++++++++++++++++++--- 1 file changed, 103 insertions(+), 15 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/PrologException.cs') diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/PrologException.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/PrologException.cs index f29c751..a2fe7ec 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/PrologException.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/PrologException.cs @@ -1,20 +1,20 @@ /* * Copyright (C) 2007-2008, Jeff Thompson - * + * * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without + * + * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright + * + * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * * Neither the name of the copyright holder nor the names of its contributors - * may be used to endorse or promote products derived from this software + * * Neither the name of the copyright holder nor the names of its contributors + * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR @@ -43,7 +43,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog /// Create a PrologException with the given Term. The printable exception message is the full Term. /// /// the term of the exception - /// public PrologException(object Term) : base(YP.getValue(Term).ToString()) { @@ -54,18 +53,107 @@ namespace OpenSim.Region.ScriptEngine.Shared.YieldProlog /// Create a PrologException where the Term is error(ErrorTerm, Message). /// This uses YP.makeCopy to copy the ErrorTerm and Message so that they are valid after unbinding. /// - /// the term of the exception - /// the message, converted to a string, to use as the printable exception message + /// the error term of the error + /// the message term of the error. If this is a string, it is converted to an + /// Atom so it can be used by Prolog code. + /// Message, converted to a string, is use as the printable exception message. /// public PrologException(object ErrorTerm, object Message) : base(YP.getValue(Message).ToString()) { + if (Message is string) + Message = Atom.a((string)Message); _term = YP.makeCopy(new Functor2(Atom.a("error"), ErrorTerm, Message), new Variable.CopyStore()); } - public object Term + public class TypeErrorInfo + { + public readonly Atom _Type; + public readonly object _Culprit; + public readonly object _Message; + + public TypeErrorInfo(Atom Type, object Culprit, object Message) + { + _Type = Type; + _Culprit = Culprit; + _Message = Message; + } + } + /// + /// Return the TypeErrorInfo for this exception, or null if _term does not match + /// error(type_error(Type, Culprit), Message). + /// + /// + public TypeErrorInfo getTypeErrorInfo() + { + if (!(_term is Functor2 && ((Functor2)_term)._name._name == "error")) + return null; + object errorTerm = ((Functor2)_term)._arg1; + if (!(errorTerm is Functor2 && ((Functor2)errorTerm)._name._name == "type_error")) + return null; + if (!(((Functor2)errorTerm)._arg1 is Atom)) + return null; + return new TypeErrorInfo + ((Atom)((Functor2)errorTerm)._arg1, ((Functor2)errorTerm)._arg2, ((Functor2)_term)._arg2); + } + + public class ExistenceErrorInfo + { + public readonly Atom _Type; + public readonly object _Culprit; + public readonly object _Message; + + public ExistenceErrorInfo(Atom Type, object Culprit, object Message) + { + _Type = Type; + _Culprit = Culprit; + _Message = Message; + } + + /// + /// If _Type is procedure and _Culprit is name/artity, return the name. Otherwise return null. + /// + /// + public object getProcedureName() + { + if (!(_Type._name == "procedure" && + _Culprit is Functor2 && ((Functor2)_Culprit)._name == Atom.SLASH)) + return null; + return ((Functor2)_Culprit)._arg1; + } + + /// + /// If _Type is procedure and _Culprit is name/arity and arity is an integer, return the arity. + /// Otherwise return -1. + /// + /// + public int getProcedureArity() + { + if (!(_Type._name == "procedure" && + _Culprit is Functor2 && ((Functor2)_Culprit)._name == Atom.SLASH)) + return -1; + if (!(((Functor2)_Culprit)._arg2 is int)) + return -1; + return (int)((Functor2)_Culprit)._arg2; + } + } + /// + /// Return the ExistenceErrorInfo for this exception, or null if _term does not match + /// error(existence_error(Type, Culprit), Message). If the returned ExistenceErrorInfo _Culprit is + /// procedure, you can use its getProcedureName and getProcedureArity. + /// + /// + public ExistenceErrorInfo getExistenceErrorInfo() { - get { return _term; } + if (!(_term is Functor2 && ((Functor2)_term)._name._name == "error")) + return null; + object errorTerm = ((Functor2)_term)._arg1; + if (!(errorTerm is Functor2 && ((Functor2)errorTerm)._name._name == "existence_error")) + return null; + if (!(((Functor2)errorTerm)._arg1 is Atom)) + return null; + return new ExistenceErrorInfo + ((Atom)((Functor2)errorTerm)._arg1, ((Functor2)errorTerm)._arg2, ((Functor2)_term)._arg2); } } } -- cgit v1.1