private InterpretedFunction(InterpreterData idata, object staticSecurityDomain) { this.idata = idata; // Always get Context from the current thread to // avoid security breaches via passing mangled Context instances // with bogus SecurityController Context cx = Context.CurrentContext; SecurityController sc = cx.SecurityController; object dynamicDomain; if (sc != null) { dynamicDomain = sc.getDynamicSecurityDomain(staticSecurityDomain); } else { if (staticSecurityDomain != null) { throw new ArgumentException(); } dynamicDomain = null; } this.securityController = sc; this.securityDomain = dynamicDomain; }
/// <summary> Create script from compiled bytecode.</summary> internal static InterpretedFunction createScript(InterpreterData idata, object staticSecurityDomain) { InterpretedFunction f; f = new InterpretedFunction(idata, staticSecurityDomain); return(f); }
internal InterpreterData(InterpreterData parent) { this.parentData = parent; this.languageVersion = parent.languageVersion; this.itsSourceFile = parent.itsSourceFile; this.encodedSource = parent.encodedSource; Init(); }
internal InterpreterData(InterpreterData parent) { this.parentData = parent; this.languageVersion = parent.languageVersion; this.itsSourceFile = parent.itsSourceFile; this.encodedSource = parent.encodedSource; Init (); }
private InterpretedFunction(InterpreterData idata, object staticSecurityDomain) { this.idata = idata; // Always get Context from the current thread to // avoid security breaches via passing mangled Context instances // with bogus SecurityController Context cx = Context.CurrentContext; SecurityController sc = cx.SecurityController; object dynamicDomain; if (sc != null) { dynamicDomain = sc.getDynamicSecurityDomain (staticSecurityDomain); } else { if (staticSecurityDomain != null) { throw new ArgumentException (); } dynamicDomain = null; } this.securityController = sc; this.securityDomain = dynamicDomain; }
private InterpretedFunction(InterpretedFunction parent, int index) { this.idata = parent.idata.itsNestedFunctions [index]; this.securityController = parent.securityController; this.securityDomain = parent.securityDomain; }
/// <summary> Create function compiled from Function(...) constructor.</summary> internal static InterpretedFunction createFunction(Context cx, IScriptable scope, InterpreterData idata, object staticSecurityDomain) { InterpretedFunction f; f = new InterpretedFunction(idata, staticSecurityDomain); f.initInterpretedFunction(cx, scope); return(f); }
void generateNestedFunctions () { int functionCount = scriptOrFn.FunctionCount; if (functionCount == 0) return; InterpreterData [] array = new InterpreterData [functionCount]; for (int i = 0; i != functionCount; i++) { FunctionNode def = scriptOrFn.getFunctionNode (i); Interpreter jsi = new Interpreter (); jsi.compilerEnv = compilerEnv; jsi.scriptOrFn = def; jsi.itsData = new InterpreterData (itsData); jsi.generateFunctionICode (); array [i] = jsi.itsData; } itsData.itsNestedFunctions = array; }
public virtual object Compile (CompilerEnvirons compilerEnv, ScriptOrFnNode tree, string encodedSource, bool returnFunction) { this.compilerEnv = compilerEnv; new NodeTransformer ().transform (tree); if (Token.printTrees) { System.Console.Out.WriteLine (tree.toStringTree (tree)); } if (returnFunction) { tree = tree.getFunctionNode (0); } scriptOrFn = tree; itsData = new InterpreterData (compilerEnv.LanguageVersion, scriptOrFn.SourceName, encodedSource); itsData.topLevel = true; if (returnFunction) { generateFunctionICode (); } else { generateICodeFromTree (scriptOrFn); } return itsData; }
internal static string GetEncodedSource (InterpreterData idata) { if (idata.encodedSource == null) { return null; } return idata.encodedSource.Substring (idata.encodedSourceStart, (idata.encodedSourceEnd) - (idata.encodedSourceStart)); }
internal static int [] getLineNumbers (InterpreterData data) { UintMap presentLines = new UintMap (); sbyte [] iCode = data.itsICode; int iCodeLength = iCode.Length; for (int pc = 0; pc != iCodeLength; ) { int bytecode = iCode [pc]; int span = bytecodeSpan (bytecode); if (bytecode == Icode_LINE) { if (span != 3) Context.CodeBug (); int line = GetIndex (iCode, pc + 1); presentLines.put (line, 0); } pc += span; } return presentLines.Keys; }
static void dumpICode (InterpreterData idata) { if (!Token.printICode) { return; } sbyte [] iCode = idata.itsICode; int iCodeLength = iCode.Length; string [] strings = idata.itsStringTable; System.IO.TextWriter sw = Console.Out; sw.WriteLine ("ICode dump, for " + idata.itsName + ", length = " + iCodeLength); sw.WriteLine ("MaxStack = " + idata.itsMaxStack); int indexReg = 0; for (int pc = 0; pc < iCodeLength; ) { sw.Flush (); sw.Write (" [" + pc + "] "); int token = iCode [pc]; int icodeLength = bytecodeSpan (token); string tname = bytecodeName (token); int old_pc = pc; ++pc; switch (token) { default: if (icodeLength != 1) Context.CodeBug (); sw.WriteLine (tname); break; case Icode_GOSUB: case Token.GOTO: case Token.IFEQ: case Token.IFNE: case Icode_IFEQ_POP: case Icode_LEAVEDQ: { int newPC = pc + GetShort (iCode, pc) - 1; sw.WriteLine (tname + " " + newPC); pc += 2; break; } case Icode_VAR_INC_DEC: case Icode_NAME_INC_DEC: case Icode_PROP_INC_DEC: case Icode_ELEM_INC_DEC: case Icode_REF_INC_DEC: { int incrDecrType = iCode [pc]; sw.WriteLine (tname + " " + incrDecrType); ++pc; break; } case Icode_CALLSPECIAL: { int callType = iCode [pc] & 0xFF; bool isNew = (iCode [pc + 1] != 0); int line = GetIndex (iCode, pc + 2); sw.WriteLine (tname + " " + callType + " " + isNew + " " + indexReg + " " + line); pc += 4; break; } case Token.CATCH_SCOPE: { bool afterFisrtFlag = (iCode [pc] != 0); sw.WriteLine (tname + " " + afterFisrtFlag); ++pc; } break; case Token.REGEXP: sw.WriteLine (tname + " " + idata.itsRegExpLiterals [indexReg]); break; case Token.OBJECTLIT: case Icode_SPARE_ARRAYLIT: sw.WriteLine (tname + " " + idata.literalIds [indexReg]); break; case Icode_CLOSURE_EXPR: case Icode_CLOSURE_STMT: sw.WriteLine (tname + " " + idata.itsNestedFunctions [indexReg]); break; case Token.CALL: case Icode_TAIL_CALL: case Token.REF_CALL: case Token.NEW: sw.WriteLine (tname + ' ' + indexReg); break; case Token.THROW: { int line = GetIndex (iCode, pc); sw.WriteLine (tname + " : " + line); pc += 2; break; } case Icode_SHORTNUMBER: { int value = GetShort (iCode, pc); sw.WriteLine (tname + " " + value); pc += 2; break; } case Icode_INTNUMBER: { int value = GetInt (iCode, pc); sw.WriteLine (tname + " " + value); pc += 4; break; } case Token.NUMBER: { double value = idata.itsDoubleTable [indexReg]; sw.WriteLine (tname + " " + value); pc += 2; break; } case Icode_LINE: { int line = GetIndex (iCode, pc); sw.WriteLine (tname + " : " + line); pc += 2; break; } case Icode_REG_STR1: { string str = strings [0xFF & iCode [pc]]; sw.WriteLine (tname + " \"" + str + '"'); ++pc; break; } case Icode_REG_STR2: { string str = strings [GetIndex (iCode, pc)]; sw.WriteLine (tname + " \"" + str + '"'); pc += 2; break; } case Icode_REG_STR4: { string str = strings [GetInt (iCode, pc)]; sw.WriteLine (tname + " \"" + str + '"'); pc += 4; break; } case Icode_REG_IND1: { indexReg = 0xFF & iCode [pc]; sw.WriteLine (tname + " " + indexReg); ++pc; break; } case Icode_REG_IND2: { indexReg = GetIndex (iCode, pc); sw.WriteLine (tname + " " + indexReg); pc += 2; break; } case Icode_REG_IND4: { indexReg = GetInt (iCode, pc); sw.WriteLine (tname + " " + indexReg); pc += 4; break; } case Icode_GETVAR1: case Icode_SETVAR1: indexReg = iCode [pc]; sw.WriteLine (tname + " " + indexReg); ++pc; break; } if (old_pc + icodeLength != pc) Context.CodeBug (); } int [] table = idata.itsExceptionTable; if (table != null) { sw.WriteLine ("Exception handlers: " + table.Length / EXCEPTION_SLOT_SIZE); for (int i = 0; i != table.Length; i += EXCEPTION_SLOT_SIZE) { int tryStart = table [i + EXCEPTION_TRY_START_SLOT]; int tryEnd = table [i + EXCEPTION_TRY_END_SLOT]; int handlerStart = table [i + EXCEPTION_HANDLER_SLOT]; int type = table [i + EXCEPTION_TYPE_SLOT]; int exceptionLocal = table [i + EXCEPTION_LOCAL_SLOT]; int scopeLocal = table [i + EXCEPTION_SCOPE_SLOT]; sw.WriteLine (" tryStart=" + tryStart + " tryEnd=" + tryEnd + " handlerStart=" + handlerStart + " type=" + (type == 0 ? "catch" : "finally") + " exceptionLocal=" + exceptionLocal); } } sw.Flush (); }
/// <summary> Create script from compiled bytecode.</summary> internal static InterpretedFunction createScript(InterpreterData idata, object staticSecurityDomain) { InterpretedFunction f; f = new InterpretedFunction (idata, staticSecurityDomain); return f; }
/// <summary> Create function compiled from Function(...) constructor.</summary> internal static InterpretedFunction createFunction(Context cx, IScriptable scope, InterpreterData idata, object staticSecurityDomain) { InterpretedFunction f; f = new InterpretedFunction (idata, staticSecurityDomain); f.initInterpretedFunction (cx, scope); return f; }