public JSError() : base(new mdr.DObject(), "Error") { JittedCode = (ref mdr.CallFrame callFrame) => { var error = new mdr.DObject(TargetPrototype); switch(callFrame.PassedArgsCount) { case 0: break; case 1: error.SetField("message", callFrame.Arg0.AsString()); goto case 0; case 2: error.SetField("fileName", callFrame.Arg1.AsString()); goto case 1; case 3: error.SetField("lineNumber", callFrame.Arg2.AsString()); goto case 2; } if (IsConstrutor) callFrame.This = (error); else callFrame.Return.Set(error); }; TargetPrototype.DefineOwnProperty("message", "", mdr.PropertyDescriptor.Attributes.NotEnumerable | mdr.PropertyDescriptor.Attributes.Data); TargetPrototype.DefineOwnProperty("name", "Error", mdr.PropertyDescriptor.Attributes.NotEnumerable | mdr.PropertyDescriptor.Attributes.Data); TargetPrototype.DefineOwnProperty("toString", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var name = callFrame.This.GetField("name").AsString(); var message = callFrame.This.GetField("message").AsString(); callFrame.Return.Set(string.Format("{0}: {1}", name, message)); }), mdr.PropertyDescriptor.Attributes.NotEnumerable | mdr.PropertyDescriptor.Attributes.Data); }
static SampleDOMNode() { //Here we build the prototype of DOM Object Wrapper. This prototype must have all //the methods of the DOM object callable by JS. prototype = new mdr.DObject(); prototype.SetField("GetElementByName", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var o = callFrame.This as WrappedObject; var domptr = o.Domptr; //GCHandle gchWrapperIndex = GCHandle.Alloc(new int(), GCHandleType.Pinned); var elemName = callFrame.Arg0.ToString(); WrappedObject elemPtr = GetElementByName(domptr, /*gchWrapperIndex.AddrOfPinnedObject(),*/elemName) as WrappedObject; //int wrapperindex = (int)gchWrapperIndex.Target; //gchWrapperIndex.Free(); callFrame.Return.Set(elemPtr); })); prototype.SetField("GetName", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var o = callFrame.This as WrappedObject; var arg0 = o.Domptr; callFrame.Return.Set(GetName(arg0)); })); prototype.SetField("Num", new mdr.DProperty() { TargetValueType = mdr.ValueTypes.Int32, OnGetInt = (This) => { Console.WriteLine("running getNum in C#"); Console.Out.Flush(); return GetNum(((WrappedObject) This).Domptr); }, OnSetInt = (This, n) => SetNum(((WrappedObject) This).Domptr, n), OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { v.Set(GetNum(((WrappedObject) This).Domptr)); }, }); }
static SampleDOMNode() { //Here we build the prototype of DOM Object Wrapper. This prototype must have all //the methods of the DOM object callable by JS. prototype = new mdr.DObject(); prototype.SetField("GetElementByName", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var o = callFrame.This as WrappedObject; var domptr = o.Domptr; //GCHandle gchWrapperIndex = GCHandle.Alloc(new int(), GCHandleType.Pinned); var elemName = callFrame.Arg0.ToString(); WrappedObject elemPtr = GetElementByName(domptr, /*gchWrapperIndex.AddrOfPinnedObject(),*/ elemName) as WrappedObject; //int wrapperindex = (int)gchWrapperIndex.Target; //gchWrapperIndex.Free(); callFrame.Return.Set(elemPtr); })); prototype.SetField("GetName", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var o = callFrame.This as WrappedObject; var arg0 = o.Domptr; callFrame.Return.Set(GetName(arg0)); })); prototype.SetField("Num", new mdr.DProperty() { TargetValueType = mdr.ValueTypes.Int32, OnGetInt = (This) => { Console.WriteLine("running getNum in C#"); Console.Out.Flush(); return(GetNum(((WrappedObject)This).Domptr)); }, OnSetInt = (This, n) => SetNum(((WrappedObject)This).Domptr, n), OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { v.Set(GetNum(((WrappedObject)This).Domptr)); }, }); }
public JSError() : base(new mdr.DObject(), "Error") { JittedCode = (ref mdr.CallFrame callFrame) => { var error = new mdr.DObject(TargetPrototype); switch (callFrame.PassedArgsCount) { case 0: break; case 1: error.SetField("message", callFrame.Arg0.AsString()); goto case 0; case 2: error.SetField("fileName", callFrame.Arg1.AsString()); goto case 1; case 3: error.SetField("lineNumber", callFrame.Arg2.AsString()); goto case 2; } if (IsConstrutor) { callFrame.This = (error); } else { callFrame.Return.Set(error); } }; TargetPrototype.DefineOwnProperty("message", "", mdr.PropertyDescriptor.Attributes.NotEnumerable | mdr.PropertyDescriptor.Attributes.Data); TargetPrototype.DefineOwnProperty("name", "Error", mdr.PropertyDescriptor.Attributes.NotEnumerable | mdr.PropertyDescriptor.Attributes.Data); TargetPrototype.DefineOwnProperty("toString", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var name = callFrame.This.GetField("name").AsString(); var message = callFrame.This.GetField("message").AsString(); callFrame.Return.Set(string.Format("{0}: {1}", name, message)); }), mdr.PropertyDescriptor.Attributes.NotEnumerable | mdr.PropertyDescriptor.Attributes.Data); }
public static void CreateJson(int itemsCount, ref Stack stack) { //Debug.WriteLine("calling Exec.CreateJson"); var obj = new mdr.DObject(); var resultIndex = stack.Sp - itemsCount * 2; //TODO: here we know things are string, so just push their fieldIds and user then here! if (itemsCount > 0) { var sp = resultIndex; for (var i = itemsCount - 1; i >= 0; --i, sp += 2) { obj.SetField(ref stack.Items[sp], ref stack.Items[sp + 1]); } } stack.Items[resultIndex].Set(obj); stack.Sp = resultIndex + 1;; }
public static mdr.DArray CreateArgumentsObject(ref mdr.CallFrame callFrame, mdr.DObject context) { var metadata = (JSFunctionMetadata)callFrame.Function.Metadata; Debug.Assert(metadata.Scope.HasArgumentsSymbol, "Invalid situation, created arguments for the wrong scope!"); mdr.DArray arguments = null; if (metadata.Scope.IsEvalFunction) { //Read from context var tmp = new mdr.DValue(); context.GetField(JSFunctionArguments.Name, ref tmp); arguments = tmp.AsDArray(); } else { arguments = CreateArgumentsObject(ref callFrame); var parameters = metadata.FunctionIR.Parameters; Debug.Assert(arguments.Length >= parameters.Count, "arguments array is not large enough to hold all arguments."); for (var i = parameters.Count - 1; i >= 0; --i) { var symbol = parameters[i].Symbol; var paramIndex = symbol.ParameterIndex; Debug.Assert(paramIndex == i, "Invalid situation!, Parameter indexes don't match!"); if (symbol.SymbolType == JSSymbol.SymbolTypes.ClosedOnLocal) { var pd = context.AddOwnPropertyDescriptorByFieldId(symbol.FieldId, mdr.PropertyDescriptor.Attributes.Accessor | mdr.PropertyDescriptor.Attributes.NotConfigurable); context.Fields[pd.Index].Set(new ArgumentAccessor(arguments, paramIndex)); } } if (metadata.Scope.HasEval) { context.SetField(JSFunctionArguments.Name, arguments); } } return(arguments); }
public static mdr.DObject GetPrototype(EventClasses eventClass) { mdr.DObject prototype = null; switch (eventClass) { case EventClasses.Event: { prototype = new mdr.DObject(); prototype.DefineOwnProperty("type", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set(ev.Data.Type.ToString().ToLower()); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("screenX", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set((int)ev.Data.screenX); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("screenY", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set((int)ev.Data.screenY); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("clientX", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set((int)ev.Data.clientX); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("clientY", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set((int)ev.Data.clientY); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("pageX", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set((int)ev.Data.pageX); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("pageY", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set((int)ev.Data.pageY); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("buttons", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set((int)ev.Data.buttons); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("button", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set((int)ev.Data.button); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("metaKey", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set(ev.Data.metaKey); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("ctrlKey", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set(ev.Data.ctrlKey); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("shiftKey", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set(ev.Data.shiftKey); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("altKey", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set(ev.Data.altKey); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("target", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set(ev.Target); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("currentTarget", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set(ev.CurrentTarget); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("eventPhase", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set((UInt32)ev.Phase); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("bubbles", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set(ev.Bubbles); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("cancelable", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set(ev.Cancelable); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.SetField("initEvent", new mdr.DFunction((ref mdr.CallFrame callFrame) => { string eventTypeString = callFrame.Arg0.AsString(); bool bubbles = mjr.Operations.Convert.ToBoolean.Run(ref callFrame.Arg1); bool cancelable = mjr.Operations.Convert.ToBoolean.Run(ref callFrame.Arg2); var ev = callFrame.This.FirstInPrototypeChainAs<JSEvent>(); EventTypes type; eventTypesToString.TryGetValue(eventTypeString, out type); ev.InitEvent(type, bubbles, cancelable); })); prototype.SetField("stopPropagation", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var ev = callFrame.This.FirstInPrototypeChainAs<JSEvent>(); ev.StopPropagation(); })); prototype.SetField("stopImmediatePropagation", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var ev = callFrame.This.FirstInPrototypeChainAs<JSEvent>(); ev.StopImmediatePropagation(); })); prototype.SetField("preventDefault", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var ev = callFrame.This.FirstInPrototypeChainAs<JSEvent>(); ev.PreventDefault(); })); //Fill the rest ... break; } case EventClasses.UIEvent: { prototype = new mdr.DObject(HTMLRuntime.Instance.GetPropertyMapOfEventPrototype(EventClasses.Event)); /* prototype.DefineOwnProperty("type", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set(ev.Data.Type.ToString()); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); * */ prototype.SetField("initUIEvent", new mdr.DFunction((ref mdr.CallFrame callFrame) => { string eventTypeString = callFrame.Arg0.AsString(); bool bubbles = mjr.Operations.Convert.ToBoolean.Run(ref callFrame.Arg1); bool cancelable = mjr.Operations.Convert.ToBoolean.Run(ref callFrame.Arg2); // TODO: Variables 'view' and 'detail' are never used; remove? /*string view = callFrame.Arg3.ToString(); int detail = -1; if (callFrame.ArgsCount > 4) { detail = callFrame.Arguments[0].ToInt32(); }*/ var ev = callFrame.This.FirstInPrototypeChainAs<JSEvent>(); EventTypes type; eventTypesToString.TryGetValue(eventTypeString, out type); ev.InitEvent(type, bubbles, cancelable); })); //Fill the rest ... break; } case EventClasses.MouseEvent: { prototype = new mdr.DObject(HTMLRuntime.Instance.GetPropertyMapOfEventPrototype(EventClasses.UIEvent)); prototype.DefineOwnProperty("type", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs<JSEvent>(); v.Set(ev.Data.Type.ToString()); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); //Fill the rest ... break; } default: Trace.Fail("Invalid event class type {0}", eventClass); break; } return prototype; }
private static void AddExtendedMethods(mdr.DObject obj) { #region Mozilla intrinsics obj.SetField("assertTrue", new mdr.DFunction((ref mdr.CallFrame callFrame) => { int argsLen = callFrame.PassedArgsCount; if (argsLen > 0) { var b = Operations.Convert.ToBoolean.Run(ref callFrame.Arg0); assert(b, argsLen > 1 ? callFrame.Arg1.AsString() : null); } else Trace.Fail("Not enough arguments"); })); obj.SetField("assertFalse", new mdr.DFunction((ref mdr.CallFrame callFrame) => { int argsLen = callFrame.PassedArgsCount; if (argsLen > 0) { var b = Operations.Convert.ToBoolean.Run(ref callFrame.Arg0); assert(!b, argsLen > 1 ? callFrame.Arg1.AsString() : null); } else Trace.Fail("Not enough arguments"); })); obj.SetField("assertEquals", new mdr.DFunction((ref mdr.CallFrame callFrame) => { int argsLen = callFrame.PassedArgsCount; if (argsLen > 1) { bool b = Operations.Binary.Equal.Run(ref callFrame.Arg0, ref callFrame.Arg1); assert(b, argsLen > 2 ? callFrame.Arg2.AsString() : null); } else Trace.Fail("Not enough arguments"); })); obj.SetField("assertArrayEquals", new mdr.DFunction((ref mdr.CallFrame callFrame) => { int argsLen = callFrame.PassedArgsCount; if (argsLen > 1) { var arrayA = callFrame.Arg0.AsDArray(); var arrayB = callFrame.Arg1.AsDArray(); bool areEqual = true; if (arrayA != null && arrayB != null && arrayA.Length == arrayB.Length) { for (int i = 0; i < arrayA.Length; i++) if (Operations.Binary.Equal.Run(ref arrayA.Elements[i], ref arrayB.Elements[i])) { areEqual = false; break; } } else if (arrayA != arrayB) areEqual = false; assert(areEqual, argsLen > 2 ? callFrame.Arg2.AsString() : null); } else Trace.Fail("Not enough arguments"); })); #endregion // FIXME: The below causes an infinite recursion in CodeSourceGenerator. Commenting for now. - SF //SetField("global", this); //to enable access to global scope directly! obj.SetField("print", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var l = callFrame.PassedArgsCount; for (var i = 0; i < l; ++i) { var arg = callFrame.Arg(i); string s = ToString(ref arg); Console.Write("{0}{1}", s, (i < l - 1) ? " " : ""); } Console.WriteLine(); })); obj.SetField("load", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var l = callFrame.PassedArgsCount; if (l < 1) throw new Exception("load must have an argument"); var filename = callFrame.Arg0.AsString(); JSRuntime.Instance.RunScriptFile(filename); })); #region __mcjs__ object { var mcjs = new mdr.DObject(mdr.Runtime.Instance.EmptyPropertyMapMetadata.Root); obj.SetField("__mcjs__", mcjs); mcjs.SetField("SetSwitch", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var switchName = callFrame.Arg0.AsString(); var switchValue = Operations.Convert.ToBoolean.Run(ref callFrame.Arg1); var prop = typeof(JSRuntimeConfiguration).GetProperty(switchName, CodeGen.Types.ClrSys.Boolean); if (prop != null) prop.GetSetMethod().Invoke(JSRuntime.Instance.Configuration, new object[] { switchValue }); else Debug.WriteLine("JSRuntime.Instance.Configuration does not contain the switch '{0}'", switchName); })); mcjs.SetField("PrintDump", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var l = callFrame.PassedArgsCount; if (l != 1) throw new Exception("PrintDump must have one argument"); Debug.WriteLine("##JS: {0}", callFrame.Arg0.AsString()); #if DEBUG //Check for android log directory if (printOutFile == null) { printOutFile = System.IO.File.CreateText(System.IO.Path.Combine(JSRuntime.Instance.Configuration.OutputDir, "mcprint" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + ".out")); } printOutFile.Write("{0}", callFrame.Arg0.AsString()); printOutFile.Flush(); //Debug.WriteLine("MCPRINTVAR: {0}={1}", callFrame.Arg1.ToString(), s); #endif })); } #endregion }
internal static void Init(mdr.DObject obj) { obj.SetField("global", obj); //obj.SetField("null", mdr.Runtime.Instance.DefaultDNull); obj.DefineOwnProperty("undefined", mdr.Runtime.Instance.DefaultDUndefined, mdr.PropertyDescriptor.Attributes.Data | mdr.PropertyDescriptor.Attributes.NotWritable | mdr.PropertyDescriptor.Attributes.NotEnumerable | mdr.PropertyDescriptor.Attributes.NotConfigurable); obj.DefineOwnProperty("NaN", double.NaN, mdr.PropertyDescriptor.Attributes.Data | mdr.PropertyDescriptor.Attributes.NotWritable | mdr.PropertyDescriptor.Attributes.NotEnumerable | mdr.PropertyDescriptor.Attributes.NotConfigurable); obj.DefineOwnProperty("Infinity", double.PositiveInfinity, mdr.PropertyDescriptor.Attributes.Data | mdr.PropertyDescriptor.Attributes.NotWritable | mdr.PropertyDescriptor.Attributes.NotEnumerable | mdr.PropertyDescriptor.Attributes.NotConfigurable); obj.SetField("Object", new JSObject()); obj.SetField("Function", new JSFunction()); obj.SetField("Array", new JSArray()); obj.SetField("ArrayBuffer", new JSArrayBuffer()); obj.SetField("Int8Array", new JSInt8Array()); obj.SetField("Uint8Array", new JSUint8Array()); obj.SetField("Int16Array", new JSInt16Array()); obj.SetField("Uint16Array", new JSUint16Array()); obj.SetField("Int32Array", new JSInt32Array()); obj.SetField("Uint32Array", new JSUint32Array()); obj.SetField("Float32Array", new JSFloat32Array()); obj.SetField("Float64Array", new JSFloat64Array()); obj.SetField("Math", new JSMath()); obj.SetField("String", new JSString()); obj.SetField("Number", new JSNumber()); obj.SetField("Date", new JSDate()); obj.SetField("Boolean", new JSBoolean()); obj.SetField("Error", new JSError()); obj.SetField("RegExp", new JSRegExp()); obj.SetField("eval", BuiltinEval); AddStandardMethods(obj); AddExtendedMethods(obj); }
private static void AddExtendedMethods(mdr.DObject obj) { #region Mozilla intrinsics obj.SetField("assertTrue", new mdr.DFunction((ref mdr.CallFrame callFrame) => { int argsLen = callFrame.PassedArgsCount; if (argsLen > 0) { var b = Operations.Convert.ToBoolean.Run(ref callFrame.Arg0); assert(b, argsLen > 1 ? callFrame.Arg1.AsString() : null); } else { Trace.Fail("Not enough arguments"); } })); obj.SetField("assertFalse", new mdr.DFunction((ref mdr.CallFrame callFrame) => { int argsLen = callFrame.PassedArgsCount; if (argsLen > 0) { var b = Operations.Convert.ToBoolean.Run(ref callFrame.Arg0); assert(!b, argsLen > 1 ? callFrame.Arg1.AsString() : null); } else { Trace.Fail("Not enough arguments"); } })); obj.SetField("assertEquals", new mdr.DFunction((ref mdr.CallFrame callFrame) => { int argsLen = callFrame.PassedArgsCount; if (argsLen > 1) { bool b = Operations.Binary.Equal.Run(ref callFrame.Arg0, ref callFrame.Arg1); assert(b, argsLen > 2 ? callFrame.Arg2.AsString() : null); } else { Trace.Fail("Not enough arguments"); } })); obj.SetField("assertArrayEquals", new mdr.DFunction((ref mdr.CallFrame callFrame) => { int argsLen = callFrame.PassedArgsCount; if (argsLen > 1) { var arrayA = callFrame.Arg0.AsDArray(); var arrayB = callFrame.Arg1.AsDArray(); bool areEqual = true; if (arrayA != null && arrayB != null && arrayA.Length == arrayB.Length) { for (int i = 0; i < arrayA.Length; i++) { if (Operations.Binary.Equal.Run(ref arrayA.Elements[i], ref arrayB.Elements[i])) { areEqual = false; break; } } } else if (arrayA != arrayB) { areEqual = false; } assert(areEqual, argsLen > 2 ? callFrame.Arg2.AsString() : null); } else { Trace.Fail("Not enough arguments"); } })); #endregion // FIXME: The below causes an infinite recursion in CodeSourceGenerator. Commenting for now. - SF //SetField("global", this); //to enable access to global scope directly! obj.SetField("print", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var l = callFrame.PassedArgsCount; for (var i = 0; i < l; ++i) { var arg = callFrame.Arg(i); string s = ToString(ref arg); Console.Write("{0}{1}", s, (i < l - 1) ? " " : ""); } Console.WriteLine(); })); obj.SetField("load", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var l = callFrame.PassedArgsCount; if (l < 1) { throw new Exception("load must have an argument"); } var filename = callFrame.Arg0.AsString(); JSRuntime.Instance.RunScriptFile(filename); })); #region __mcjs__ object { var mcjs = new mdr.DObject(mdr.Runtime.Instance.EmptyPropertyMapMetadata.Root); obj.SetField("__mcjs__", mcjs); mcjs.SetField("SetSwitch", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var switchName = callFrame.Arg0.AsString(); var switchValue = Operations.Convert.ToBoolean.Run(ref callFrame.Arg1); var prop = typeof(JSRuntimeConfiguration).GetProperty(switchName, CodeGen.Types.ClrSys.Boolean); if (prop != null) { prop.GetSetMethod().Invoke(JSRuntime.Instance.Configuration, new object[] { switchValue }); } else { Debug.WriteLine("JSRuntime.Instance.Configuration does not contain the switch '{0}'", switchName); } })); mcjs.SetField("PrintDump", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var l = callFrame.PassedArgsCount; if (l != 1) { throw new Exception("PrintDump must have one argument"); } Debug.WriteLine("##JS: {0}", callFrame.Arg0.AsString()); #if DEBUG //Check for android log directory if (printOutFile == null) { printOutFile = System.IO.File.CreateText(System.IO.Path.Combine(JSRuntime.Instance.Configuration.OutputDir, "mcprint" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + ".out")); } printOutFile.Write("{0}", callFrame.Arg0.AsString()); printOutFile.Flush(); //Debug.WriteLine("MCPRINTVAR: {0}={1}", callFrame.Arg1.ToString(), s); #endif })); } #endregion }
// TODO: These are currently unused; can we remove them? /*private static char[] reservedEncoded = new char[] { ';', ',', '/', '?', ':', '@', '&', '=', '+', '$', '#' }; * private static char[] reservedEncodedComponent = new char[] { '-', '_', '.', '!', '~', '*', '\'', '(', ')', '[', ']' };*/ private static void AddStandardMethods(mdr.DObject obj) { obj.SetField("ToNumber", new mdr.DFunction((ref mdr.CallFrame callFrame) => { if (callFrame.PassedArgsCount > 0) { callFrame.Return.Set(Operations.Convert.ToDouble.Run(ref callFrame.Arg0)); } else { callFrame.Return.Set(double.NaN); } })); obj.SetField("isNaN", new mdr.DFunction((ref mdr.CallFrame callFrame) => { if (callFrame.PassedArgsCount > 0) { callFrame.Return.Set(double.IsNaN(Operations.Convert.ToDouble.Run(ref callFrame.Arg0))); } else { callFrame.Return.Set(false); } })); obj.SetField("isFinite", new mdr.DFunction((ref mdr.CallFrame callFrame) => { if (callFrame.PassedArgsCount > 0) { double arg = Operations.Convert.ToDouble.Run(ref callFrame.Arg0); callFrame.Return.Set(double.IsNaN(arg) || !double.IsInfinity(arg)); } else { callFrame.Return.Set(false); } })); obj.SetField("assert", new mdr.DFunction((ref mdr.CallFrame callFrame) => { for (int i = 0; i < callFrame.PassedArgsCount; ++i) { var b = Operations.Convert.ToBoolean.Run(ref callFrame.Arg0); if (!b) { throw new Exception("Error in script"); } } })); //ECMA-262: 15.1.2.2 obj.SetField("parseInt", new mdr.DFunction((ref mdr.CallFrame callFrame) => { if (callFrame.PassedArgsCount == 1 && mdr.ValueTypesHelper.IsNumber(callFrame.Arg0.ValueType)) { callFrame.Return.Set(Operations.Convert.ToInt32.Run(ref callFrame.Arg0)); } else { string stringArg = Operations.Convert.ToString.Run(ref callFrame.Arg0).TrimStart(); int sign = 1; if (stringArg[0] == '-' || stringArg[0] == '+') { if (stringArg[0] == '-') { sign = -1; } stringArg = stringArg.Remove(0, 1); } bool stripPrefix = true; int radix = 10; if (callFrame.PassedArgsCount > 1) { radix = Operations.Convert.ToInt32.Run(ref callFrame.Arg1); if (radix != 0) { if (radix < 2 || radix > 36) { callFrame.Return.Set(double.NaN); return; } if (radix != 16) { stripPrefix = false; } } else { radix = 10; } } if (stripPrefix && (stringArg.StartsWith("0x") || stringArg.StartsWith("0X"))) { stringArg = stringArg.Remove(0, 2); radix = 16; } callFrame.Return.Set(MathInt(stringArg, radix) * sign); } })); //ECMA-262: 15.1.2.3 obj.SetField("parseFloat", new mdr.DFunction((ref mdr.CallFrame callFrame) => { string stringArg = (Operations.Convert.ToString.Run(ref callFrame.Arg0)).TrimStart(); char[] charArg = stringArg.TrimEnd().ToCharArray(); int len = charArg.Length; if (len == 0) { callFrame.Return.Set(double.NaN); return; } if (len == 1) { if (char.IsDigit(charArg[0])) { callFrame.Return.Set((double)(charArg[0] - '0')); return; } } int i = 0; if (charArg[0] == '-' || charArg[0] == '+') { i = 1; } bool punctation = false; for (; i < charArg.Length; ++i) { if (!char.IsLetterOrDigit(charArg[i]) && charArg[i] != '.') { break; } if (charArg[i] == '-') { break; } if (punctation && charArg[i] == '.') { break; } if (charArg[i] == '.') { punctation = true; } } stringArg = stringArg.Substring(0, i); double value = 0; if (Double.TryParse(stringArg, out value)) { callFrame.Return.Set(value); return; } callFrame.Return.Set(double.NaN); })); //ECMA-262: 15.1.3.1 obj.SetField("decodeURI", new mdr.DFunction((ref mdr.CallFrame callFrame) => { Debug.WriteLine("Calling JSGlobalObject.decodeURI"); string uri = callFrame.Arg0.AsString(); callFrame.Return.Set(URIHandling.Decode(uri, URIHandling.uriReserved + "#")); })); //ECMA-262: 15.1.3.2 obj.SetField("decodeURIComponent", new mdr.DFunction((ref mdr.CallFrame callFrame) => { Debug.WriteLine("Calling JSGlobalObject.decodeURIComponent"); if (callFrame.PassedArgsCount < 1 || callFrame.Arg0.ValueType == mdr.ValueTypes.Undefined) { callFrame.Return.Set(""); return; } callFrame.Return.Set(URIHandling.Decode(callFrame.Arg0.AsString(), string.Empty)); })); //ECMA-262: 15.1.3.3 obj.SetField("encodeURI", new mdr.DFunction((ref mdr.CallFrame callFrame) => { Debug.WriteLine("Calling JSGlobalObject.encodeURI"); string uri = callFrame.Arg0.AsString(); callFrame.Return.Set(URIHandling.Encode(uri, URIHandling.UriUnescaped + URIHandling.uriReserved + "#")); })); //ECMA-262: 15.1.3.4 obj.SetField("encodeURIComponent", new mdr.DFunction((ref mdr.CallFrame callFrame) => { Debug.WriteLine("Calling JSGlobalObject.encodeURIComponent"); if (callFrame.PassedArgsCount < 1 || callFrame.Arg0.ValueType == mdr.ValueTypes.Undefined) { callFrame.Return.Set(""); return; } callFrame.Return.Set(URIHandling.Encode(callFrame.Arg0.AsString(), URIHandling.UriUnescaped)); })); obj.SetField("escape", new mdr.DFunction((ref mdr.CallFrame callFrame) => { Debug.WriteLine("Calling JSGlobalObject.escape"); if (callFrame.PassedArgsCount == 1) { string stringArg = callFrame.Arg0.AsString(); if (stringArg == null) { callFrame.Return.Set(""); } else { string escArg = URIHandling.Escape(stringArg); callFrame.Return.Set(escArg); } } else { callFrame.Return.Set(""); } })); obj.SetField("unescape", new mdr.DFunction((ref mdr.CallFrame callFrame) => { Debug.WriteLine("Calling JSGlobalObject.unescape"); string stringArg = callFrame.Arg0.AsString(); string unescArg = URIHandling.Unescape(stringArg); callFrame.Return.Set(unescArg); })); }
public static mdr.DObject GetPrototype(EventClasses eventClass) { mdr.DObject prototype = null; switch (eventClass) { case EventClasses.Event: { prototype = new mdr.DObject(); prototype.DefineOwnProperty("type", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set(ev.Data.Type.ToString().ToLower()); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("screenX", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set((int)ev.Data.screenX); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("screenY", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set((int)ev.Data.screenY); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("clientX", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set((int)ev.Data.clientX); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("clientY", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set((int)ev.Data.clientY); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("pageX", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set((int)ev.Data.pageX); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("pageY", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set((int)ev.Data.pageY); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("buttons", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set((int)ev.Data.buttons); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("button", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set((int)ev.Data.button); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("metaKey", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set(ev.Data.metaKey); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("ctrlKey", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set(ev.Data.ctrlKey); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("shiftKey", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set(ev.Data.shiftKey); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("altKey", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set(ev.Data.altKey); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("target", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set(ev.Target); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("currentTarget", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set(ev.CurrentTarget); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("eventPhase", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set((UInt32)ev.Phase); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("bubbles", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set(ev.Bubbles); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.DefineOwnProperty("cancelable", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set(ev.Cancelable); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); prototype.SetField("initEvent", new mdr.DFunction((ref mdr.CallFrame callFrame) => { string eventTypeString = callFrame.Arg0.AsString(); bool bubbles = mjr.Operations.Convert.ToBoolean.Run(ref callFrame.Arg1); bool cancelable = mjr.Operations.Convert.ToBoolean.Run(ref callFrame.Arg2); var ev = callFrame.This.FirstInPrototypeChainAs <JSEvent>(); EventTypes type; eventTypesToString.TryGetValue(eventTypeString, out type); ev.InitEvent(type, bubbles, cancelable); })); prototype.SetField("stopPropagation", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var ev = callFrame.This.FirstInPrototypeChainAs <JSEvent>(); ev.StopPropagation(); })); prototype.SetField("stopImmediatePropagation", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var ev = callFrame.This.FirstInPrototypeChainAs <JSEvent>(); ev.StopImmediatePropagation(); })); prototype.SetField("preventDefault", new mdr.DFunction((ref mdr.CallFrame callFrame) => { var ev = callFrame.This.FirstInPrototypeChainAs <JSEvent>(); ev.PreventDefault(); })); //Fill the rest ... break; } case EventClasses.UIEvent: { prototype = new mdr.DObject(HTMLRuntime.Instance.GetPropertyMapOfEventPrototype(EventClasses.Event)); /* * prototype.DefineOwnProperty("type", new mdr.DProperty() * { * OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => * { * var ev = This.FirstInPrototypeChainAs<JSEvent>(); * v.Set(ev.Data.Type.ToString()); * }, * }, mdr.PropertyDescriptor.Attributes.NotWritable); * */ prototype.SetField("initUIEvent", new mdr.DFunction((ref mdr.CallFrame callFrame) => { string eventTypeString = callFrame.Arg0.AsString(); bool bubbles = mjr.Operations.Convert.ToBoolean.Run(ref callFrame.Arg1); bool cancelable = mjr.Operations.Convert.ToBoolean.Run(ref callFrame.Arg2); // TODO: Variables 'view' and 'detail' are never used; remove? /*string view = callFrame.Arg3.ToString(); * int detail = -1; * if (callFrame.ArgsCount > 4) * { * detail = callFrame.Arguments[0].ToInt32(); * }*/ var ev = callFrame.This.FirstInPrototypeChainAs <JSEvent>(); EventTypes type; eventTypesToString.TryGetValue(eventTypeString, out type); ev.InitEvent(type, bubbles, cancelable); })); //Fill the rest ... break; } case EventClasses.MouseEvent: { prototype = new mdr.DObject(HTMLRuntime.Instance.GetPropertyMapOfEventPrototype(EventClasses.UIEvent)); prototype.DefineOwnProperty("type", new mdr.DProperty() { OnGetDValue = (mdr.DObject This, ref mdr.DValue v) => { var ev = This.FirstInPrototypeChainAs <JSEvent>(); v.Set(ev.Data.Type.ToString()); }, }, mdr.PropertyDescriptor.Attributes.NotWritable); //Fill the rest ... break; } default: Trace.Fail("Invalid event class type {0}", eventClass); break; } return(prototype); }
public static void CreateJson(int itemsCount, ref Stack stack) { //Debug.WriteLine("calling Exec.CreateJson"); var obj = new mdr.DObject(); var resultIndex = stack.Sp - itemsCount * 2; //TODO: here we know things are string, so just push their fieldIds and user then here! if (itemsCount > 0) { var sp = resultIndex; for (var i = itemsCount - 1; i >= 0; --i, sp += 2) obj.SetField(ref stack.Items[sp], ref stack.Items[sp + 1]); } stack.Items[resultIndex].Set(obj); stack.Sp = resultIndex + 1; ; }