Index: src/prologue.js |
diff --git a/src/prologue.js b/src/prologue.js |
index 8052a49b6ecbacd1845bd0a04ff8f830101794e4..93f562270d5a87992744d0c0b714df6b30cc3ce3 100644 |
--- a/src/prologue.js |
+++ b/src/prologue.js |
@@ -13,214 +13,45 @@ |
var imports = UNDEFINED; |
var exports = UNDEFINED; |
-var imports_from_experimental = UNDEFINED; |
-// Export to other scripts. |
-// In normal natives, this exports functions to other normal natives. |
-// In experimental natives, this exports to other experimental natives and |
-// to normal natives that import using utils.ImportFromExperimental. |
-function Export(f) { |
+utils.Export = function Export(f) { |
f.next = exports; |
exports = f; |
}; |
-// Import from other scripts. |
-// In normal natives, this imports from other normal natives. |
-// In experimental natives, this imports from other experimental natives and |
-// whitelisted exports from normal natives. |
-function Import(f) { |
+utils.Import = function Import(f) { |
f.next = imports; |
imports = f; |
}; |
- |
-// In normal natives, import from experimental natives. |
-// Not callable from experimental natives. |
-function ImportFromExperimental(f) { |
- f.next = imports_from_experimental; |
- imports_from_experimental = f; |
-}; |
- |
- |
-function SetFunctionName(f, name, prefix) { |
- if (IS_SYMBOL(name)) { |
- name = "[" + %SymbolDescription(name) + "]"; |
- } |
- if (IS_UNDEFINED(prefix)) { |
- %FunctionSetName(f, name); |
- } else { |
- %FunctionSetName(f, prefix + " " + name); |
- } |
-} |
- |
- |
-function InstallConstants(object, constants) { |
- %CheckIsBootstrapping(); |
- %OptimizeObjectForAddingMultipleProperties(object, constants.length >> 1); |
- var attributes = DONT_ENUM | DONT_DELETE | READ_ONLY; |
- for (var i = 0; i < constants.length; i += 2) { |
- var name = constants[i]; |
- var k = constants[i + 1]; |
- %AddNamedProperty(object, name, k, attributes); |
- } |
- %ToFastProperties(object); |
-} |
- |
- |
-function InstallFunctions(object, attributes, functions) { |
- %CheckIsBootstrapping(); |
- %OptimizeObjectForAddingMultipleProperties(object, functions.length >> 1); |
- for (var i = 0; i < functions.length; i += 2) { |
- var key = functions[i]; |
- var f = functions[i + 1]; |
- SetFunctionName(f, key); |
- %FunctionRemovePrototype(f); |
- %AddNamedProperty(object, key, f, attributes); |
- %SetNativeFlag(f); |
- } |
- %ToFastProperties(object); |
-} |
- |
- |
-// Helper function to install a getter-only accessor property. |
-function InstallGetter(object, name, getter, attributes) { |
- %CheckIsBootstrapping(); |
- if (typeof attributes == "undefined") { |
- attributes = DONT_ENUM; |
- } |
- SetFunctionName(getter, name, "get"); |
- %FunctionRemovePrototype(getter); |
- %DefineAccessorPropertyUnchecked(object, name, getter, null, attributes); |
- %SetNativeFlag(getter); |
-} |
- |
- |
-// Helper function to install a getter/setter accessor property. |
-function InstallGetterSetter(object, name, getter, setter) { |
- %CheckIsBootstrapping(); |
- SetFunctionName(getter, name, "get"); |
- SetFunctionName(setter, name, "set"); |
- %FunctionRemovePrototype(getter); |
- %FunctionRemovePrototype(setter); |
- %DefineAccessorPropertyUnchecked(object, name, getter, setter, DONT_ENUM); |
- %SetNativeFlag(getter); |
- %SetNativeFlag(setter); |
-} |
- |
- |
-// Prevents changes to the prototype of a built-in function. |
-// The "prototype" property of the function object is made non-configurable, |
-// and the prototype object is made non-extensible. The latter prevents |
-// changing the __proto__ property. |
-function SetUpLockedPrototype( |
- constructor, fields, methods) { |
- %CheckIsBootstrapping(); |
- var prototype = constructor.prototype; |
- // Install functions first, because this function is used to initialize |
- // PropertyDescriptor itself. |
- var property_count = (methods.length >> 1) + (fields ? fields.length : 0); |
- if (property_count >= 4) { |
- %OptimizeObjectForAddingMultipleProperties(prototype, property_count); |
- } |
- if (fields) { |
- for (var i = 0; i < fields.length; i++) { |
- %AddNamedProperty(prototype, fields[i], |
- UNDEFINED, DONT_ENUM | DONT_DELETE); |
- } |
- } |
- for (var i = 0; i < methods.length; i += 2) { |
- var key = methods[i]; |
- var f = methods[i + 1]; |
- %AddNamedProperty(prototype, key, f, DONT_ENUM | DONT_DELETE | READ_ONLY); |
- %SetNativeFlag(f); |
- } |
- %InternalSetPrototype(prototype, null); |
- %ToFastProperties(prototype); |
-} |
- |
// ----------------------------------------------------------------------- |
// To be called by bootstrapper |
-var experimental_exports = UNDEFINED; |
- |
-function PostNatives(utils) { |
+utils.PostNatives = function() { |
%CheckIsBootstrapping(); |
var container = {}; |
for ( ; !IS_UNDEFINED(exports); exports = exports.next) exports(container); |
for ( ; !IS_UNDEFINED(imports); imports = imports.next) imports(container); |
- // Whitelist of exports from normal natives to experimental natives. |
var expose_to_experimental = [ |
- "GetIterator", |
- "GetMethod", |
- "InnerArrayEvery", |
- "InnerArrayFilter", |
- "InnerArrayForEach", |
- "InnerArrayIndexOf", |
- "InnerArrayLastIndexOf", |
- "InnerArrayMap", |
- "InnerArrayReverse", |
- "InnerArraySome", |
- "InnerArraySort", |
- "IsNaN", |
"MathMax", |
"MathMin", |
- "ObjectIsFrozen", |
- "OwnPropertyKeys", |
- "ToNameArray", |
]; |
- experimental_exports = {}; |
+ var experimental = {}; |
%OptimizeObjectForAddingMultipleProperties( |
- experimental_exports, expose_to_experimental.length); |
- for (var key of expose_to_experimental) { |
- experimental_exports[key] = container[key]; |
- } |
- %ToFastProperties(experimental_exports); |
+ experimental, expose_to_experimental.length); |
+ for (var key of expose_to_experimental) experimental[key] = container[key]; |
+ %ToFastProperties(experimental); |
container = UNDEFINED; |
+ utils.Export = UNDEFINED; |
utils.PostNatives = UNDEFINED; |
- utils.ImportFromExperimental = UNDEFINED; |
+ utils.Import = function ImportFromExperimental(f) { |
+ f(experimental); |
+ }; |
}; |
- |
-function PostExperimentals(utils) { |
- %CheckIsBootstrapping(); |
- |
- for ( ; !IS_UNDEFINED(exports); exports = exports.next) { |
- exports(experimental_exports); |
- } |
- for ( ; !IS_UNDEFINED(imports); imports = imports.next) { |
- imports(experimental_exports); |
- } |
- for ( ; !IS_UNDEFINED(imports_from_experimental); |
- imports_from_experimental = imports_from_experimental.next) { |
- imports_from_experimental(experimental_exports); |
- } |
- |
- experimental_exports = UNDEFINED; |
- |
- utils.PostExperimentals = UNDEFINED; |
- utils.Import = UNDEFINED; |
- utils.Export = UNDEFINED; |
-}; |
- |
-// ----------------------------------------------------------------------- |
- |
-InstallFunctions(utils, NONE, [ |
- "Import", Import, |
- "Export", Export, |
- "ImportFromExperimental", ImportFromExperimental, |
- "SetFunctionName", SetFunctionName, |
- "InstallConstants", InstallConstants, |
- "InstallFunctions", InstallFunctions, |
- "InstallGetter", InstallGetter, |
- "InstallGetterSetter", InstallGetterSetter, |
- "SetUpLockedPrototype", SetUpLockedPrototype, |
- "PostNatives", PostNatives, |
- "PostExperimentals", PostExperimentals, |
-]); |
- |
}) |