public void Send( IValue receiver, ValueSymbol selector, IList<IValue> args, VM vm, SourceInfo info ) { IValueFunc func = null; foreach (ValueSymbol klass in KlassList) { if (vm.Env.LookupMethod(klass, selector, out func)) { break; } } if (func == null) { throw new RheaException( string.Format( "invalid selector for {0}: {1}", receiver, selector.Name.ToIdentifier() ), info ); } List<IValue> newArgs = new List<IValue>(); newArgs.Add(receiver); newArgs.AddRange(args); func.Call(newArgs, vm, info); }
public static ValueSymbol Intern(string name) { ValueSymbol symbol; if (!smInstances.TryGetValue(name, out symbol)) { symbol = new ValueSymbol(name, true); smInstances[name] = symbol; } return symbol; }
public IValueFunc this[ValueSymbol klass, ValueSymbol selector] { get { return mMethods[MakePair(klass, selector)]; } set { mMethods[MakePair(klass, selector)] = value; } }
public IValue this[ValueSymbol symbol] { get { return mVariables[symbol]; } set { mVariables[symbol] = value; } }
public ExprSend( IExpr recvExpr, ValueSymbol selector, IList<IExpr> argExprs, SourceInfo info ) { RecvExpr = recvExpr; Selector = selector; ArgExprs = argExprs; mInfo = info; }
public void Send(ValueSymbol selector, IList<IValue> args, VM vm, SourceInfo info) { if (smKlassHolder == null) { smKlassHolder = new KlassHolder( new List<ValueSymbol> { Klasses.Symbol, Klasses.Object } ); } smKlassHolder.Send(this, selector, args, vm, info); }
public void Send(ValueSymbol selector, IList<IValue> args, VM vm, SourceInfo info) { IValueFunc func; if (mMethods.TryGetValue(selector, out func)) { List<IValue> newArgs = new List<IValue>(); newArgs.Add(this); newArgs.AddRange(args); func.Call(newArgs, vm, info); return; } mKlassHolder.Send(this, selector, args, vm, info); }
public void Send(ValueSymbol selector, IList<IValue> args, VM vm, SourceInfo info) { smKlassHolder.Send(this, selector, args, vm, info); }
private static KeyValuePair<ValueSymbol, ValueSymbol> MakePair(ValueSymbol klass, ValueSymbol selector) { return new KeyValuePair<ValueSymbol, ValueSymbol>(klass, selector); }
public bool TryGetVariable(ValueSymbol symbol, out IValue value) { return mVariables.TryGetValue(symbol, out value); }
public bool TryGetMethod(ValueSymbol klass, ValueSymbol selector, out IValueFunc func) { return mMethods.TryGetValue(MakePair(klass, selector), out func); }
public bool ContainsVariable(ValueSymbol symbol) { return mVariables.ContainsKey(symbol); }
public bool ContainsMethod(ValueSymbol klass, ValueSymbol selector) { return mMethods.ContainsKey(MakePair(klass, selector)); }
public void AddVariable(ValueSymbol symbol, IValue value) { mVariables.Add(symbol, value); }
public void AddMethod(ValueSymbol klass, ValueSymbol selector, IValueFunc func) { mMethods.Add(MakePair(klass, selector), func); }
public InsnSend(ValueSymbol selector, int argCount, SourceInfo info) { mSelector = selector; mArgCount = argCount; mInfo = info; }