view Jint.Runtime/VM/OpCodes/BinaryOperation.cs @ 0:e113095f1de0

initial commit, proof of concept
author cin
date Wed, 23 Oct 2013 13:24:57 +0400
parents
children
line wrap: on
line source

using System;

namespace Jint.Runtime.VM
{
	public abstract class BinaryOperation: IBinaryOperation
	{
		protected int m_arg1;
		protected int m_arg2;
		protected int m_res;

		protected BinaryOperation(int arg1, int arg2, int res) {
			m_arg1 = arg1;
			m_arg2 = arg2;
			m_res = res;
		}

		public virtual void Fallback(BoxBase arg1, BoxBase arg2, Frame frame) {
			throw new InvalidOperationException ("Unable to perform a binary operation on the specified arguments");
		}

		#region IBinaryOperation implementation

		public abstract void Invoke<T> (T arg1, T arg2, IBinder<T> binder, Frame frame);

		#endregion

		#region IOperation implementation

		public void Invoke (Frame frame)
		{
			var box1 = frame.GetBox (m_arg1);
			var box2 = frame.GetBox (m_arg2);

			if (box1 != null && box2 != null && box1.HoldingType == box2.HoldingType) {
				box1.Invoke (this, box2, frame);
			} else {
				Fallback (box1, box2, frame);
			}
		}

		#endregion
	}
}