// $Id$ /* * WorldEdit * Copyright (C) 2010 sk89q * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.sk89q.worldedit.scripting; import org.mozilla.javascript.*; public class RhinoContextFactory extends ContextFactory { protected int timeLimit; public RhinoContextFactory(int timeLimit) { this.timeLimit = timeLimit; } protected Context makeContext() { RhinoContext cx = new RhinoContext(this); cx.setInstructionObserverThreshold(10000); return cx; } protected void observeInstructionCount(Context cx, int instructionCount) { RhinoContext mcx = (RhinoContext)cx; long currentTime = System.currentTimeMillis(); if (currentTime - mcx.startTime > timeLimit) { throw new Error("Script timed out (" + timeLimit + "ms)"); } } protected Object doTopCall(Callable callable, Context cx, Scriptable scope, Scriptable thisObj, Object[] args) { RhinoContext mcx = (RhinoContext)cx; mcx.startTime = System.currentTimeMillis(); return super.doTopCall(callable, cx, scope, thisObj, args); } private static class RhinoContext extends Context { long startTime; public RhinoContext(ContextFactory factory) { super(factory); } } }