// the internal primitive mechanism primitive = new Primitives(); // core definitions needed to make anything work, even what follows Object = primitive("NewObject"); var local_function = primitive("NewFunction"); Function = local_function; var local_array = primitive("NewArray"); Array = local_array; var local_string = primitive("NewString"); String = local_string; var local_number = primitive("NewNumber"); Number = local_number; var local_regexp = primitive("NewRegExp"); RegExp = local_regexp; /************************************************************************/ /* Global properties, see spec 15.1 */ /************************************************************************/ NaN = primitive("GlobalNaN"); Infinity = primitive("GlobalInfinity"); undefined = primitive("NewUndefined"); $$undefined = undefined; eval = function eval (x) { return primitive("GlobalEval", x); }; parseInt = function parseInt (string, radix) { return primitive("GlobalParseInt", string, radix); }; parseFloat = function parseFloat (string) { return primitive("GlobalParseFloat", string); }; isNaN = function isNaN (number) { return primitive("GlobalIsNaN", number) }; isFinite = function isFinite (number) { return primitive("GlobalIsFinite", number); }; decodeURI = function decodeURI(str) { return new String(primitive("GlobalDecodeURI", str)); }; decodeURIComponent = function decodeURIComponent(str) { return new String(primitive("GlobalDecodeURIComponent", str)); }; encodeURI = function encodeURI(str) { return new String(primitive("GlobalEncodeURI", str)); }; encodeURIComponent = function encodeURIComponent(str) { return new String(primitive("GlobalEncodeURIComponent", str)); }; unescape = function unescape(str){ return new String(primitive("GlobalUnEscape", str)); }; escape = function escape(str){ return new String(primitive("GlobalEscape", str)); }; /************************************************************************/ /* Object properties, see spec 15.2 */ /************************************************************************/ Object$proto$__WALA__ = { prototype: null, __proto__: null, constructor: Object, toString: function Object_prototype_toString() { return primitive("ObjectToString", this); }, toLocaleString: function Object_prototype_toLocaleString() { return primitive("ObjectToLocaleString", this); }, valueOf: function valueOf() { return this }, hasOwnProperty: function Object_prototype_hasOwnProperty (V) { return primitive("ObjectHasOwnProperty", this, V); }, isPrototypeOf: function Object_prototype_isPrototypeOf (V) { return primitive("ObjectIsPrototypeOf", this, V); }, propertyIsEnumerable: function Object_prototype_propertyIsEnumerable (V) { return primitive("ObjectPropertyIsEnumerable", this, V); } }; Object.prototype = Object$proto$__WALA__; /************************************************************************/ /* Function properties, see spec 15.3 */ /************************************************************************/ Function$proto$__WALA__ = { constructor: Function, __proto__: Object.prototype, toString: function Function_prototype_toString() { return primitive("FunctionToString", this); }, apply: function Function_prototype_apply (thisArg, argArray) { return primitive("FunctionApply", this, thisArg, argArray); }, call: function Function_prototype_call (thisArg) { arguments.shift(); return primitive("FunctionCall", this, thisArg, arguments); }, bind: function Function_prototype_bind (thisArg) { arguments.shift(); return primitive("FunctionBind", this, thisArg, arguments); } }; local_function.prototype = Function$proto$__WALA__; local_function.__proto__ = Function.prototype; /************************************************************************/ /* Array properties, see spec 15.4 */ /************************************************************************/ local_array.__proto__ = Function.prototype; Array$proto$__WALA__ = { __proto__: Object.prototype, constructor: Array, toString: function Array_prototype_toString () { return this.join(","); }, toLocaleString: function Array_prototype_toLocaleString () { var result = ""; var limit = this.length; for(var k = 0; k < limit; k++) { result = result.concat( this[k].toLocaleString() ); result = result.concat( "," ); } return result; }, concat: function Array_prototype_concat () { var result = new Array(); var n = 0; for(var i = 0; i < this.length; i++) result[n++] = this[i]; for(i = 0; i < arguments.length; i++) for(var j = 0; j < arguments[i].length; j++) result[n++] = arguments[i][j]; result.length = n; return result; }, join: function Array_prototype_join (separator) { var result = ""; var limit = this.length; for(var k = 0; k < limit; k++) { result = result.concat( this[k].toString() ); result = result.concat( separator ); } return result; }, pop: function Array_prototype_pop () { var n0 = this.length; if (n0) { var n1 = this[n0-1]; this.length = n0-1; // needed for non-arrays delete this[n0-1]; return n1; } else { // needed for non-arrays this.length = 0; } }, push: function Array_prototype_push () { var n = this.length; // nasty hack for field-sensitive builders // TODO: fix this somehow if (n == 0) { this[0] = arguments[0]; } for(var i = 0; i < arguments.length; i++) { this[ n++ ] = arguments[i]; } this.length = n; return n; }, reverse: function Array_prototype_reverse () { var n = this.length; for (var k = 0; k < (n/2); k++) { var tmp = this[k]; this[k] = this[n-k]; this[n-k] = tmp; } return this; }, shift: function Array_prototype_shift () { var result = this[ 0 ]; for(var i = 0; i < this.length-1; i++) this[i] = this[i+1]; this.length--; return result; }, unshift: function Array_prototype_unshift () { var n = arguments.length; for(var i=this.length+n-1;i>=n;--i) this[i] = this[i-n]; for(;i>=0;--i) this[i] = arguments[i]; this.length += n; return this.length; }, slice: function Array_prototype_slice (start, end) { var j = 0; if (start < 0) start = this.length + start; if (end < 0) end = this.length + end; var result = new Array(); for(var i = start; i < end; i++) result[j++] = this[i]; result.length = j; return result; }, sort: function Array_prototype_sort (fn) { for(var l = 0; i < this.length; l++) { var mindex = l; for(var i = l; i < this.length; i++) { if (fn(this[mindex], this[i]) < 0) { mindex = i; } } if (mindex != l) { var tmp = this[l]; this[l] = this[mindex]; this[mindex] = this[l]; } } }, splice: function Array_prototype_splice(start, delete_count) { var old_len = arguments.length, new_count = arguments.length - 2; new_len = old_len - deleteCount + new_count; var deleted = this.slice(start, start + delete_count), remainder = this.slice(start + delete_count, old_len); for(var i=start;i i) i = arguments[j]; return i; }, min: function Math_min () { var i = Infinity; for(var j = 0; j < arguments.length; j++) if (arguments[j] < i) i = arguments[j]; return i; }, pow: function Math_pow (x, y) { return primitive("MathPow", x, y); }, random: function Math_random() { return primitive("MathRandom"); }, round: function Math_round (x) { return primitive("MathRound", x); }, sin: function Math_sin (x) { return primitive("MathSin", x); }, sqrt: function Math_sqrt (x) { return primitive("MathSqrt", x);}, tan: function Math_tan (x) { return primitive("MathTan", x); } }; /************************************************************************/ /* RegExp properties, see spec 15.10 */ /************************************************************************/ local_regexp.__proto__ = Function.prototype; RegExp$proto$__WALA__ = { __proto__: Object.prototype, constructor: RegExp, exec: function RegExp_prototype_exec(string) { return [ string, string, string, string, string ] || null; }, test: function RegExp_prototype_test(string) { return true || false; } }; local_regexp.prototype = RegExp$proto$__WALA__; /************************************************************************/ /* Date properties, see spec 15.9 */ /************************************************************************/ Date = function Date() {}; Data$proto$__WALA__ = { __proto__: Object.prototype, constructor: Date, getTime: function Date_prototype_getTime() { return primitive("DateGetTime", this); }, getDate: function Date_prototype_getDate() { // TODO: model me }, setDate: function Date_prototype_setDate() { // TODO: model me }, getDay: function Date_prototype_getDay() { // TODO: model me }, setDay: function Date_prototype_setDay() { // TODO: model me }, getMonth: function Date_prototype_getMonth() { // TODO: model me }, setMonth: function Date_prototype_setMonth() { // TODO: model me }, getHours: function Date_prototype_getHours() { // TODO: model me }, setHours: function Date_prototype_setHours() { // TODO: model me }, getMinutes: function Date_prototype_getMinutes() { // TODO: model me }, setMinutes: function Date_prototype_setMinutes() { // TODO: model me }, getSeconds: function Date_prototype_getSeconds() { // TODO: model me }, setSeconds: function Date_prototype_setSeconds() { // TODO: model me }, getMilliseconds: function Date_prototype_getMilliseconds() { // TODO: model me }, setMilliseconds: function Date_prototype_setMilliseconds() { // TODO: model me }, getFullYear: function Date_prototype_getFullYear() { // TODO: model me } }; Date.now = function Date_now() { return new Date().valueOf(); }; Date.prototype = Data$proto$__WALA__; /************************************************************************/ /* internal stuff /************************************************************************/ function Error(str) { this.message = new String(); } function EvalError(str) { this.message = new String(); }