var fsm = {"decompose":{"":[],"FORMATIONCONTROLLER":["FORMATIONCONTROLLER"]},"states":{"":{"_name":"","_parent":"","_refs":{"FORMATIONCONTROLLER":"FORMATIONCONTROLLER","FORMATIONMEMBER":"FORMATIONMEMBER","INDIVIDUAL":"INDIVIDUAL","ANIMAL":"ANIMAL"}}}}; var node = {"IDLE":{},"WALKING":{},"WALKINGANDFIGHTING":{},"FORMING":{},"MEMBER":{}}; var paths = ["FORMATIONCONTROLLER"]; var handlers = {}; function process(fsm, node, path, handlers, rval) { // Handle string references to nodes defined elsewhere in the FSM spec var quit = false; if (typeof node === "string") { var refpath = node.split("."); var refd = spec; for each (var p in refpath) { refd = refd[p]; if (!refd) { error("FSM node "+path.join(".")+" referred to non-defined node "+node); rval = {}; quit = true; } } node = refd; } if (!quit) { var state = {}; fsm.states[path.join(".")] = state; var newhandlers = {}; for (var e in handlers) newhandlers[e] = handlers[e]; state._name = path.join("."); state._parent = path.slice(0, -1).join("."); state._refs = {}; for (var key in node) { if (key === "enter" || key === "leave") { state[key] = node[key]; } else if (key.match(/^[A-Z]+$/)) { state._refs[key] = (state._name ? state._name + "." : "") + key; // (the rest of this will be handled later once we've grabbed // all the event handlers) } else { newhandlers[key] = node[key]; } } for (var e in newhandlers) state[e] = newhandlers[e]; for (var key in node) { if (key.match(/^[A-Z]+$/)) { var newpath = path.concat([key]); var decomposed = [newpath[0]]; for (var i = 1; i < newpath.length; ++i) decomposed.push(decomposed[i-1] + "." + newpath[i]); fsm.decompose[newpath.join(".")] = decomposed; var childstate = {}; process(fsm, node[key], newpath, newhandlers, childstate); for (var r in childstate._refs) { var cname = key + "." + r; state._refs[cname] = childstate._refs[r]; } } } rval = state; } } var startTime = elapsed(); for (var i=0; i<20000; i++) { //process(this, spec, [], {}); var rval = {}; process(fsm, node, paths, handlers,rval); print("rval: " + rval); } var endTime = elapsed(); var timeElapsed = endTime - startTime; print("time: " + timeElapsed); /* function setrval(i, node) { if (typeof node === "string") { if (i%77 == 0) { if (i%154 == 0) { var ret = setrval(i+41, node); return ret; } return {}; } else return [1,3,6,7,43]; } else return 33; } var obj; for (var i=0; i<2000; i++) { var node; if (i%65 == 0) node = "a string"; else node = 42; obj = setrval(i, node); print("obj: "+ obj); } */