blob: 806a3893d8a147c1daf6fae9ad14fc872e18f53f [file] [log] [blame]
/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
/*
* SpiderMonkey host environment
*/
dojo.hostenv.name_ = 'spidermonkey';
dojo.hostenv.println = print;
dojo.hostenv.exit = function(exitcode){
quit(exitcode);
}
// version() returns 0, sigh. and build() returns nothing but just prints.
dojo.hostenv.getVersion = function(){ return version(); }
// make jsc shut up (so we can use jsc for sanity checking)
/*@cc_on
@if (@_jscript_version >= 7)
var line2pc; var print; var load; var quit;
@end
@*/
if(typeof line2pc == 'undefined'){
dojo.raise("attempt to use SpiderMonkey host environment when no 'line2pc' global");
}
/*
* This is a hack that determines the current script file by parsing a generated
* stack trace (relying on the non-standard "stack" member variable of the
* SpiderMonkey Error object).
* If param depth is passed in, it'll return the script file which is that far down
* the stack, but that does require that you know how deep your stack is when you are
* calling.
*/
function dj_spidermonkey_current_file(depth){
var s = '';
try{
throw Error("whatever");
}catch(e){
s = e.stack;
}
// lines are like: bu_getCurrentScriptURI_spidermonkey("ScriptLoader.js")@burst/Runtime.js:101
var matches = s.match(/[^@]*\.js/gi);
if(!matches){
dojo.raise("could not parse stack string: '" + s + "'");
}
var fname = (typeof depth != 'undefined' && depth) ? matches[depth + 1] : matches[matches.length - 1];
if(!fname){
dojo.raise("could not find file name in stack string '" + s + "'");
}
//print("SpiderMonkeyRuntime got fname '" + fname + "' from stack string '" + s + "'");
return fname;
}
// call this now because later we may not be on the top of the stack
if(!dojo.hostenv.library_script_uri_){
dojo.hostenv.library_script_uri_ = dj_spidermonkey_current_file(0);
}
dojo.hostenv.loadUri = function(uri){
// spidermonkey load() evaluates the contents into the global scope (which
// is what we want).
// TODO: sigh, load() does not return a useful value.
// Perhaps it is returning the value of the last thing evaluated?
var ok = load(uri);
// dojo.debug("spidermonkey load(", uri, ") returned ", ok);
return 1;
}