From b0eb920fe27517722f4b5888a37713f95168fd43 Mon Sep 17 00:00:00 2001 From: yangguo Date: Tue, 5 May 2015 02:15:56 -0700 Subject: [PATCH] Reland #2 "Wrap v8natives.js into a function." TBR=machenbach@chromium.org Review URL: https://codereview.chromium.org/1127693006 Cr-Commit-Position: refs/heads/master@{#28217} --- src/api.cc | 2 +- src/array-iterator.js | 6 +- src/array.js | 20 +- src/arraybuffer.js | 6 +- src/bootstrapper.cc | 4 +- src/collection-iterator.js | 12 +- src/collection.js | 16 +- src/date.js | 4 +- src/generator.js | 6 +- src/harmony-array-includes.js | 2 +- src/harmony-array.js | 12 +- src/harmony-reflect.js | 2 +- src/harmony-tostring.js | 2 +- src/harmony-typedarray.js | 13 +- src/i18n.js | 121 ++++++------ src/json.js | 8 +- src/macros.py | 2 +- src/math.js | 4 +- src/messages.js | 38 ++-- src/mirror-debugger.js | 2 +- src/object-observe.js | 18 +- src/promise.js | 4 +- src/proxy.js | 4 +- src/regexp.js | 2 +- src/string-iterator.js | 6 +- src/string.js | 4 +- src/symbol.js | 10 +- src/third_party/fdlibm/fdlibm.js | 2 +- src/typedarray.js | 68 ++++--- src/uri.js | 2 +- src/v8natives.js | 379 ++++++++++++++++++++----------------- src/weak-collection.js | 4 +- test/mjsunit/compiler/jsnatives.js | 4 +- tools/jsmin.py | 18 +- 34 files changed, 435 insertions(+), 372 deletions(-) diff --git a/src/api.cc b/src/api.cc index 46b8a52..9986df8 100644 --- a/src/api.cc +++ b/src/api.cc @@ -3589,7 +3589,7 @@ MaybeLocal v8::Object::GetOwnPropertyDescriptor(Local context, i::Handle args[] = { obj, key_name }; i::Handle result; has_pending_exception = - !CallV8HeapFunction(isolate, "ObjectGetOwnPropertyDescriptor", + !CallV8HeapFunction(isolate, "$objectGetOwnPropertyDescriptor", isolate->factory()->undefined_value(), arraysize(args), args).ToHandle(&result); RETURN_ON_FAILED_EXECUTION(Value); diff --git a/src/array-iterator.js b/src/array-iterator.js index 0c7cda3..45a432e 100644 --- a/src/array-iterator.js +++ b/src/array-iterator.js @@ -125,16 +125,16 @@ function ArrayKeys() { %FunctionSetPrototype(ArrayIterator, new GlobalObject()); %FunctionSetInstanceClassName(ArrayIterator, 'Array Iterator'); -InstallFunctions(ArrayIterator.prototype, DONT_ENUM, [ +$installFunctions(ArrayIterator.prototype, DONT_ENUM, [ 'next', ArrayIteratorNext ]); -SetFunctionName(ArrayIteratorIterator, symbolIterator); +$setFunctionName(ArrayIteratorIterator, symbolIterator); %AddNamedProperty(ArrayIterator.prototype, symbolIterator, ArrayIteratorIterator, DONT_ENUM); %AddNamedProperty(ArrayIterator.prototype, symbolToStringTag, "Array Iterator", READ_ONLY | DONT_ENUM); -InstallFunctions(GlobalArray.prototype, DONT_ENUM, [ +$installFunctions(GlobalArray.prototype, DONT_ENUM, [ // No 'values' since it breaks webcompat: http://crbug.com/409858 'entries', ArrayEntries, 'keys', ArrayKeys diff --git a/src/array.js b/src/array.js index db364be..201691a 100644 --- a/src/array.js +++ b/src/array.js @@ -372,7 +372,7 @@ function ArrayToString() { func = array.join; } if (!IS_SPEC_FUNCTION(func)) { - return %_CallFunction(array, ObjectToString); + return %_CallFunction(array, $objectToString); } return %_CallFunction(array, func); } @@ -447,7 +447,7 @@ function ArrayPop() { n--; var value = array[n]; - Delete(array, ToName(n), true); + $delete(array, ToName(n), true); array.length = n; return value; } @@ -620,7 +620,7 @@ function ArrayShift() { return; } - if (ObjectIsSealed(array)) throw MakeTypeError(kArrayFunctionsOnSealed); + if ($objectIsSealed(array)) throw MakeTypeError(kArrayFunctionsOnSealed); if (%IsObserved(array)) return ObservedArrayShift.call(array, len); @@ -671,7 +671,7 @@ function ArrayUnshift(arg1) { // length == 1 var num_arguments = %_ArgumentsLength(); if (len > 0 && UseSparseVariant(array, len, IS_ARRAY(array), len) && - !ObjectIsSealed(array)) { + !$objectIsSealed(array)) { SparseMove(array, 0, 0, len, num_arguments); } else { SimpleMove(array, 0, 0, len, num_arguments); @@ -817,9 +817,9 @@ function ArraySplice(start, delete_count) { deleted_elements.length = del_count; var num_elements_to_add = num_arguments > 2 ? num_arguments - 2 : 0; - if (del_count != num_elements_to_add && ObjectIsSealed(array)) { + if (del_count != num_elements_to_add && $objectIsSealed(array)) { throw MakeTypeError(kArrayFunctionsOnSealed); - } else if (del_count > 0 && ObjectIsFrozen(array)) { + } else if (del_count > 0 && $objectIsFrozen(array)) { throw MakeTypeError(kArrayFunctionsOnFrozen); } @@ -1523,7 +1523,7 @@ var unscopables = { DONT_ENUM | READ_ONLY); // Set up non-enumerable functions on the Array object. -InstallFunctions(GlobalArray, DONT_ENUM, [ +$installFunctions(GlobalArray, DONT_ENUM, [ "isArray", ArrayIsArray ]); @@ -1544,7 +1544,7 @@ var getFunction = function(name, jsBuiltin, len) { // set their names. // Manipulate the length of some of the functions to meet // expectations set by ECMA-262 or Mozilla. -InstallFunctions(GlobalArray.prototype, DONT_ENUM, [ +$installFunctions(GlobalArray.prototype, DONT_ENUM, [ "toString", getFunction("toString", ArrayToString), "toLocaleString", getFunction("toLocaleString", ArrayToLocaleString), "join", getFunction("join", ArrayJoin), @@ -1573,7 +1573,7 @@ InstallFunctions(GlobalArray.prototype, DONT_ENUM, [ // The internal Array prototype doesn't need to be fancy, since it's never // exposed to user code. // Adding only the functions that are actually used. -SetUpLockedPrototype(InternalArray, GlobalArray(), [ +$setUpLockedPrototype(InternalArray, GlobalArray(), [ "concat", getFunction("concat", ArrayConcatJS), "indexOf", getFunction("indexOf", ArrayIndexOf), "join", getFunction("join", ArrayJoin), @@ -1583,7 +1583,7 @@ SetUpLockedPrototype(InternalArray, GlobalArray(), [ "splice", getFunction("splice", ArraySplice) ]); -SetUpLockedPrototype(InternalPackedArray, GlobalArray(), [ +$setUpLockedPrototype(InternalPackedArray, GlobalArray(), [ "join", getFunction("join", ArrayJoin), "pop", getFunction("pop", ArrayPop), "push", getFunction("push", ArrayPush), diff --git a/src/arraybuffer.js b/src/arraybuffer.js index bfd8693..78f3102 100644 --- a/src/arraybuffer.js +++ b/src/arraybuffer.js @@ -83,13 +83,13 @@ function ArrayBufferIsViewJS(obj) { %AddNamedProperty(GlobalArrayBuffer.prototype, symbolToStringTag, "ArrayBuffer", DONT_ENUM | READ_ONLY); -InstallGetter(GlobalArrayBuffer.prototype, "byteLength", ArrayBufferGetByteLen); +$installGetter(GlobalArrayBuffer.prototype, "byteLength", ArrayBufferGetByteLen); -InstallFunctions(GlobalArrayBuffer, DONT_ENUM, [ +$installFunctions(GlobalArrayBuffer, DONT_ENUM, [ "isView", ArrayBufferIsViewJS ]); -InstallFunctions(GlobalArrayBuffer.prototype, DONT_ENUM, [ +$installFunctions(GlobalArrayBuffer.prototype, DONT_ENUM, [ "slice", ArrayBufferSlice ]); diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc index 01c2b6d..23ffc86 100644 --- a/src/bootstrapper.cc +++ b/src/bootstrapper.cc @@ -1573,9 +1573,9 @@ void Genesis::InstallNativeFunctions() { INSTALL_NATIVE(JSFunction, "ToInt32", to_int32_fun); INSTALL_NATIVE(JSFunction, "ToLength", to_length_fun); - INSTALL_NATIVE(JSFunction, "GlobalEval", global_eval_fun); + INSTALL_NATIVE(JSFunction, "$globalEval", global_eval_fun); INSTALL_NATIVE(JSFunction, "$getStackTraceLine", get_stack_trace_line_fun); - INSTALL_NATIVE(JSFunction, "ToCompletePropertyDescriptor", + INSTALL_NATIVE(JSFunction, "$toCompletePropertyDescriptor", to_complete_property_descriptor); INSTALL_NATIVE(Symbol, "$promiseStatus", promise_status); diff --git a/src/collection-iterator.js b/src/collection-iterator.js index d2e0af9..464703c 100644 --- a/src/collection-iterator.js +++ b/src/collection-iterator.js @@ -76,17 +76,17 @@ function SetValues() { %SetCode(SetIterator, SetIteratorConstructor); %FunctionSetPrototype(SetIterator, new GlobalObject()); %FunctionSetInstanceClassName(SetIterator, 'Set Iterator'); -InstallFunctions(SetIterator.prototype, DONT_ENUM, [ +$installFunctions(SetIterator.prototype, DONT_ENUM, [ 'next', SetIteratorNextJS ]); -SetFunctionName(SetIteratorSymbolIterator, symbolIterator); +$setFunctionName(SetIteratorSymbolIterator, symbolIterator); %AddNamedProperty(SetIterator.prototype, symbolIterator, SetIteratorSymbolIterator, DONT_ENUM); %AddNamedProperty(SetIterator.prototype, symbolToStringTag, "Set Iterator", READ_ONLY | DONT_ENUM); -InstallFunctions(GlobalSet.prototype, DONT_ENUM, [ +$installFunctions(GlobalSet.prototype, DONT_ENUM, [ 'entries', SetEntries, 'keys', SetValues, 'values', SetValues @@ -166,18 +166,18 @@ function MapValues() { %SetCode(MapIterator, MapIteratorConstructor); %FunctionSetPrototype(MapIterator, new GlobalObject()); %FunctionSetInstanceClassName(MapIterator, 'Map Iterator'); -InstallFunctions(MapIterator.prototype, DONT_ENUM, [ +$installFunctions(MapIterator.prototype, DONT_ENUM, [ 'next', MapIteratorNextJS ]); -SetFunctionName(MapIteratorSymbolIterator, symbolIterator); +$setFunctionName(MapIteratorSymbolIterator, symbolIterator); %AddNamedProperty(MapIterator.prototype, symbolIterator, MapIteratorSymbolIterator, DONT_ENUM); %AddNamedProperty(MapIterator.prototype, symbolToStringTag, "Map Iterator", READ_ONLY | DONT_ENUM); -InstallFunctions(GlobalMap.prototype, DONT_ENUM, [ +$installFunctions(GlobalMap.prototype, DONT_ENUM, [ 'entries', MapEntries, 'keys', MapKeys, 'values', MapValues diff --git a/src/collection.js b/src/collection.js index 04a4d94..2a64f29 100644 --- a/src/collection.js +++ b/src/collection.js @@ -22,7 +22,7 @@ function HashToEntry(table, hash, numBuckets) { function SetFindEntry(table, numBuckets, key, hash) { - var keyIsNaN = NumberIsNaN(key); + var keyIsNaN = $numberIsNaN(key); for (var entry = HashToEntry(table, hash, numBuckets); entry !== NOT_FOUND; entry = ORDERED_HASH_SET_CHAIN_AT(table, entry, numBuckets)) { @@ -30,7 +30,7 @@ function SetFindEntry(table, numBuckets, key, hash) { if (key === candidate) { return entry; } - if (keyIsNaN && NumberIsNaN(candidate)) { + if (keyIsNaN && $numberIsNaN(candidate)) { return entry; } } @@ -40,7 +40,7 @@ function SetFindEntry(table, numBuckets, key, hash) { function MapFindEntry(table, numBuckets, key, hash) { - var keyIsNaN = NumberIsNaN(key); + var keyIsNaN = $numberIsNaN(key); for (var entry = HashToEntry(table, hash, numBuckets); entry !== NOT_FOUND; entry = ORDERED_HASH_MAP_CHAIN_AT(table, entry, numBuckets)) { @@ -48,7 +48,7 @@ function MapFindEntry(table, numBuckets, key, hash) { if (key === candidate) { return entry; } - if (keyIsNaN && NumberIsNaN(candidate)) { + if (keyIsNaN && $numberIsNaN(candidate)) { return entry; } } @@ -239,8 +239,8 @@ function SetForEach(f, receiver) { %FunctionSetLength(SetForEach, 1); // Set up the non-enumerable functions on the Set prototype object. -InstallGetter(GlobalSet.prototype, "size", SetGetSize); -InstallFunctions(GlobalSet.prototype, DONT_ENUM, [ +$installGetter(GlobalSet.prototype, "size", SetGetSize); +$installFunctions(GlobalSet.prototype, DONT_ENUM, [ "add", SetAdd, "has", SetHas, "delete", SetDelete, @@ -427,8 +427,8 @@ function MapForEach(f, receiver) { %FunctionSetLength(MapForEach, 1); // Set up the non-enumerable functions on the Map prototype object. -InstallGetter(GlobalMap.prototype, "size", MapGetSize); -InstallFunctions(GlobalMap.prototype, DONT_ENUM, [ +$installGetter(GlobalMap.prototype, "size", MapGetSize); +$installFunctions(GlobalMap.prototype, DONT_ENUM, [ "get", MapGet, "set", MapSet, "has", MapHas, diff --git a/src/date.js b/src/date.js index 81246cf..4bf5340 100644 --- a/src/date.js +++ b/src/date.js @@ -760,7 +760,7 @@ function CreateDate(time) { %FunctionSetPrototype(GlobalDate, new GlobalDate(NAN)); // Set up non-enumerable properties of the Date object itself. -InstallFunctions(GlobalDate, DONT_ENUM, [ +$installFunctions(GlobalDate, DONT_ENUM, [ "UTC", DateUTC, "parse", DateParse, "now", DateNow @@ -771,7 +771,7 @@ InstallFunctions(GlobalDate, DONT_ENUM, [ // Set up non-enumerable functions of the Date prototype object and // set their names. -InstallFunctions(GlobalDate.prototype, DONT_ENUM, [ +$installFunctions(GlobalDate.prototype, DONT_ENUM, [ "toString", DateToString, "toDateString", DateToDateString, "toTimeString", DateToTimeString, diff --git a/src/generator.js b/src/generator.js index 2b0bcbd..3c925cc 100644 --- a/src/generator.js +++ b/src/generator.js @@ -72,7 +72,7 @@ function GeneratorObjectIterator() { function GeneratorFunctionConstructor(arg1) { // length == 1 - var source = NewFunctionString(arguments, 'function*'); + var source = $newFunctionString(arguments, 'function*'); var global_proxy = %GlobalProxy(global); // Compile the string in the constructor and not a helper so that errors // appear to come from here. @@ -90,12 +90,12 @@ function GeneratorFunctionConstructor(arg1) { // length == 1 // Set up non-enumerable functions on the generator prototype object. var GeneratorObjectPrototype = GeneratorFunctionPrototype.prototype; -InstallFunctions(GeneratorObjectPrototype, +$installFunctions(GeneratorObjectPrototype, DONT_ENUM, ["next", GeneratorObjectNext, "throw", GeneratorObjectThrow]); -SetFunctionName(GeneratorObjectIterator, symbolIterator); +$setFunctionName(GeneratorObjectIterator, symbolIterator); %AddNamedProperty(GeneratorObjectPrototype, symbolIterator, GeneratorObjectIterator, DONT_ENUM | DONT_DELETE | READ_ONLY); %AddNamedProperty(GeneratorObjectPrototype, "constructor", diff --git a/src/harmony-array-includes.js b/src/harmony-array-includes.js index 0276875..c8cf788 100644 --- a/src/harmony-array-includes.js +++ b/src/harmony-array-includes.js @@ -52,7 +52,7 @@ function ArrayIncludes(searchElement, fromIndex) { %FunctionSetLength(ArrayIncludes, 1); // Set up the non-enumerable functions on the Array prototype object. -InstallFunctions(GlobalArray.prototype, DONT_ENUM, [ +$installFunctions(GlobalArray.prototype, DONT_ENUM, [ "includes", ArrayIncludes ]); diff --git a/src/harmony-array.js b/src/harmony-array.js index 63c0d43..170c2a9 100644 --- a/src/harmony-array.js +++ b/src/harmony-array.js @@ -173,7 +173,7 @@ function ArrayFill(value /* [, start [, end ] ] */) { // length == 1 if (end > length) end = length; } - if ((end - i) > 0 && ObjectIsFrozen(array)) { + if ((end - i) > 0 && $objectIsFrozen(array)) { throw MakeTypeError(kArrayFunctionsOnFrozen); } @@ -197,7 +197,7 @@ function ArrayFrom(arrayLike, mapfn, receiver) { } } - var iterable = GetMethod(items, symbolIterator); + var iterable = $getMethod(items, symbolIterator); var k; var result; var mappedValue; @@ -206,7 +206,7 @@ function ArrayFrom(arrayLike, mapfn, receiver) { if (!IS_UNDEFINED(iterable)) { result = %IsConstructor(this) ? new this() : []; - var iterator = GetIterator(items, iterable); + var iterator = $getIterator(items, iterable); k = 0; while (true) { @@ -263,7 +263,7 @@ function ArrayOf() { // ------------------------------------------------------------------- -InstallConstants(GlobalSymbol, [ +$installConstants(GlobalSymbol, [ // TODO(dslomov, caitp): Move to symbol.js when shipping "isConcatSpreadable", symbolIsConcatSpreadable ]); @@ -272,13 +272,13 @@ InstallConstants(GlobalSymbol, [ %FunctionSetLength(ArrayFrom, 1); // Set up non-enumerable functions on the Array object. -InstallFunctions(GlobalArray, DONT_ENUM, [ +$installFunctions(GlobalArray, DONT_ENUM, [ "from", ArrayFrom, "of", ArrayOf ]); // Set up the non-enumerable functions on the Array prototype object. -InstallFunctions(GlobalArray.prototype, DONT_ENUM, [ +$installFunctions(GlobalArray.prototype, DONT_ENUM, [ "copyWithin", ArrayCopyWithin, "find", ArrayFind, "findIndex", ArrayFindIndex, diff --git a/src/harmony-reflect.js b/src/harmony-reflect.js index 8cb0d71..5ac41a2 100644 --- a/src/harmony-reflect.js +++ b/src/harmony-reflect.js @@ -10,7 +10,7 @@ var GlobalReflect = global.Reflect; -InstallFunctions(GlobalReflect, DONT_ENUM, [ +$installFunctions(GlobalReflect, DONT_ENUM, [ "apply", $reflectApply, "construct", $reflectConstruct ]); diff --git a/src/harmony-tostring.js b/src/harmony-tostring.js index 1ecfb26..2fc4308 100644 --- a/src/harmony-tostring.js +++ b/src/harmony-tostring.js @@ -10,7 +10,7 @@ var GlobalSymbol = global.Symbol; -InstallConstants(GlobalSymbol, [ +$installConstants(GlobalSymbol, [ // TODO(dslomov, caitp): Move to symbol.js when shipping "toStringTag", symbolToStringTag ]); diff --git a/src/harmony-typedarray.js b/src/harmony-typedarray.js index 168481b..d0010ad 100644 --- a/src/harmony-typedarray.js +++ b/src/harmony-typedarray.js @@ -8,8 +8,6 @@ %CheckIsBootstrapping(); -// ------------------------------------------------------------------- - macro TYPED_ARRAYS(FUNCTION) // arrayIds below should be synchronized with Runtime_TypedArrayInitialize. FUNCTION(1, Uint8Array, 1) @@ -23,6 +21,13 @@ FUNCTION(8, Float64Array, 8) FUNCTION(9, Uint8ClampedArray, 1) endmacro +macro DECLARE_GLOBALS(INDEX, NAME, SIZE) +var GlobalNAME = global.NAME; +endmacro + +TYPED_ARRAYS(DECLARE_GLOBALS) + +// ------------------------------------------------------------------- macro TYPED_ARRAY_HARMONY_ADDITIONS(ARRAY_ID, NAME, ELEMENT_SIZE) @@ -72,12 +77,12 @@ TYPED_ARRAYS(TYPED_ARRAY_HARMONY_ADDITIONS) macro EXTEND_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE) // Set up non-enumerable functions on the object. - InstallFunctions(global.NAME, DONT_ENUM | DONT_DELETE | READ_ONLY, [ + $installFunctions(GlobalNAME, DONT_ENUM | DONT_DELETE | READ_ONLY, [ "of", NAMEOf ]); // Set up non-enumerable functions on the prototype object. - InstallFunctions(global.NAME.prototype, DONT_ENUM, [ + $installFunctions(GlobalNAME.prototype, DONT_ENUM, [ "forEach", NAMEForEach ]); endmacro diff --git a/src/i18n.js b/src/i18n.js index 46e8bb8..ec6518a 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -254,7 +254,7 @@ function addBoundMethod(obj, methodName, implementation, length) { } } } - SetFunctionName(boundMethod, internalName); + $setFunctionName(boundMethod, internalName); %FunctionRemovePrototype(boundMethod); %SetNativeFlag(boundMethod); this[internalName] = boundMethod; @@ -262,11 +262,11 @@ function addBoundMethod(obj, methodName, implementation, length) { return this[internalName]; } - SetFunctionName(getter, methodName); + $setFunctionName(getter, methodName); %FunctionRemovePrototype(getter); %SetNativeFlag(getter); - ObjectDefineProperty(obj.prototype, methodName, { + $objectDefineProperty(obj.prototype, methodName, { get: getter, enumerable: false, configurable: true @@ -585,14 +585,14 @@ function setOptions(inOptions, extensionMap, keyValues, getOption, outOptions) { */ function freezeArray(array) { array.forEach(function(element, index) { - ObjectDefineProperty(array, index, {value: element, - configurable: false, - writable: false, - enumerable: true}); + $objectDefineProperty(array, index, {value: element, + configurable: false, + writable: false, + enumerable: true}); }); - ObjectDefineProperty(array, 'length', {value: array.length, - writable: false}); + $objectDefineProperty(array, 'length', {value: array.length, + writable: false}); return array; } @@ -653,8 +653,8 @@ function getAvailableLocalesOf(service) { * Configurable is false by default. */ function defineWEProperty(object, property, value) { - ObjectDefineProperty(object, property, - {value: value, writable: true, enumerable: true}); + $objectDefineProperty(object, property, + {value: value, writable: true, enumerable: true}); } @@ -673,11 +673,10 @@ function addWEPropertyIfDefined(object, property, value) { * Defines a property and sets writable, enumerable and configurable to true. */ function defineWECProperty(object, property, value) { - ObjectDefineProperty(object, property, - {value: value, - writable: true, - enumerable: true, - configurable: true}); + $objectDefineProperty(object, property, {value: value, + writable: true, + enumerable: true, + configurable: true}); } @@ -917,7 +916,7 @@ function initializeCollator(collator, locales, options) { // problems. If malicious user decides to redefine Object.prototype.locale // we can't just use plain x.locale = 'us' or in C++ Set("locale", "us"). // ObjectDefineProperties will either succeed defining or throw an error. - var resolved = ObjectDefineProperties({}, { + var resolved = $objectDefineProperties({}, { caseFirst: {writable: true}, collation: {value: internalOptions.collation, writable: true}, ignorePunctuation: {writable: true}, @@ -935,7 +934,7 @@ function initializeCollator(collator, locales, options) { // Writable, configurable and enumerable are set to false by default. %MarkAsInitializedIntlObjectOfType(collator, 'collator', internalCollator); - ObjectDefineProperty(collator, 'resolved', {value: resolved}); + $objectDefineProperty(collator, 'resolved', {value: resolved}); return collator; } @@ -990,7 +989,7 @@ function initializeCollator(collator, locales, options) { }, DONT_ENUM ); -SetFunctionName(Intl.Collator.prototype.resolvedOptions, 'resolvedOptions'); +$setFunctionName(Intl.Collator.prototype.resolvedOptions, 'resolvedOptions'); %FunctionRemovePrototype(Intl.Collator.prototype.resolvedOptions); %SetNativeFlag(Intl.Collator.prototype.resolvedOptions); @@ -1010,7 +1009,7 @@ SetFunctionName(Intl.Collator.prototype.resolvedOptions, 'resolvedOptions'); }, DONT_ENUM ); -SetFunctionName(Intl.Collator.supportedLocalesOf, 'supportedLocalesOf'); +$setFunctionName(Intl.Collator.supportedLocalesOf, 'supportedLocalesOf'); %FunctionRemovePrototype(Intl.Collator.supportedLocalesOf); %SetNativeFlag(Intl.Collator.supportedLocalesOf); @@ -1131,7 +1130,7 @@ function initializeNumberFormat(numberFormat, locales, options) { getOption, internalOptions); var requestedLocale = locale.locale + extension; - var resolved = ObjectDefineProperties({}, { + var resolved = $objectDefineProperties({}, { currency: {writable: true}, currencyDisplay: {writable: true}, locale: {writable: true}, @@ -1156,12 +1155,12 @@ function initializeNumberFormat(numberFormat, locales, options) { // We can't get information about number or currency style from ICU, so we // assume user request was fulfilled. if (internalOptions.style === 'currency') { - ObjectDefineProperty(resolved, 'currencyDisplay', {value: currencyDisplay, - writable: true}); + $objectDefineProperty(resolved, 'currencyDisplay', {value: currencyDisplay, + writable: true}); } %MarkAsInitializedIntlObjectOfType(numberFormat, 'numberformat', formatter); - ObjectDefineProperty(numberFormat, 'resolved', {value: resolved}); + $objectDefineProperty(numberFormat, 'resolved', {value: resolved}); return numberFormat; } @@ -1234,7 +1233,7 @@ function initializeNumberFormat(numberFormat, locales, options) { }, DONT_ENUM ); -SetFunctionName(Intl.NumberFormat.prototype.resolvedOptions, +$setFunctionName(Intl.NumberFormat.prototype.resolvedOptions, 'resolvedOptions'); %FunctionRemovePrototype(Intl.NumberFormat.prototype.resolvedOptions); %SetNativeFlag(Intl.NumberFormat.prototype.resolvedOptions); @@ -1255,7 +1254,7 @@ SetFunctionName(Intl.NumberFormat.prototype.resolvedOptions, }, DONT_ENUM ); -SetFunctionName(Intl.NumberFormat.supportedLocalesOf, 'supportedLocalesOf'); +$setFunctionName(Intl.NumberFormat.supportedLocalesOf, 'supportedLocalesOf'); %FunctionRemovePrototype(Intl.NumberFormat.supportedLocalesOf); %SetNativeFlag(Intl.NumberFormat.supportedLocalesOf); @@ -1451,33 +1450,33 @@ function toDateTimeOptions(options, required, defaults) { } if (needsDefault && (defaults === 'date' || defaults === 'all')) { - ObjectDefineProperty(options, 'year', {value: 'numeric', - writable: true, - enumerable: true, - configurable: true}); - ObjectDefineProperty(options, 'month', {value: 'numeric', + $objectDefineProperty(options, 'year', {value: 'numeric', writable: true, enumerable: true, configurable: true}); - ObjectDefineProperty(options, 'day', {value: 'numeric', - writable: true, - enumerable: true, - configurable: true}); - } - - if (needsDefault && (defaults === 'time' || defaults === 'all')) { - ObjectDefineProperty(options, 'hour', {value: 'numeric', + $objectDefineProperty(options, 'month', {value: 'numeric', writable: true, enumerable: true, configurable: true}); - ObjectDefineProperty(options, 'minute', {value: 'numeric', - writable: true, - enumerable: true, - configurable: true}); - ObjectDefineProperty(options, 'second', {value: 'numeric', - writable: true, - enumerable: true, - configurable: true}); + $objectDefineProperty(options, 'day', {value: 'numeric', + writable: true, + enumerable: true, + configurable: true}); + } + + if (needsDefault && (defaults === 'time' || defaults === 'all')) { + $objectDefineProperty(options, 'hour', {value: 'numeric', + writable: true, + enumerable: true, + configurable: true}); + $objectDefineProperty(options, 'minute', {value: 'numeric', + writable: true, + enumerable: true, + configurable: true}); + $objectDefineProperty(options, 'second', {value: 'numeric', + writable: true, + enumerable: true, + configurable: true}); } return options; @@ -1525,7 +1524,7 @@ function initializeDateTimeFormat(dateFormat, locales, options) { getOption, internalOptions); var requestedLocale = locale.locale + extension; - var resolved = ObjectDefineProperties({}, { + var resolved = $objectDefineProperties({}, { calendar: {writable: true}, day: {writable: true}, era: {writable: true}, @@ -1553,7 +1552,7 @@ function initializeDateTimeFormat(dateFormat, locales, options) { } %MarkAsInitializedIntlObjectOfType(dateFormat, 'dateformat', formatter); - ObjectDefineProperty(dateFormat, 'resolved', {value: resolved}); + $objectDefineProperty(dateFormat, 'resolved', {value: resolved}); return dateFormat; } @@ -1626,7 +1625,7 @@ function initializeDateTimeFormat(dateFormat, locales, options) { }, DONT_ENUM ); -SetFunctionName(Intl.DateTimeFormat.prototype.resolvedOptions, +$setFunctionName(Intl.DateTimeFormat.prototype.resolvedOptions, 'resolvedOptions'); %FunctionRemovePrototype(Intl.DateTimeFormat.prototype.resolvedOptions); %SetNativeFlag(Intl.DateTimeFormat.prototype.resolvedOptions); @@ -1647,7 +1646,7 @@ SetFunctionName(Intl.DateTimeFormat.prototype.resolvedOptions, }, DONT_ENUM ); -SetFunctionName(Intl.DateTimeFormat.supportedLocalesOf, 'supportedLocalesOf'); +$setFunctionName(Intl.DateTimeFormat.supportedLocalesOf, 'supportedLocalesOf'); %FunctionRemovePrototype(Intl.DateTimeFormat.supportedLocalesOf); %SetNativeFlag(Intl.DateTimeFormat.supportedLocalesOf); @@ -1742,7 +1741,7 @@ function initializeBreakIterator(iterator, locales, options) { 'type', 'string', ['character', 'word', 'sentence', 'line'], 'word')); var locale = resolveLocale('breakiterator', locales, options); - var resolved = ObjectDefineProperties({}, { + var resolved = $objectDefineProperties({}, { requestedLocale: {value: locale.locale, writable: true}, type: {value: internalOptions.type, writable: true}, locale: {writable: true} @@ -1754,7 +1753,7 @@ function initializeBreakIterator(iterator, locales, options) { %MarkAsInitializedIntlObjectOfType(iterator, 'breakiterator', internalIterator); - ObjectDefineProperty(iterator, 'resolved', {value: resolved}); + $objectDefineProperty(iterator, 'resolved', {value: resolved}); return iterator; } @@ -1805,7 +1804,7 @@ function initializeBreakIterator(iterator, locales, options) { }, DONT_ENUM ); -SetFunctionName(Intl.v8BreakIterator.prototype.resolvedOptions, +$setFunctionName(Intl.v8BreakIterator.prototype.resolvedOptions, 'resolvedOptions'); %FunctionRemovePrototype(Intl.v8BreakIterator.prototype.resolvedOptions); %SetNativeFlag(Intl.v8BreakIterator.prototype.resolvedOptions); @@ -1827,7 +1826,7 @@ SetFunctionName(Intl.v8BreakIterator.prototype.resolvedOptions, }, DONT_ENUM ); -SetFunctionName(Intl.v8BreakIterator.supportedLocalesOf, 'supportedLocalesOf'); +$setFunctionName(Intl.v8BreakIterator.supportedLocalesOf, 'supportedLocalesOf'); %FunctionRemovePrototype(Intl.v8BreakIterator.supportedLocalesOf); %SetNativeFlag(Intl.v8BreakIterator.supportedLocalesOf); @@ -1921,7 +1920,7 @@ function cachedOrNewService(service, locales, options, defaults) { * Compares this and that, and returns less than 0, 0 or greater than 0 value. * Overrides the built-in method. */ -OverrideFunction(GlobalString.prototype, 'localeCompare', function(that) { +$overrideFunction(GlobalString.prototype, 'localeCompare', function(that) { if (%_IsConstructCall()) { throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); } @@ -1945,7 +1944,7 @@ OverrideFunction(GlobalString.prototype, 'localeCompare', function(that) { * If the form is not one of "NFC", "NFD", "NFKC", or "NFKD", then throw * a RangeError Exception. */ -OverrideFunction(GlobalString.prototype, 'normalize', function(that) { +$overrideFunction(GlobalString.prototype, 'normalize', function(that) { if (%_IsConstructCall()) { throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); } @@ -1968,7 +1967,7 @@ OverrideFunction(GlobalString.prototype, 'normalize', function(that) { * Formats a Number object (this) using locale and options values. * If locale or options are omitted, defaults are used. */ -OverrideFunction(GlobalNumber.prototype, 'toLocaleString', function() { +$overrideFunction(GlobalNumber.prototype, 'toLocaleString', function() { if (%_IsConstructCall()) { throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); } @@ -2011,7 +2010,7 @@ function toLocaleDateTime(date, locales, options, required, defaults, service) { * If locale or options are omitted, defaults are used - both date and time are * present in the output. */ -OverrideFunction(GlobalDate.prototype, 'toLocaleString', function() { +$overrideFunction(GlobalDate.prototype, 'toLocaleString', function() { if (%_IsConstructCall()) { throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); } @@ -2029,7 +2028,7 @@ OverrideFunction(GlobalDate.prototype, 'toLocaleString', function() { * If locale or options are omitted, defaults are used - only date is present * in the output. */ -OverrideFunction(GlobalDate.prototype, 'toLocaleDateString', function() { +$overrideFunction(GlobalDate.prototype, 'toLocaleDateString', function() { if (%_IsConstructCall()) { throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); } @@ -2047,7 +2046,7 @@ OverrideFunction(GlobalDate.prototype, 'toLocaleDateString', function() { * If locale or options are omitted, defaults are used - only time is present * in the output. */ -OverrideFunction(GlobalDate.prototype, 'toLocaleTimeString', function() { +$overrideFunction(GlobalDate.prototype, 'toLocaleTimeString', function() { if (%_IsConstructCall()) { throw MakeTypeError(kOrdinaryFunctionCalledAsConstructor); } diff --git a/src/json.js b/src/json.js index a896e29..26948fc 100644 --- a/src/json.js +++ b/src/json.js @@ -25,7 +25,7 @@ function Revive(holder, name, reviver) { } } else { for (var p in val) { - if (%_CallFunction(val, p, ObjectHasOwnProperty)) { + if (%_CallFunction(val, p, $objectHasOwnProperty)) { var newElement = Revive(val, p, reviver); if (IS_UNDEFINED(newElement)) { delete val[p]; @@ -91,7 +91,7 @@ function SerializeObject(value, replacer, stack, indent, gap) { if (IS_ARRAY(replacer)) { var length = replacer.length; for (var i = 0; i < length; i++) { - if (%_CallFunction(replacer, i, ObjectHasOwnProperty)) { + if (%_CallFunction(replacer, i, $objectHasOwnProperty)) { var p = replacer[i]; var strP = JSONSerialize(p, value, replacer, stack, indent, gap); if (!IS_UNDEFINED(strP)) { @@ -104,7 +104,7 @@ function SerializeObject(value, replacer, stack, indent, gap) { } } else { for (var p in value) { - if (%_CallFunction(value, p, ObjectHasOwnProperty)) { + if (%_CallFunction(value, p, $objectHasOwnProperty)) { var strP = JSONSerialize(p, value, replacer, stack, indent, gap); if (!IS_UNDEFINED(strP)) { var member = %QuoteJSONString(p) + ":"; @@ -224,7 +224,7 @@ function JSONStringify(value, replacer, space) { %AddNamedProperty(GlobalJSON, symbolToStringTag, "JSON", READ_ONLY | DONT_ENUM); // Set up non-enumerable properties of the JSON object. -InstallFunctions(GlobalJSON, DONT_ENUM, [ +$installFunctions(GlobalJSON, DONT_ENUM, [ "parse", JSONParse, "stringify", JSONStringify ]); diff --git a/src/macros.py b/src/macros.py index b39cd85..7f99901 100644 --- a/src/macros.py +++ b/src/macros.py @@ -152,7 +152,7 @@ macro TO_STRING_INLINE(arg) = (IS_STRING(%IS_VAR(arg)) ? arg : NonStringToString macro TO_NUMBER_INLINE(arg) = (IS_NUMBER(%IS_VAR(arg)) ? arg : NonNumberToNumber(arg)); macro TO_OBJECT_INLINE(arg) = (IS_SPEC_OBJECT(%IS_VAR(arg)) ? arg : ToObject(arg)); macro JSON_NUMBER_TO_STRING(arg) = ((%_IsSmi(%IS_VAR(arg)) || arg - arg == 0) ? %_NumberToString(arg) : "null"); -macro HAS_OWN_PROPERTY(obj, index) = (%_CallFunction(obj, index, ObjectHasOwnProperty)); +macro HAS_OWN_PROPERTY(arg, index) = (%_CallFunction(arg, index, $objectHasOwnProperty)); macro SHOULD_CREATE_WRAPPER(functionName, receiver) = (!IS_SPEC_OBJECT(receiver) && %IsSloppyModeFunction(functionName)); macro HAS_INDEX(array, index, is_array) = ((is_array && %_HasFastPackedElements(%IS_VAR(array))) ? (index < array.length) : (index in array)); diff --git a/src/math.js b/src/math.js index 13bcf0f..b5b442f 100644 --- a/src/math.js +++ b/src/math.js @@ -294,7 +294,7 @@ var Math = new MathConstructor(); %AddNamedProperty(Math, symbolToStringTag, "Math", READ_ONLY | DONT_ENUM); // Set up math constants. -InstallConstants(Math, [ +$installConstants(Math, [ // ECMA-262, section 15.8.1.1. "E", 2.7182818284590452354, // ECMA-262, section 15.8.1.2. @@ -311,7 +311,7 @@ InstallConstants(Math, [ // Set up non-enumerable functions of the Math object and // set their names. -InstallFunctions(Math, DONT_ENUM, [ +$installFunctions(Math, DONT_ENUM, [ "random", MathRandom, "abs", MathAbs, "acos", MathAcosJS, diff --git a/src/messages.js b/src/messages.js index dd8caf3..8bfd0bc 100644 --- a/src/messages.js +++ b/src/messages.js @@ -224,6 +224,13 @@ function FormatString(format, args) { } +function NoSideEffectsObjectToString() { + if (IS_UNDEFINED(this) && !IS_UNDETECTABLE(this)) return "[object Undefined]"; + if (IS_NULL(this)) return "[object Null]"; + return "[object " + %_ClassOf(TO_OBJECT_INLINE(this)) + "]"; +} + + function NoSideEffectToString(obj) { if (IS_STRING(obj)) return obj; if (IS_NUMBER(obj)) return %_NumberToString(obj); @@ -231,7 +238,7 @@ function NoSideEffectToString(obj) { if (IS_UNDEFINED(obj)) return 'undefined'; if (IS_NULL(obj)) return 'null'; if (IS_FUNCTION(obj)) { - var str = %_CallFunction(obj, FunctionToString); + var str = %_CallFunction(obj, obj, $functionSourceString); if (str.length > 128) { str = %_SubString(str, 0, 111) + "......" + %_SubString(str, str.length - 2, str.length); @@ -240,7 +247,7 @@ function NoSideEffectToString(obj) { } if (IS_SYMBOL(obj)) return %_CallFunction(obj, $symbolToString); if (IS_OBJECT(obj) - && %GetDataProperty(obj, "toString") === ObjectToString) { + && %GetDataProperty(obj, "toString") === $objectToString) { var constructor = %GetDataProperty(obj, "constructor"); if (typeof constructor == "function") { var constructorName = constructor.name; @@ -292,7 +299,7 @@ function ToStringCheckErrorObject(obj) { function ToDetailString(obj) { - if (obj != null && IS_OBJECT(obj) && obj.toString === ObjectToString) { + if (obj != null && IS_OBJECT(obj) && obj.toString === $objectToString) { var constructor = obj.constructor; if (typeof constructor == "function") { var constructorName = constructor.name; @@ -570,7 +577,7 @@ function ScriptNameOrSourceURL() { } -SetUpLockedPrototype(Script, [ +$setUpLockedPrototype(Script, [ "source", "name", "source_url", @@ -634,7 +641,7 @@ function SourceLocationSourceText() { } -SetUpLockedPrototype(SourceLocation, +$setUpLockedPrototype(SourceLocation, ["script", "position", "line", "column", "start", "end"], ["sourceText", SourceLocationSourceText] ); @@ -678,7 +685,7 @@ function SourceSliceSourceText() { $stringSubstring); } -SetUpLockedPrototype(SourceSlice, +$setUpLockedPrototype(SourceSlice, ["script", "from_line", "to_line", "from_position", "to_position"], ["sourceText", SourceSliceSourceText] ); @@ -773,8 +780,8 @@ function CallSiteGetMethodName() { var fun = GET_PRIVATE(this, CallSiteFunctionKey); var ownName = fun.name; if (ownName && receiver && - (%_CallFunction(receiver, ownName, ObjectLookupGetter) === fun || - %_CallFunction(receiver, ownName, ObjectLookupSetter) === fun || + (%_CallFunction(receiver, ownName, $objectLookupGetter) === fun || + %_CallFunction(receiver, ownName, $objectLookupSetter) === fun || (IS_OBJECT(receiver) && %GetDataProperty(receiver, ownName) === fun))) { // To handle DontEnum properties we guess that the method has // the same name as the function. @@ -782,8 +789,8 @@ function CallSiteGetMethodName() { } var name = null; for (var prop in receiver) { - if (%_CallFunction(receiver, prop, ObjectLookupGetter) === fun || - %_CallFunction(receiver, prop, ObjectLookupSetter) === fun || + if (%_CallFunction(receiver, prop, $objectLookupGetter) === fun || + %_CallFunction(receiver, prop, $objectLookupSetter) === fun || (IS_OBJECT(receiver) && %GetDataProperty(receiver, prop) === fun)) { // If we find more than one match bail out to avoid confusion. if (name) { @@ -900,7 +907,7 @@ function CallSiteToString() { return line; } -SetUpLockedPrototype(CallSite, ["receiver", "fun", "pos"], [ +$setUpLockedPrototype(CallSite, ["receiver", "fun", "pos"], [ "getThis", CallSiteGetThis, "getTypeName", CallSiteGetTypeName, "isToplevel", CallSiteIsToplevel, @@ -1089,9 +1096,9 @@ var StackTraceSetter = function(v) { // when constructing the initial Error prototytpes. var captureStackTrace = function captureStackTrace(obj, cons_opt) { // Define accessors first, as this may fail and throw. - ObjectDefineProperty(obj, 'stack', { get: StackTraceGetter, - set: StackTraceSetter, - configurable: true }); + $objectDefineProperty(obj, 'stack', { get: StackTraceGetter, + set: StackTraceSetter, + configurable: true }); %CollectStackTrace(obj, cons_opt ? cons_opt : captureStackTrace); } @@ -1215,7 +1222,8 @@ function ErrorToString() { } } -InstallFunctions(GlobalError.prototype, DONT_ENUM, ['toString', ErrorToString]); +$installFunctions(GlobalError.prototype, DONT_ENUM, + ['toString', ErrorToString]); $errorToString = ErrorToString; $formatMessage = FormatMessage; diff --git a/src/mirror-debugger.js b/src/mirror-debugger.js index 87a1feb..b293ba0 100644 --- a/src/mirror-debugger.js +++ b/src/mirror-debugger.js @@ -1008,7 +1008,7 @@ FunctionMirror.prototype.source = function() { // Return source if function is resolved. Otherwise just fall through to // return undefined. if (this.resolved()) { - return builtins.FunctionSourceString(this.value_); + return builtins.$functionSourceString(this.value_); } }; diff --git a/src/object-observe.js b/src/object-observe.js index a9eb1e0..f404f79 100644 --- a/src/object-observe.js +++ b/src/object-observe.js @@ -376,7 +376,7 @@ function ObjectObserve(object, callback, acceptList) { throw MakeTypeError(kObserveGlobalProxy, "observe"); if (!IS_SPEC_FUNCTION(callback)) throw MakeTypeError(kObserveNonFunction, "observe"); - if (ObjectIsFrozen(callback)) + if ($objectIsFrozen(callback)) throw MakeTypeError(kObserveCallbackFrozen); var objectObserveFn = %GetObjectContextObjectObserve(object); @@ -469,7 +469,7 @@ function ObjectInfoEnqueueExternalChangeRecord(objectInfo, changeRecord, type) { %DefineDataPropertyUnchecked( newRecord, prop, changeRecord[prop], READ_ONLY + DONT_DELETE); } - ObjectFreezeJS(newRecord); + $objectFreeze(newRecord); ObjectInfoEnqueueInternalChangeRecord(objectInfo, newRecord); } @@ -521,8 +521,8 @@ function EnqueueSpliceRecord(array, index, removed, addedCount) { addedCount: addedCount }; - ObjectFreezeJS(changeRecord); - ObjectFreezeJS(changeRecord.removed); + $objectFreeze(changeRecord); + $objectFreeze(changeRecord.removed); ObjectInfoEnqueueInternalChangeRecord(objectInfo, changeRecord); } @@ -546,7 +546,7 @@ function NotifyChange(type, object, name, oldValue) { }; } - ObjectFreezeJS(changeRecord); + $objectFreeze(changeRecord); ObjectInfoEnqueueInternalChangeRecord(objectInfo, changeRecord); } @@ -603,7 +603,7 @@ function ObjectGetNotifier(object) { if (%IsJSGlobalProxy(object)) throw MakeTypeError(kObserveGlobalProxy, "getNotifier"); - if (ObjectIsFrozen(object)) return null; + if ($objectIsFrozen(object)) return null; if (!%ObjectWasCreatedInCurrentOrigin(object)) return null; @@ -661,17 +661,17 @@ function ObserveMicrotaskRunner() { // ------------------------------------------------------------------- -InstallFunctions(GlobalObject, DONT_ENUM, [ +$installFunctions(GlobalObject, DONT_ENUM, [ "deliverChangeRecords", ObjectDeliverChangeRecords, "getNotifier", ObjectGetNotifier, "observe", ObjectObserve, "unobserve", ObjectUnobserve ]); -InstallFunctions(GlobalArray, DONT_ENUM, [ +$installFunctions(GlobalArray, DONT_ENUM, [ "observe", ArrayObserve, "unobserve", ArrayUnobserve ]); -InstallFunctions(notifierPrototype, DONT_ENUM, [ +$installFunctions(notifierPrototype, DONT_ENUM, [ "notify", ObjectNotifierNotify, "performChange", ObjectNotifierPerformChange ]); diff --git a/src/promise.js b/src/promise.js index 6fc7c73..b798fb9 100644 --- a/src/promise.js +++ b/src/promise.js @@ -366,7 +366,7 @@ function PromiseHasUserDefinedRejectHandler() { %AddNamedProperty(GlobalPromise.prototype, symbolToStringTag, "Promise", DONT_ENUM | READ_ONLY); -InstallFunctions(GlobalPromise, DONT_ENUM, [ +$installFunctions(GlobalPromise, DONT_ENUM, [ "defer", PromiseDeferred, "accept", PromiseResolved, "reject", PromiseRejected, @@ -375,7 +375,7 @@ InstallFunctions(GlobalPromise, DONT_ENUM, [ "resolve", PromiseCast ]); -InstallFunctions(GlobalPromise.prototype, DONT_ENUM, [ +$installFunctions(GlobalPromise.prototype, DONT_ENUM, [ "chain", PromiseChain, "then", PromiseThen, "catch", PromiseCatch diff --git a/src/proxy.js b/src/proxy.js index 03f4cde..44939f6 100644 --- a/src/proxy.js +++ b/src/proxy.js @@ -176,7 +176,7 @@ function ProxyEnumerate(proxy) { if (IS_UNDEFINED(handler.enumerate)) { return %Apply(DerivedEnumerateTrap, handler, [], 0, 0) } else { - return ToNameArray(handler.enumerate(), "enumerate", false) + return $toNameArray(handler.enumerate(), "enumerate", false) } } @@ -186,7 +186,7 @@ var Proxy = new GlobalObject(); %AddNamedProperty(global, "Proxy", Proxy, DONT_ENUM); //Set up non-enumerable properties of the Proxy object. -InstallFunctions(Proxy, DONT_ENUM, [ +$installFunctions(Proxy, DONT_ENUM, [ "create", ProxyCreate, "createFunction", ProxyCreateFunction ]) diff --git a/src/regexp.js b/src/regexp.js index 9db8e99..9f89a6a 100644 --- a/src/regexp.js +++ b/src/regexp.js @@ -363,7 +363,7 @@ function RegExpMakeCaptureGetter(n) { GlobalRegExp.prototype, 'constructor', GlobalRegExp, DONT_ENUM); %SetCode(GlobalRegExp, RegExpConstructor); -InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [ +$installFunctions(GlobalRegExp.prototype, DONT_ENUM, [ "exec", RegExpExecJS, "test", RegExpTest, "toString", RegExpToString, diff --git a/src/string-iterator.js b/src/string-iterator.js index b28c63b..0eaaffb 100644 --- a/src/string-iterator.js +++ b/src/string-iterator.js @@ -88,16 +88,16 @@ function StringPrototypeIterator() { %FunctionSetPrototype(StringIterator, new GlobalObject()); %FunctionSetInstanceClassName(StringIterator, 'String Iterator'); -InstallFunctions(StringIterator.prototype, DONT_ENUM, [ +$installFunctions(StringIterator.prototype, DONT_ENUM, [ 'next', StringIteratorNext ]); -SetFunctionName(StringIteratorIterator, symbolIterator); +$setFunctionName(StringIteratorIterator, symbolIterator); %AddNamedProperty(StringIterator.prototype, symbolIterator, StringIteratorIterator, DONT_ENUM); %AddNamedProperty(StringIterator.prototype, symbolToStringTag, "String Iterator", READ_ONLY | DONT_ENUM); -SetFunctionName(StringPrototypeIterator, symbolIterator); +$setFunctionName(StringPrototypeIterator, symbolIterator); %AddNamedProperty(GlobalString.prototype, symbolIterator, StringPrototypeIterator, DONT_ENUM); diff --git a/src/string.js b/src/string.js index 1435073..fa57b9a 100644 --- a/src/string.js +++ b/src/string.js @@ -1118,14 +1118,14 @@ function StringRaw(callSite) { GlobalString.prototype, "constructor", GlobalString, DONT_ENUM); // Set up the non-enumerable functions on the String object. -InstallFunctions(GlobalString, DONT_ENUM, [ +$installFunctions(GlobalString, DONT_ENUM, [ "fromCharCode", StringFromCharCode, "fromCodePoint", StringFromCodePoint, "raw", StringRaw ]); // Set up the non-enumerable functions on the String prototype object. -InstallFunctions(GlobalString.prototype, DONT_ENUM, [ +$installFunctions(GlobalString.prototype, DONT_ENUM, [ "valueOf", StringValueOf, "toString", StringToString, "charAt", StringCharAtJS, diff --git a/src/symbol.js b/src/symbol.js index 3a582f8..72aa4d6 100644 --- a/src/symbol.js +++ b/src/symbol.js @@ -73,7 +73,7 @@ function ObjectGetOwnPropertySymbols(obj) { // TODO(arv): Proxies use a shared trap for String and Symbol keys. - return ObjectGetOwnPropertyKeys(obj, PROPERTY_ATTRIBUTES_STRING); + return $objectGetOwnPropertyKeys(obj, PROPERTY_ATTRIBUTES_STRING); } //------------------------------------------------------------------- @@ -81,7 +81,7 @@ function ObjectGetOwnPropertySymbols(obj) { %SetCode(GlobalSymbol, SymbolConstructor); %FunctionSetPrototype(GlobalSymbol, new GlobalObject()); -InstallConstants(GlobalSymbol, [ +$installConstants(GlobalSymbol, [ // TODO(rossberg): expose when implemented. // "hasInstance", symbolHasInstance, // "isConcatSpreadable", symbolIsConcatSpreadable, @@ -93,7 +93,7 @@ InstallConstants(GlobalSymbol, [ "unscopables", symbolUnscopables ]); -InstallFunctions(GlobalSymbol, DONT_ENUM, [ +$installFunctions(GlobalSymbol, DONT_ENUM, [ "for", SymbolFor, "keyFor", SymbolKeyFor ]); @@ -103,12 +103,12 @@ InstallFunctions(GlobalSymbol, DONT_ENUM, [ %AddNamedProperty( GlobalSymbol.prototype, symbolToStringTag, "Symbol", DONT_ENUM | READ_ONLY); -InstallFunctions(GlobalSymbol.prototype, DONT_ENUM, [ +$installFunctions(GlobalSymbol.prototype, DONT_ENUM, [ "toString", SymbolToString, "valueOf", SymbolValueOf ]); -InstallFunctions(GlobalObject, DONT_ENUM, [ +$installFunctions(GlobalObject, DONT_ENUM, [ "getOwnPropertySymbols", ObjectGetOwnPropertySymbols ]); diff --git a/src/third_party/fdlibm/fdlibm.js b/src/third_party/fdlibm/fdlibm.js index 5717392..b1bb07e 100644 --- a/src/third_party/fdlibm/fdlibm.js +++ b/src/third_party/fdlibm/fdlibm.js @@ -1012,7 +1012,7 @@ function MathLog2(x) { //------------------------------------------------------------------- -InstallFunctions(GlobalMath, DONT_ENUM, [ +$installFunctions(GlobalMath, DONT_ENUM, [ "cos", MathCos, "sin", MathSin, "tan", MathTan, diff --git a/src/typedarray.js b/src/typedarray.js index c9c6056..3bd7766 100644 --- a/src/typedarray.js +++ b/src/typedarray.js @@ -10,8 +10,9 @@ var GlobalArray = global.Array; var GlobalArrayBuffer = global.ArrayBuffer; +var GlobalDataView = global.DataView; +var GlobalObject = global.Object; -// --------------- Typed Arrays --------------------- macro TYPED_ARRAYS(FUNCTION) // arrayIds below should be synchronized with Runtime_TypedArrayInitialize. FUNCTION(1, Uint8Array, 1) @@ -25,6 +26,14 @@ FUNCTION(8, Float64Array, 8) FUNCTION(9, Uint8ClampedArray, 1) endmacro +macro DECLARE_GLOBALS(INDEX, NAME, SIZE) +var GlobalNAME = global.NAME; +endmacro + +TYPED_ARRAYS(DECLARE_GLOBALS) + +// --------------- Typed Arrays --------------------- + macro TYPED_ARRAY_CONSTRUCTOR(ARRAY_ID, NAME, ELEMENT_SIZE) function NAMEConstructByArrayBuffer(obj, buffer, byteOffset, length) { if (!IS_UNDEFINED(byteOffset)) { @@ -145,8 +154,6 @@ function NAME_GetLength() { return %_TypedArrayGetLength(this); } -var $NAME = global.NAME; - function NAMESubArray(begin, end) { if (!(%_ClassOf(this) === 'NAME')) { throw MakeTypeError(kIncompatibleMethodReceiver, "NAME.subarray", this); @@ -175,8 +182,8 @@ function NAMESubArray(begin, end) { var newLength = endInt - beginInt; var beginByteOffset = %_ArrayBufferViewGetByteOffset(this) + beginInt * ELEMENT_SIZE; - return new $NAME(%TypedArrayGetBuffer(this), - beginByteOffset, newLength); + return new GlobalNAME(%TypedArrayGetBuffer(this), + beginByteOffset, newLength); } endmacro @@ -297,26 +304,26 @@ function TypedArrayGetToStringTag() { // ------------------------------------------------------------------- macro SETUP_TYPED_ARRAY(ARRAY_ID, NAME, ELEMENT_SIZE) - %SetCode(global.NAME, NAMEConstructor); - %FunctionSetPrototype(global.NAME, new $Object()); + %SetCode(GlobalNAME, NAMEConstructor); + %FunctionSetPrototype(GlobalNAME, new GlobalObject()); - %AddNamedProperty(global.NAME, "BYTES_PER_ELEMENT", ELEMENT_SIZE, + %AddNamedProperty(GlobalNAME, "BYTES_PER_ELEMENT", ELEMENT_SIZE, READ_ONLY | DONT_ENUM | DONT_DELETE); - %AddNamedProperty(global.NAME.prototype, + %AddNamedProperty(GlobalNAME.prototype, "constructor", global.NAME, DONT_ENUM); - %AddNamedProperty(global.NAME.prototype, + %AddNamedProperty(GlobalNAME.prototype, "BYTES_PER_ELEMENT", ELEMENT_SIZE, READ_ONLY | DONT_ENUM | DONT_DELETE); - InstallGetter(global.NAME.prototype, "buffer", NAME_GetBuffer); - InstallGetter(global.NAME.prototype, "byteOffset", NAME_GetByteOffset, - DONT_ENUM | DONT_DELETE); - InstallGetter(global.NAME.prototype, "byteLength", NAME_GetByteLength, - DONT_ENUM | DONT_DELETE); - InstallGetter(global.NAME.prototype, "length", NAME_GetLength, - DONT_ENUM | DONT_DELETE); - InstallGetter(global.NAME.prototype, symbolToStringTag, - TypedArrayGetToStringTag); - InstallFunctions(global.NAME.prototype, DONT_ENUM, [ + $installGetter(GlobalNAME.prototype, "buffer", NAME_GetBuffer); + $installGetter(GlobalNAME.prototype, "byteOffset", NAME_GetByteOffset, + DONT_ENUM | DONT_DELETE); + $installGetter(GlobalNAME.prototype, "byteLength", NAME_GetByteLength, + DONT_ENUM | DONT_DELETE); + $installGetter(GlobalNAME.prototype, "length", NAME_GetLength, + DONT_ENUM | DONT_DELETE); + $installGetter(GlobalNAME.prototype, symbolToStringTag, + TypedArrayGetToStringTag); + $installFunctions(GlobalNAME.prototype, DONT_ENUM, [ "subarray", NAMESubArray, "set", TypedArraySet ]); @@ -326,8 +333,6 @@ TYPED_ARRAYS(SETUP_TYPED_ARRAY) // --------------------------- DataView ----------------------------- -var $DataView = global.DataView; - function DataViewConstructor(buffer, byteOffset, byteLength) { // length = 3 if (%_IsConstructCall()) { if (!IS_ARRAYBUFFER(buffer)) { @@ -430,19 +435,20 @@ endmacro DATA_VIEW_TYPES(DATA_VIEW_GETTER_SETTER) // Setup the DataView constructor. -%SetCode($DataView, DataViewConstructor); -%FunctionSetPrototype($DataView, new $Object); +%SetCode(GlobalDataView, DataViewConstructor); +%FunctionSetPrototype(GlobalDataView, new GlobalObject); // Set up constructor property on the DataView prototype. -%AddNamedProperty($DataView.prototype, "constructor", $DataView, DONT_ENUM); -%AddNamedProperty( - $DataView.prototype, symbolToStringTag, "DataView", READ_ONLY|DONT_ENUM); +%AddNamedProperty(GlobalDataView.prototype, "constructor", GlobalDataView, + DONT_ENUM); +%AddNamedProperty(GlobalDataView.prototype, symbolToStringTag, "DataView", + READ_ONLY|DONT_ENUM); -InstallGetter($DataView.prototype, "buffer", DataViewGetBufferJS); -InstallGetter($DataView.prototype, "byteOffset", DataViewGetByteOffset); -InstallGetter($DataView.prototype, "byteLength", DataViewGetByteLength); +$installGetter(GlobalDataView.prototype, "buffer", DataViewGetBufferJS); +$installGetter(GlobalDataView.prototype, "byteOffset", DataViewGetByteOffset); +$installGetter(GlobalDataView.prototype, "byteLength", DataViewGetByteLength); -InstallFunctions($DataView.prototype, DONT_ENUM, [ +$installFunctions(GlobalDataView.prototype, DONT_ENUM, [ "getInt8", DataViewGetInt8JS, "setInt8", DataViewSetInt8JS, diff --git a/src/uri.js b/src/uri.js index b7dd050..fdbd07e 100644 --- a/src/uri.js +++ b/src/uri.js @@ -356,7 +356,7 @@ function URIEncodeComponent(component) { // Set up non-enumerable URI functions on the global object and set // their names. -InstallFunctions(global, DONT_ENUM, [ +$installFunctions(global, DONT_ENUM, [ "escape", URIEscapeJS, "unescape", URIUnescapeJS, "decodeURI", URIDecode, diff --git a/src/v8natives.js b/src/v8natives.js index d163f5e..9c822b2 100644 --- a/src/v8natives.js +++ b/src/v8natives.js @@ -2,16 +2,44 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// This file relies on the fact that the following declarations have been made -// in runtime.js: -// var $Object = global.Object; -// var $Boolean = global.Boolean; -// var $Number = global.Number; -// var $Function = global.Function; -// var $Array = global.Array; - -var $isNaN = GlobalIsNaN; -var $isFinite = GlobalIsFinite; +var $delete; +var $functionSourceString; +var $getIterator; +var $getMethod; +var $globalEval; +var $installConstants; +var $installFunctions; +var $installGetter; +var $isFinite; +var $isNaN; +var $newFunctionString; +var $numberIsNaN; +var $objectDefineProperties; +var $objectDefineProperty; +var $objectFreeze; +var $objectGetOwnPropertyDescriptor; +var $objectGetOwnPropertyKeys; +var $objectHasOwnProperty; +var $objectIsFrozen; +var $objectIsSealed; +var $objectLookupGetter; +var $objectLookupSetter; +var $objectToString; +var $overrideFunction; +var $setFunctionName; +var $setUpLockedPrototype; +var $toCompletePropertyDescriptor; +var $toNameArray; + +(function() { + +%CheckIsBootstrapping(); + +var GlobalArray = global.Array; +var GlobalBoolean = global.Boolean; +var GlobalFunction = global.Function; +var GlobalNumber = global.Number; +var GlobalObject = global.Object; // ---------------------------------------------------------------------------- @@ -195,44 +223,31 @@ function GlobalEval(x) { // ---------------------------------------------------------------------------- // Set up global object. -function SetUpGlobal() { - %CheckIsBootstrapping(); - - var attributes = DONT_ENUM | DONT_DELETE | READ_ONLY; +var attributes = DONT_ENUM | DONT_DELETE | READ_ONLY; +InstallConstants(global, [ // ECMA 262 - 15.1.1.1. - %AddNamedProperty(global, "NaN", NAN, attributes); - + "NaN", NAN, // ECMA-262 - 15.1.1.2. - %AddNamedProperty(global, "Infinity", INFINITY, attributes); - - // ECMA-262 - 15.1.1.3. - %AddNamedProperty(global, "undefined", UNDEFINED, attributes); - - // Set up non-enumerable function on the global object. - InstallFunctions(global, DONT_ENUM, [ - "isNaN", GlobalIsNaN, - "isFinite", GlobalIsFinite, - "parseInt", GlobalParseInt, - "parseFloat", GlobalParseFloat, - "eval", GlobalEval - ]); -} + "Infinity", INFINITY, + // ECMA-262 - 15.1.1.2. + "undefined", UNDEFINED, +]); -SetUpGlobal(); +// Set up non-enumerable function on the global object. +InstallFunctions(global, DONT_ENUM, [ + "isNaN", GlobalIsNaN, + "isFinite", GlobalIsFinite, + "parseInt", GlobalParseInt, + "parseFloat", GlobalParseFloat, + "eval", GlobalEval +]); // ---------------------------------------------------------------------------- // Object // ECMA-262 - 15.2.4.2 -function NoSideEffectsObjectToString() { - if (IS_UNDEFINED(this) && !IS_UNDETECTABLE(this)) return "[object Undefined]"; - if (IS_NULL(this)) return "[object Null]"; - return "[object " + %_ClassOf(TO_OBJECT_INLINE(this)) + "]"; -} - - function ObjectToString() { if (IS_UNDEFINED(this) && !IS_UNDETECTABLE(this)) return "[object Undefined]"; if (IS_NULL(this)) return "[object Null]"; @@ -242,7 +257,7 @@ function ObjectToString() { // TODO(caitp): cannot wait to get rid of this flag :> if (harmony_tostring) { - var tag = O[symbolToStringTag]; + tag = O[symbolToStringTag]; if (!IS_STRING(tag)) { tag = builtinTag; } @@ -411,7 +426,7 @@ function FromPropertyDescriptor(desc) { // Harmony Proxies function FromGenericPropertyDescriptor(desc) { if (IS_UNDEFINED(desc)) return desc; - var obj = new $Object(); + var obj = new GlobalObject(); if (desc.hasValue()) { %AddNamedProperty(obj, "value", desc.getValue(), NONE); @@ -1040,7 +1055,7 @@ function ToNameArray(obj, trap, includeSymbols) { throw MakeTypeError(kProxyNonObjectPropNames, trap, obj); } var n = ToUint32(obj.length); - var array = new $Array(n); + var array = new GlobalArray(n); var realLength = 0; var names = { __proto__: null }; // TODO(rossberg): use sets once ready. for (var index = 0; index < n; index++) { @@ -1249,8 +1264,8 @@ function ProxyFix(obj) { %SetCode(obj, code); // TODO(rossberg): What about length and other properties? Not specified. // We just put in some half-reasonable defaults for now. - var prototype = new $Object(); - $Object.defineProperty(prototype, "constructor", + var prototype = new GlobalObject(); + ObjectDefineProperty(prototype, "constructor", {value: obj, writable: true, enumerable: false, configurable: true}); // TODO(v8:1530): defineProperty does not handle prototype and length. %FunctionSetPrototype(obj, prototype); @@ -1415,54 +1430,49 @@ function ObjectConstructor(x) { // ---------------------------------------------------------------------------- // Object -function SetUpObject() { - %CheckIsBootstrapping(); - - %SetNativeFlag($Object); - %SetCode($Object, ObjectConstructor); - - %AddNamedProperty($Object.prototype, "constructor", $Object, DONT_ENUM); - - // Set up non-enumerable functions on the Object.prototype object. - InstallFunctions($Object.prototype, DONT_ENUM, [ - "toString", ObjectToString, - "toLocaleString", ObjectToLocaleString, - "valueOf", ObjectValueOf, - "hasOwnProperty", ObjectHasOwnProperty, - "isPrototypeOf", ObjectIsPrototypeOf, - "propertyIsEnumerable", ObjectPropertyIsEnumerable, - "__defineGetter__", ObjectDefineGetter, - "__lookupGetter__", ObjectLookupGetter, - "__defineSetter__", ObjectDefineSetter, - "__lookupSetter__", ObjectLookupSetter - ]); - InstallGetterSetter($Object.prototype, "__proto__", - ObjectGetProto, ObjectSetProto); - - // Set up non-enumerable functions in the Object object. - InstallFunctions($Object, DONT_ENUM, [ - "keys", ObjectKeys, - "create", ObjectCreate, - "defineProperty", ObjectDefineProperty, - "defineProperties", ObjectDefineProperties, - "freeze", ObjectFreezeJS, - "getPrototypeOf", ObjectGetPrototypeOf, - "setPrototypeOf", ObjectSetPrototypeOf, - "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, - "getOwnPropertyNames", ObjectGetOwnPropertyNames, - // getOwnPropertySymbols is added in symbol.js. - "is", ObjectIs, - "isExtensible", ObjectIsExtensible, - "isFrozen", ObjectIsFrozen, - "isSealed", ObjectIsSealed, - "preventExtensions", ObjectPreventExtension, - "seal", ObjectSealJS - // deliverChangeRecords, getNotifier, observe and unobserve are added - // in object-observe.js. - ]); -} - -SetUpObject(); +%SetNativeFlag(GlobalObject); +%SetCode(GlobalObject, ObjectConstructor); + +%AddNamedProperty(GlobalObject.prototype, "constructor", GlobalObject, + DONT_ENUM); + +// Set up non-enumerable functions on the Object.prototype object. +InstallFunctions(GlobalObject.prototype, DONT_ENUM, [ + "toString", ObjectToString, + "toLocaleString", ObjectToLocaleString, + "valueOf", ObjectValueOf, + "hasOwnProperty", ObjectHasOwnProperty, + "isPrototypeOf", ObjectIsPrototypeOf, + "propertyIsEnumerable", ObjectPropertyIsEnumerable, + "__defineGetter__", ObjectDefineGetter, + "__lookupGetter__", ObjectLookupGetter, + "__defineSetter__", ObjectDefineSetter, + "__lookupSetter__", ObjectLookupSetter +]); +InstallGetterSetter(GlobalObject.prototype, "__proto__", ObjectGetProto, + ObjectSetProto); + +// Set up non-enumerable functions in the Object object. +InstallFunctions(GlobalObject, DONT_ENUM, [ + "keys", ObjectKeys, + "create", ObjectCreate, + "defineProperty", ObjectDefineProperty, + "defineProperties", ObjectDefineProperties, + "freeze", ObjectFreezeJS, + "getPrototypeOf", ObjectGetPrototypeOf, + "setPrototypeOf", ObjectSetPrototypeOf, + "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, + "getOwnPropertyNames", ObjectGetOwnPropertyNames, + // getOwnPropertySymbols is added in symbol.js. + "is", ObjectIs, + "isExtensible", ObjectIsExtensible, + "isFrozen", ObjectIsFrozen, + "isSealed", ObjectIsSealed, + "preventExtensions", ObjectPreventExtension, + "seal", ObjectSealJS + // deliverChangeRecords, getNotifier, observe and unobserve are added + // in object-observe.js. +]); // ---------------------------------------------------------------------------- @@ -1503,20 +1513,15 @@ function BooleanValueOf() { // ---------------------------------------------------------------------------- -function SetUpBoolean () { - %CheckIsBootstrapping(); - - %SetCode($Boolean, BooleanConstructor); - %FunctionSetPrototype($Boolean, new $Boolean(false)); - %AddNamedProperty($Boolean.prototype, "constructor", $Boolean, DONT_ENUM); +%SetCode(GlobalBoolean, BooleanConstructor); +%FunctionSetPrototype(GlobalBoolean, new GlobalBoolean(false)); +%AddNamedProperty(GlobalBoolean.prototype, "constructor", GlobalBoolean, + DONT_ENUM); - InstallFunctions($Boolean.prototype, DONT_ENUM, [ - "toString", BooleanToString, - "valueOf", BooleanValueOf - ]); -} - -SetUpBoolean(); +InstallFunctions(GlobalBoolean.prototype, DONT_ENUM, [ + "toString", BooleanToString, + "valueOf", BooleanValueOf +]); // ---------------------------------------------------------------------------- @@ -1672,7 +1677,9 @@ function NumberIsNaN(number) { function NumberIsSafeInteger(number) { if (NumberIsFinite(number)) { var integral = TO_INTEGER(number); - if (integral == number) return $abs(integral) <= $Number.MAX_SAFE_INTEGER; + if (integral == number) { + return $abs(integral) <= GlobalNumber.MAX_SAFE_INTEGER; + } } return false; } @@ -1680,59 +1687,54 @@ function NumberIsSafeInteger(number) { // ---------------------------------------------------------------------------- -function SetUpNumber() { - %CheckIsBootstrapping(); +%SetCode(GlobalNumber, NumberConstructor); +%FunctionSetPrototype(GlobalNumber, new GlobalNumber(0)); + +%OptimizeObjectForAddingMultipleProperties(GlobalNumber.prototype, 8); +// Set up the constructor property on the Number prototype object. +%AddNamedProperty(GlobalNumber.prototype, "constructor", GlobalNumber, + DONT_ENUM); + +InstallConstants(GlobalNumber, [ + // ECMA-262 section 15.7.3.1. + "MAX_VALUE", 1.7976931348623157e+308, + // ECMA-262 section 15.7.3.2. + "MIN_VALUE", 5e-324, + // ECMA-262 section 15.7.3.3. + "NaN", NAN, + // ECMA-262 section 15.7.3.4. + "NEGATIVE_INFINITY", -INFINITY, + // ECMA-262 section 15.7.3.5. + "POSITIVE_INFINITY", INFINITY, + + // --- Harmony constants (no spec refs until settled.) + + "MAX_SAFE_INTEGER", %_MathPow(2, 53) - 1, + "MIN_SAFE_INTEGER", -%_MathPow(2, 53) + 1, + "EPSILON", %_MathPow(2, -52) +]); - %SetCode($Number, NumberConstructor); - %FunctionSetPrototype($Number, new $Number(0)); - - %OptimizeObjectForAddingMultipleProperties($Number.prototype, 8); - // Set up the constructor property on the Number prototype object. - %AddNamedProperty($Number.prototype, "constructor", $Number, DONT_ENUM); - - InstallConstants($Number, [ - // ECMA-262 section 15.7.3.1. - "MAX_VALUE", 1.7976931348623157e+308, - // ECMA-262 section 15.7.3.2. - "MIN_VALUE", 5e-324, - // ECMA-262 section 15.7.3.3. - "NaN", NAN, - // ECMA-262 section 15.7.3.4. - "NEGATIVE_INFINITY", -INFINITY, - // ECMA-262 section 15.7.3.5. - "POSITIVE_INFINITY", INFINITY, - - // --- Harmony constants (no spec refs until settled.) - - "MAX_SAFE_INTEGER", %_MathPow(2, 53) - 1, - "MIN_SAFE_INTEGER", -%_MathPow(2, 53) + 1, - "EPSILON", %_MathPow(2, -52) - ]); - - // Set up non-enumerable functions on the Number prototype object. - InstallFunctions($Number.prototype, DONT_ENUM, [ - "toString", NumberToStringJS, - "toLocaleString", NumberToLocaleString, - "valueOf", NumberValueOf, - "toFixed", NumberToFixedJS, - "toExponential", NumberToExponentialJS, - "toPrecision", NumberToPrecisionJS - ]); - - // Harmony Number constructor additions - InstallFunctions($Number, DONT_ENUM, [ - "isFinite", NumberIsFinite, - "isInteger", NumberIsInteger, - "isNaN", NumberIsNaN, - "isSafeInteger", NumberIsSafeInteger, - "parseInt", GlobalParseInt, - "parseFloat", GlobalParseFloat - ]); - - %SetInlineBuiltinFlag(NumberIsNaN); -} - -SetUpNumber(); +// Set up non-enumerable functions on the Number prototype object. +InstallFunctions(GlobalNumber.prototype, DONT_ENUM, [ + "toString", NumberToStringJS, + "toLocaleString", NumberToLocaleString, + "valueOf", NumberValueOf, + "toFixed", NumberToFixedJS, + "toExponential", NumberToExponentialJS, + "toPrecision", NumberToPrecisionJS +]); + +// Harmony Number constructor additions +InstallFunctions(GlobalNumber, DONT_ENUM, [ + "isFinite", NumberIsFinite, + "isInteger", NumberIsInteger, + "isNaN", NumberIsNaN, + "isSafeInteger", NumberIsSafeInteger, + "parseInt", GlobalParseInt, + "parseFloat", GlobalParseFloat +]); + +%SetInlineBuiltinFlag(NumberIsNaN); // ---------------------------------------------------------------------------- @@ -1850,13 +1852,13 @@ function FunctionBind(this_arg) { // Length is 1. } -function NewFunctionString(arguments, function_token) { - var n = arguments.length; +function NewFunctionString(args, function_token) { + var n = args.length; var p = ''; if (n > 1) { - p = ToString(arguments[0]); + p = ToString(args[0]); for (var i = 1; i < n - 1; i++) { - p += ',' + ToString(arguments[i]); + p += ',' + ToString(args[i]); } // If the formal parameters string include ) - an illegal // character - it may make the combined function expression @@ -1869,7 +1871,7 @@ function NewFunctionString(arguments, function_token) { // comments we can include a trailing block comment to catch this. p += '\n/' + '**/'; } - var body = (n > 0) ? ToString(arguments[n - 1]) : ''; + var body = (n > 0) ? ToString(args[n - 1]) : ''; return '(' + function_token + '(' + p + ') {\n' + body + '\n})'; } @@ -1887,20 +1889,14 @@ function FunctionConstructor(arg1) { // length == 1 // ---------------------------------------------------------------------------- -function SetUpFunction() { - %CheckIsBootstrapping(); - - %SetCode($Function, FunctionConstructor); - %AddNamedProperty($Function.prototype, "constructor", $Function, DONT_ENUM); - - InstallFunctions($Function.prototype, DONT_ENUM, [ - "bind", FunctionBind, - "toString", FunctionToString - ]); -} - -SetUpFunction(); +%SetCode(GlobalFunction, FunctionConstructor); +%AddNamedProperty(GlobalFunction.prototype, "constructor", GlobalFunction, + DONT_ENUM); +InstallFunctions(GlobalFunction.prototype, DONT_ENUM, [ + "bind", FunctionBind, + "toString", FunctionToString +]); // ---------------------------------------------------------------------------- // Iterator related spec functions. @@ -1920,3 +1916,36 @@ function GetIterator(obj, method) { } return iterator; } + +//---------------------------------------------------------------------------- + +$delete = Delete; +$functionSourceString = FunctionSourceString; +$getIterator = GetIterator; +$getMethod = GetMethod; +$globalEval = GlobalEval; +$installConstants = InstallConstants; +$installFunctions = InstallFunctions; +$installGetter = InstallGetter; +$isFinite = GlobalIsFinite; +$isNaN = GlobalIsNaN; +$newFunctionString = NewFunctionString; +$numberIsNaN = NumberIsNaN; +$objectDefineProperties = ObjectDefineProperties; +$objectDefineProperty = ObjectDefineProperty; +$objectFreeze = ObjectFreezeJS; +$objectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor; +$objectGetOwnPropertyKeys = ObjectGetOwnPropertyKeys; +$objectHasOwnProperty = ObjectHasOwnProperty; +$objectIsFrozen = ObjectIsFrozen; +$objectIsSealed = ObjectIsSealed; +$objectLookupGetter = ObjectLookupGetter; +$objectLookupSetter = ObjectLookupSetter; +$objectToString = ObjectToString; +$overrideFunction = OverrideFunction; +$setFunctionName = SetFunctionName; +$setUpLockedPrototype = SetUpLockedPrototype; +$toCompletePropertyDescriptor = ToCompletePropertyDescriptor; +$toNameArray = ToNameArray; + +})(); diff --git a/src/weak-collection.js b/src/weak-collection.js index ccb2c35..9f20786 100644 --- a/src/weak-collection.js +++ b/src/weak-collection.js @@ -90,7 +90,7 @@ function WeakMapDelete(key) { DONT_ENUM | READ_ONLY); // Set up the non-enumerable functions on the WeakMap prototype object. -InstallFunctions(GlobalWeakMap.prototype, DONT_ENUM, [ +$installFunctions(GlobalWeakMap.prototype, DONT_ENUM, [ "get", WeakMapGet, "set", WeakMapSet, "has", WeakMapHas, @@ -162,7 +162,7 @@ function WeakSetDelete(value) { DONT_ENUM | READ_ONLY); // Set up the non-enumerable functions on the WeakSet prototype object. -InstallFunctions(GlobalWeakSet.prototype, DONT_ENUM, [ +$installFunctions(GlobalWeakSet.prototype, DONT_ENUM, [ "add", WeakSetAdd, "has", WeakSetHas, "delete", WeakSetDelete diff --git a/test/mjsunit/compiler/jsnatives.js b/test/mjsunit/compiler/jsnatives.js index f5d6ac4..ea2ecd2 100644 --- a/test/mjsunit/compiler/jsnatives.js +++ b/test/mjsunit/compiler/jsnatives.js @@ -29,5 +29,5 @@ // Test call of JS runtime functions. -var a = %GlobalParseInt("21", 16); -assertEquals(33, a); +var a = %$isNaN(0/0); +assertEquals(true, a); diff --git a/tools/jsmin.py b/tools/jsmin.py index 250dea9..cadc98b 100644 --- a/tools/jsmin.py +++ b/tools/jsmin.py @@ -100,6 +100,12 @@ class JavaScriptMinifier(object): The string that should replace the match in the rewritten program. """ matched_text = m.group(0) + + if matched_text.startswith("`") and matched_text.endswith("`"): + return re.sub(r"\$\{([\w$%]+)\}", + lambda m: '${' + self.FindNewName(m.group(1)) + '}', + matched_text) + if matched_text == "{": self.Push() return matched_text @@ -152,6 +158,9 @@ class JavaScriptMinifier(object): return self.map[var_name] if self.nesting == 0: return var_name + # Do not rename arguments object. + if var_name == 'arguments': + return 'arguments' while True: identifier_first_char = self.identifier_counter % 52 identifier_second_char = self.identifier_counter // 52 @@ -184,6 +193,8 @@ class JavaScriptMinifier(object): return entire_match if re.match(r'".*"$', entire_match): return entire_match + if re.match(r"`.*`$", entire_match): + return entire_match if re.match(r"/.+/$", entire_match): return entire_match return replacement @@ -227,8 +238,10 @@ class JavaScriptMinifier(object): # This regexp can handle embedded backslash-escaped characters including # embedded backslash-escaped double quotes. double_quoted_string = r'"(?:[^"\\]|\\.)*"' - # A regexp that matches a literal string surrounded by 'double quotes'. + # A regexp that matches a literal string surrounded by 'single quotes'. single_quoted_string = r"'(?:[^'\\]|\\.)*'" + # A regexp that matches a template string + template_string = r"`(?:[^'\\]|\\.)*`" # A regexp that matches a regexp literal surrounded by /slashes/. # Don't allow a regexp to have a ) before the first ( since that's a # syntax error and it's probably just two unrelated slashes. @@ -238,6 +251,7 @@ class JavaScriptMinifier(object): # Replace multiple spaces with a single space. line = re.sub("|".join([double_quoted_string, single_quoted_string, + template_string, slash_quoted_regexp, "( )+"]), self.RemoveSpaces, @@ -246,6 +260,7 @@ class JavaScriptMinifier(object): # and after the space. % and $ are counted as identifier characters. line = re.sub("|".join([double_quoted_string, single_quoted_string, + template_string, slash_quoted_regexp, r"(?