X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/2d39b0e377c0896910ee49ae70082ba665faf986..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/builtins/ObjectConstructor.js?ds=inline diff --git a/builtins/ObjectConstructor.js b/builtins/ObjectConstructor.js new file mode 100644 index 0000000..eeec196 --- /dev/null +++ b/builtins/ObjectConstructor.js @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2015 Jordan Harband. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +function assign(target/*[*/, /*...*/sources/*] */) { + "use strict"; + + if (target == null) + throw new @TypeError("can't convert " + target + " to object"); + + var objTarget = @Object(target); + var s, nextSource, from, i, keys, nextKey, desc; + for (s = 1; s < arguments.length; ++s) { + nextSource = arguments[s]; + if (nextSource != null) { + from = @Object(nextSource); + // TODO: replace @objectKeys + @objectGetOwnPropertySymbols with single @OwnPropertyKeys c++ operation + keys = @objectKeys(from); + for (i = 0; i < keys.length; ++i) { + nextKey = keys[i]; + desc = @objectGetOwnPropertyDescriptor(from, nextKey); + if (typeof desc !== "undefined" && desc.enumerable) { + objTarget[nextKey] = from[nextKey]; + } + } + keys = @objectGetOwnPropertySymbols(from); + for (i = 0; i < keys.length; ++i) { + nextKey = keys[i]; + desc = @objectGetOwnPropertyDescriptor(from, nextKey); + if (typeof desc !== "undefined" && desc.enumerable) { + objTarget[nextKey] = from[nextKey]; + } + } + } + } + return objTarget; +}