private static object JsConstructor(Context cx, IScriptable scope, object [] args) { int arglen = args.Length; System.Text.StringBuilder sourceBuf = new System.Text.StringBuilder(); sourceBuf.Append("function "); /* version != 1.2 Function constructor behavior - * print 'anonymous' as the function name if the * version (under which the function was compiled) is * less than 1.2... or if it's greater than 1.2, because * we need to be closer to ECMA. */ if (cx.Version != Context.Versions.JS1_2) { sourceBuf.Append("anonymous"); } sourceBuf.Append('('); // Append arguments as coma separated strings for (int i = 0; i < arglen - 1; i++) { if (i > 0) { sourceBuf.Append(','); } sourceBuf.Append(ScriptConvert.ToString(args [i])); } sourceBuf.Append(") {"); if (arglen != 0) { // append function body string funBody = ScriptConvert.ToString(args [arglen - 1]); sourceBuf.Append(funBody); } sourceBuf.Append('}'); string source = sourceBuf.ToString(); int [] linep = new int [1]; string filename = Context.GetSourcePositionFromStack(linep); if (filename == null) { filename = "<eval'ed string>"; linep [0] = 1; } string sourceURI = ScriptRuntime.makeUrlForGeneratedScript(false, filename, linep [0]); IScriptable global = ScriptableObject.GetTopLevelScope(scope); ErrorReporter reporter; reporter = DefaultErrorReporter.ForEval(cx.ErrorReporter); // Compile with explicit interpreter instance to force interpreter // mode. return(cx.CompileFunction(global, source, new Interpreter(), reporter, sourceURI, 1, (object)null)); }
private static int PrintSourceNumber(string source, int offset, System.Text.StringBuilder sb) { double number = 0.0; char type = source [offset]; ++offset; if (type == 'S') { if (sb != null) { int ival = source [offset]; number = ival; } ++offset; } else if (type == 'J' || type == 'D') { if (sb != null) { long lbits; lbits = (long)source [offset] << 48; lbits |= (long)source [offset + 1] << 32; lbits |= (long)source [offset + 2] << 16; lbits |= (long)source [offset + 3]; if (type == 'J') { number = lbits; } else { number = BitConverter.Int64BitsToDouble(lbits); } } offset += 4; } else { // Bad source throw new ApplicationException(); } if (sb != null) { sb.Append(ScriptConvert.ToString(number, 10)); } return(offset); }