Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1535)

Side by Side Diff: src/v8natives.js

Issue 1065863003: Use array literals instead of array constructor in native javascript. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase and fix Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/uri.js ('k') | src/weak-collection.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This file relies on the fact that the following declarations have been made 5 // This file relies on the fact that the following declarations have been made
6 // in runtime.js: 6 // in runtime.js:
7 // var $Object = global.Object; 7 // var $Object = global.Object;
8 // var $Boolean = global.Boolean; 8 // var $Boolean = global.Boolean;
9 // var $Number = global.Number; 9 // var $Number = global.Number;
10 // var $Function = global.Function; 10 // var $Function = global.Function;
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 // ECMA 262 - 15.1.1.1. 194 // ECMA 262 - 15.1.1.1.
195 %AddNamedProperty(global, "NaN", NAN, attributes); 195 %AddNamedProperty(global, "NaN", NAN, attributes);
196 196
197 // ECMA-262 - 15.1.1.2. 197 // ECMA-262 - 15.1.1.2.
198 %AddNamedProperty(global, "Infinity", INFINITY, attributes); 198 %AddNamedProperty(global, "Infinity", INFINITY, attributes);
199 199
200 // ECMA-262 - 15.1.1.3. 200 // ECMA-262 - 15.1.1.3.
201 %AddNamedProperty(global, "undefined", UNDEFINED, attributes); 201 %AddNamedProperty(global, "undefined", UNDEFINED, attributes);
202 202
203 // Set up non-enumerable function on the global object. 203 // Set up non-enumerable function on the global object.
204 InstallFunctions(global, DONT_ENUM, $Array( 204 InstallFunctions(global, DONT_ENUM, [
205 "isNaN", GlobalIsNaN, 205 "isNaN", GlobalIsNaN,
206 "isFinite", GlobalIsFinite, 206 "isFinite", GlobalIsFinite,
207 "parseInt", GlobalParseInt, 207 "parseInt", GlobalParseInt,
208 "parseFloat", GlobalParseFloat, 208 "parseFloat", GlobalParseFloat,
209 "eval", GlobalEval 209 "eval", GlobalEval
210 )); 210 ]);
211 } 211 }
212 212
213 SetUpGlobal(); 213 SetUpGlobal();
214 214
215 215
216 // ---------------------------------------------------------------------------- 216 // ----------------------------------------------------------------------------
217 // Object 217 // Object
218 218
219 var DefaultObjectToString = ObjectToString; 219 var DefaultObjectToString = ObjectToString;
220 // ECMA-262 - 15.2.4.2 220 // ECMA-262 - 15.2.4.2
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 this.enumerable_ = false; 502 this.enumerable_ = false;
503 this.hasEnumerable_ = false; 503 this.hasEnumerable_ = false;
504 this.configurable_ = false; 504 this.configurable_ = false;
505 this.hasConfigurable_ = false; 505 this.hasConfigurable_ = false;
506 this.get_ = UNDEFINED; 506 this.get_ = UNDEFINED;
507 this.hasGetter_ = false; 507 this.hasGetter_ = false;
508 this.set_ = UNDEFINED; 508 this.set_ = UNDEFINED;
509 this.hasSetter_ = false; 509 this.hasSetter_ = false;
510 } 510 }
511 511
512 SetUpLockedPrototype(PropertyDescriptor, $Array( 512 SetUpLockedPrototype(PropertyDescriptor, [
513 "value_", 513 "value_",
514 "hasValue_", 514 "hasValue_",
515 "writable_", 515 "writable_",
516 "hasWritable_", 516 "hasWritable_",
517 "enumerable_", 517 "enumerable_",
518 "hasEnumerable_", 518 "hasEnumerable_",
519 "configurable_", 519 "configurable_",
520 "hasConfigurable_", 520 "hasConfigurable_",
521 "get_", 521 "get_",
522 "hasGetter_", 522 "hasGetter_",
523 "set_", 523 "set_",
524 "hasSetter_" 524 "hasSetter_"
525 ), $Array( 525 ], [
526 "toString", function PropertyDescriptor_ToString() { 526 "toString", function PropertyDescriptor_ToString() {
527 return "[object PropertyDescriptor]"; 527 return "[object PropertyDescriptor]";
528 }, 528 },
529 "setValue", function PropertyDescriptor_SetValue(value) { 529 "setValue", function PropertyDescriptor_SetValue(value) {
530 this.value_ = value; 530 this.value_ = value;
531 this.hasValue_ = true; 531 this.hasValue_ = true;
532 }, 532 },
533 "getValue", function PropertyDescriptor_GetValue() { 533 "getValue", function PropertyDescriptor_GetValue() {
534 return this.value_; 534 return this.value_;
535 }, 535 },
536 "hasValue", function PropertyDescriptor_HasValue() { 536 "hasValue", function PropertyDescriptor_HasValue() {
537 return this.hasValue_; 537 return this.hasValue_;
538 }, 538 },
539 "setEnumerable", function PropertyDescriptor_SetEnumerable(enumerable) { 539 "setEnumerable", function PropertyDescriptor_SetEnumerable(enumerable) {
540 this.enumerable_ = enumerable; 540 this.enumerable_ = enumerable;
541 this.hasEnumerable_ = true; 541 this.hasEnumerable_ = true;
542 }, 542 },
543 "isEnumerable", function PropertyDescriptor_IsEnumerable() { 543 "isEnumerable", function PropertyDescriptor_IsEnumerable() {
544 return this.enumerable_; 544 return this.enumerable_;
545 }, 545 },
546 "hasEnumerable", function PropertyDescriptor_HasEnumerable() { 546 "hasEnumerable", function PropertyDescriptor_HasEnumerable() {
547 return this.hasEnumerable_; 547 return this.hasEnumerable_;
548 }, 548 },
549 "setWritable", function PropertyDescriptor_SetWritable(writable) { 549 "setWritable", function PropertyDescriptor_SetWritable(writable) {
550 this.writable_ = writable; 550 this.writable_ = writable;
551 this.hasWritable_ = true; 551 this.hasWritable_ = true;
552 }, 552 },
553 "isWritable", function PropertyDescriptor_IsWritable() { 553 "isWritable", function PropertyDescriptor_IsWritable() {
554 return this.writable_; 554 return this.writable_;
555 }, 555 },
556 "hasWritable", function PropertyDescriptor_HasWritable() { 556 "hasWritable", function PropertyDescriptor_HasWritable() {
557 return this.hasWritable_; 557 return this.hasWritable_;
558 }, 558 },
559 "setConfigurable", 559 "setConfigurable",
560 function PropertyDescriptor_SetConfigurable(configurable) { 560 function PropertyDescriptor_SetConfigurable(configurable) {
561 this.configurable_ = configurable; 561 this.configurable_ = configurable;
562 this.hasConfigurable_ = true; 562 this.hasConfigurable_ = true;
563 }, 563 },
564 "hasConfigurable", function PropertyDescriptor_HasConfigurable() { 564 "hasConfigurable", function PropertyDescriptor_HasConfigurable() {
565 return this.hasConfigurable_; 565 return this.hasConfigurable_;
566 }, 566 },
567 "isConfigurable", function PropertyDescriptor_IsConfigurable() { 567 "isConfigurable", function PropertyDescriptor_IsConfigurable() {
568 return this.configurable_; 568 return this.configurable_;
569 }, 569 },
570 "setGet", function PropertyDescriptor_SetGetter(get) { 570 "setGet", function PropertyDescriptor_SetGetter(get) {
571 this.get_ = get; 571 this.get_ = get;
572 this.hasGetter_ = true; 572 this.hasGetter_ = true;
573 }, 573 },
574 "getGet", function PropertyDescriptor_GetGetter() { 574 "getGet", function PropertyDescriptor_GetGetter() {
575 return this.get_; 575 return this.get_;
576 }, 576 },
577 "hasGetter", function PropertyDescriptor_HasGetter() { 577 "hasGetter", function PropertyDescriptor_HasGetter() {
578 return this.hasGetter_; 578 return this.hasGetter_;
579 }, 579 },
580 "setSet", function PropertyDescriptor_SetSetter(set) { 580 "setSet", function PropertyDescriptor_SetSetter(set) {
581 this.set_ = set; 581 this.set_ = set;
582 this.hasSetter_ = true; 582 this.hasSetter_ = true;
583 }, 583 },
584 "getSet", function PropertyDescriptor_GetSetter() { 584 "getSet", function PropertyDescriptor_GetSetter() {
585 return this.set_; 585 return this.set_;
586 }, 586 },
587 "hasSetter", function PropertyDescriptor_HasSetter() { 587 "hasSetter", function PropertyDescriptor_HasSetter() {
588 return this.hasSetter_; 588 return this.hasSetter_;
589 })); 589 }
590 ]);
590 591
591 592
592 // Converts an array returned from Runtime_GetOwnProperty to an actual 593 // Converts an array returned from Runtime_GetOwnProperty to an actual
593 // property descriptor. For a description of the array layout please 594 // property descriptor. For a description of the array layout please
594 // see the runtime.cc file. 595 // see the runtime.cc file.
595 function ConvertDescriptorArrayToDescriptor(desc_array) { 596 function ConvertDescriptorArrayToDescriptor(desc_array) {
596 if (IS_UNDEFINED(desc_array)) { 597 if (IS_UNDEFINED(desc_array)) {
597 return UNDEFINED; 598 return UNDEFINED;
598 } 599 }
599 600
(...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after
1423 1424
1424 function SetUpObject() { 1425 function SetUpObject() {
1425 %CheckIsBootstrapping(); 1426 %CheckIsBootstrapping();
1426 1427
1427 %SetNativeFlag($Object); 1428 %SetNativeFlag($Object);
1428 %SetCode($Object, ObjectConstructor); 1429 %SetCode($Object, ObjectConstructor);
1429 1430
1430 %AddNamedProperty($Object.prototype, "constructor", $Object, DONT_ENUM); 1431 %AddNamedProperty($Object.prototype, "constructor", $Object, DONT_ENUM);
1431 1432
1432 // Set up non-enumerable functions on the Object.prototype object. 1433 // Set up non-enumerable functions on the Object.prototype object.
1433 InstallFunctions($Object.prototype, DONT_ENUM, $Array( 1434 InstallFunctions($Object.prototype, DONT_ENUM, [
1434 "toString", ObjectToString, 1435 "toString", ObjectToString,
1435 "toLocaleString", ObjectToLocaleString, 1436 "toLocaleString", ObjectToLocaleString,
1436 "valueOf", ObjectValueOf, 1437 "valueOf", ObjectValueOf,
1437 "hasOwnProperty", ObjectHasOwnProperty, 1438 "hasOwnProperty", ObjectHasOwnProperty,
1438 "isPrototypeOf", ObjectIsPrototypeOf, 1439 "isPrototypeOf", ObjectIsPrototypeOf,
1439 "propertyIsEnumerable", ObjectPropertyIsEnumerable, 1440 "propertyIsEnumerable", ObjectPropertyIsEnumerable,
1440 "__defineGetter__", ObjectDefineGetter, 1441 "__defineGetter__", ObjectDefineGetter,
1441 "__lookupGetter__", ObjectLookupGetter, 1442 "__lookupGetter__", ObjectLookupGetter,
1442 "__defineSetter__", ObjectDefineSetter, 1443 "__defineSetter__", ObjectDefineSetter,
1443 "__lookupSetter__", ObjectLookupSetter 1444 "__lookupSetter__", ObjectLookupSetter
1444 )); 1445 ]);
1445 InstallGetterSetter($Object.prototype, "__proto__", 1446 InstallGetterSetter($Object.prototype, "__proto__",
1446 ObjectGetProto, ObjectSetProto); 1447 ObjectGetProto, ObjectSetProto);
1447 1448
1448 // Set up non-enumerable functions in the Object object. 1449 // Set up non-enumerable functions in the Object object.
1449 InstallFunctions($Object, DONT_ENUM, $Array( 1450 InstallFunctions($Object, DONT_ENUM, [
1450 "keys", ObjectKeys, 1451 "keys", ObjectKeys,
1451 "create", ObjectCreate, 1452 "create", ObjectCreate,
1452 "defineProperty", ObjectDefineProperty, 1453 "defineProperty", ObjectDefineProperty,
1453 "defineProperties", ObjectDefineProperties, 1454 "defineProperties", ObjectDefineProperties,
1454 "freeze", ObjectFreezeJS, 1455 "freeze", ObjectFreezeJS,
1455 "getPrototypeOf", ObjectGetPrototypeOf, 1456 "getPrototypeOf", ObjectGetPrototypeOf,
1456 "setPrototypeOf", ObjectSetPrototypeOf, 1457 "setPrototypeOf", ObjectSetPrototypeOf,
1457 "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor, 1458 "getOwnPropertyDescriptor", ObjectGetOwnPropertyDescriptor,
1458 "getOwnPropertyNames", ObjectGetOwnPropertyNames, 1459 "getOwnPropertyNames", ObjectGetOwnPropertyNames,
1459 // getOwnPropertySymbols is added in symbol.js. 1460 // getOwnPropertySymbols is added in symbol.js.
1460 "is", ObjectIs, 1461 "is", ObjectIs,
1461 "isExtensible", ObjectIsExtensible, 1462 "isExtensible", ObjectIsExtensible,
1462 "isFrozen", ObjectIsFrozen, 1463 "isFrozen", ObjectIsFrozen,
1463 "isSealed", ObjectIsSealed, 1464 "isSealed", ObjectIsSealed,
1464 "preventExtensions", ObjectPreventExtension, 1465 "preventExtensions", ObjectPreventExtension,
1465 "seal", ObjectSealJS 1466 "seal", ObjectSealJS
1466 // deliverChangeRecords, getNotifier, observe and unobserve are added 1467 // deliverChangeRecords, getNotifier, observe and unobserve are added
1467 // in object-observe.js. 1468 // in object-observe.js.
1468 )); 1469 ]);
1469 } 1470 }
1470 1471
1471 SetUpObject(); 1472 SetUpObject();
1472 1473
1473 1474
1474 // ---------------------------------------------------------------------------- 1475 // ----------------------------------------------------------------------------
1475 // Boolean 1476 // Boolean
1476 1477
1477 function BooleanConstructor(x) { 1478 function BooleanConstructor(x) {
1478 if (%_IsConstructCall()) { 1479 if (%_IsConstructCall()) {
(...skipping 30 matching lines...) Expand all
1509 1510
1510 // ---------------------------------------------------------------------------- 1511 // ----------------------------------------------------------------------------
1511 1512
1512 function SetUpBoolean () { 1513 function SetUpBoolean () {
1513 %CheckIsBootstrapping(); 1514 %CheckIsBootstrapping();
1514 1515
1515 %SetCode($Boolean, BooleanConstructor); 1516 %SetCode($Boolean, BooleanConstructor);
1516 %FunctionSetPrototype($Boolean, new $Object()); 1517 %FunctionSetPrototype($Boolean, new $Object());
1517 %AddNamedProperty($Boolean.prototype, "constructor", $Boolean, DONT_ENUM); 1518 %AddNamedProperty($Boolean.prototype, "constructor", $Boolean, DONT_ENUM);
1518 1519
1519 InstallFunctions($Boolean.prototype, DONT_ENUM, $Array( 1520 InstallFunctions($Boolean.prototype, DONT_ENUM, [
1520 "toString", BooleanToString, 1521 "toString", BooleanToString,
1521 "valueOf", BooleanValueOf 1522 "valueOf", BooleanValueOf
1522 )); 1523 ]);
1523 } 1524 }
1524 1525
1525 SetUpBoolean(); 1526 SetUpBoolean();
1526 1527
1527 1528
1528 // ---------------------------------------------------------------------------- 1529 // ----------------------------------------------------------------------------
1529 // Number 1530 // Number
1530 1531
1531 function NumberConstructor(x) { 1532 function NumberConstructor(x) {
1532 var value = %_ArgumentsLength() == 0 ? 0 : ToNumber(x); 1533 var value = %_ArgumentsLength() == 0 ? 0 : ToNumber(x);
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1691 function SetUpNumber() { 1692 function SetUpNumber() {
1692 %CheckIsBootstrapping(); 1693 %CheckIsBootstrapping();
1693 1694
1694 %SetCode($Number, NumberConstructor); 1695 %SetCode($Number, NumberConstructor);
1695 %FunctionSetPrototype($Number, new $Object()); 1696 %FunctionSetPrototype($Number, new $Object());
1696 1697
1697 %OptimizeObjectForAddingMultipleProperties($Number.prototype, 8); 1698 %OptimizeObjectForAddingMultipleProperties($Number.prototype, 8);
1698 // Set up the constructor property on the Number prototype object. 1699 // Set up the constructor property on the Number prototype object.
1699 %AddNamedProperty($Number.prototype, "constructor", $Number, DONT_ENUM); 1700 %AddNamedProperty($Number.prototype, "constructor", $Number, DONT_ENUM);
1700 1701
1701 InstallConstants($Number, $Array( 1702 InstallConstants($Number, [
1702 // ECMA-262 section 15.7.3.1. 1703 // ECMA-262 section 15.7.3.1.
1703 "MAX_VALUE", 1.7976931348623157e+308, 1704 "MAX_VALUE", 1.7976931348623157e+308,
1704 // ECMA-262 section 15.7.3.2. 1705 // ECMA-262 section 15.7.3.2.
1705 "MIN_VALUE", 5e-324, 1706 "MIN_VALUE", 5e-324,
1706 // ECMA-262 section 15.7.3.3. 1707 // ECMA-262 section 15.7.3.3.
1707 "NaN", NAN, 1708 "NaN", NAN,
1708 // ECMA-262 section 15.7.3.4. 1709 // ECMA-262 section 15.7.3.4.
1709 "NEGATIVE_INFINITY", -INFINITY, 1710 "NEGATIVE_INFINITY", -INFINITY,
1710 // ECMA-262 section 15.7.3.5. 1711 // ECMA-262 section 15.7.3.5.
1711 "POSITIVE_INFINITY", INFINITY, 1712 "POSITIVE_INFINITY", INFINITY,
1712 1713
1713 // --- Harmony constants (no spec refs until settled.) 1714 // --- Harmony constants (no spec refs until settled.)
1714 1715
1715 "MAX_SAFE_INTEGER", %_MathPow(2, 53) - 1, 1716 "MAX_SAFE_INTEGER", %_MathPow(2, 53) - 1,
1716 "MIN_SAFE_INTEGER", -%_MathPow(2, 53) + 1, 1717 "MIN_SAFE_INTEGER", -%_MathPow(2, 53) + 1,
1717 "EPSILON", %_MathPow(2, -52) 1718 "EPSILON", %_MathPow(2, -52)
1718 )); 1719 ]);
1719 1720
1720 // Set up non-enumerable functions on the Number prototype object. 1721 // Set up non-enumerable functions on the Number prototype object.
1721 InstallFunctions($Number.prototype, DONT_ENUM, $Array( 1722 InstallFunctions($Number.prototype, DONT_ENUM, [
1722 "toString", NumberToStringJS, 1723 "toString", NumberToStringJS,
1723 "toLocaleString", NumberToLocaleString, 1724 "toLocaleString", NumberToLocaleString,
1724 "valueOf", NumberValueOf, 1725 "valueOf", NumberValueOf,
1725 "toFixed", NumberToFixedJS, 1726 "toFixed", NumberToFixedJS,
1726 "toExponential", NumberToExponentialJS, 1727 "toExponential", NumberToExponentialJS,
1727 "toPrecision", NumberToPrecisionJS 1728 "toPrecision", NumberToPrecisionJS
1728 )); 1729 ]);
1729 1730
1730 // Harmony Number constructor additions 1731 // Harmony Number constructor additions
1731 InstallFunctions($Number, DONT_ENUM, $Array( 1732 InstallFunctions($Number, DONT_ENUM, [
1732 "isFinite", NumberIsFinite, 1733 "isFinite", NumberIsFinite,
1733 "isInteger", NumberIsInteger, 1734 "isInteger", NumberIsInteger,
1734 "isNaN", NumberIsNaN, 1735 "isNaN", NumberIsNaN,
1735 "isSafeInteger", NumberIsSafeInteger, 1736 "isSafeInteger", NumberIsSafeInteger,
1736 "parseInt", GlobalParseInt, 1737 "parseInt", GlobalParseInt,
1737 "parseFloat", GlobalParseFloat 1738 "parseFloat", GlobalParseFloat
1738 )); 1739 ]);
1739 1740
1740 %SetInlineBuiltinFlag(NumberIsNaN); 1741 %SetInlineBuiltinFlag(NumberIsNaN);
1741 } 1742 }
1742 1743
1743 SetUpNumber(); 1744 SetUpNumber();
1744 1745
1745 1746
1746 // ---------------------------------------------------------------------------- 1747 // ----------------------------------------------------------------------------
1747 // Function 1748 // Function
1748 1749
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1887 1888
1888 1889
1889 // ---------------------------------------------------------------------------- 1890 // ----------------------------------------------------------------------------
1890 1891
1891 function SetUpFunction() { 1892 function SetUpFunction() {
1892 %CheckIsBootstrapping(); 1893 %CheckIsBootstrapping();
1893 1894
1894 %SetCode($Function, FunctionConstructor); 1895 %SetCode($Function, FunctionConstructor);
1895 %AddNamedProperty($Function.prototype, "constructor", $Function, DONT_ENUM); 1896 %AddNamedProperty($Function.prototype, "constructor", $Function, DONT_ENUM);
1896 1897
1897 InstallFunctions($Function.prototype, DONT_ENUM, $Array( 1898 InstallFunctions($Function.prototype, DONT_ENUM, [
1898 "bind", FunctionBind, 1899 "bind", FunctionBind,
1899 "toString", FunctionToString 1900 "toString", FunctionToString
1900 )); 1901 ]);
1901 } 1902 }
1902 1903
1903 SetUpFunction(); 1904 SetUpFunction();
1904 1905
1905 1906
1906 // ---------------------------------------------------------------------------- 1907 // ----------------------------------------------------------------------------
1907 // Iterator related spec functions. 1908 // Iterator related spec functions.
1908 1909
1909 // ES6 rev 33, 2015-02-12 1910 // ES6 rev 33, 2015-02-12
1910 // 7.4.1 GetIterator ( obj, method ) 1911 // 7.4.1 GetIterator ( obj, method )
1911 function GetIterator(obj, method) { 1912 function GetIterator(obj, method) {
1912 if (IS_UNDEFINED(method)) { 1913 if (IS_UNDEFINED(method)) {
1913 method = obj[symbolIterator]; 1914 method = obj[symbolIterator];
1914 } 1915 }
1915 if (!IS_SPEC_FUNCTION(method)) { 1916 if (!IS_SPEC_FUNCTION(method)) {
1916 throw MakeTypeError('not_iterable', [obj]); 1917 throw MakeTypeError('not_iterable', [obj]);
1917 } 1918 }
1918 var iterator = %_CallFunction(obj, method); 1919 var iterator = %_CallFunction(obj, method);
1919 if (!IS_SPEC_OBJECT(iterator)) { 1920 if (!IS_SPEC_OBJECT(iterator)) {
1920 throw MakeTypeError('not_an_iterator', [iterator]); 1921 throw MakeTypeError('not_an_iterator', [iterator]);
1921 } 1922 }
1922 return iterator; 1923 return iterator;
1923 } 1924 }
OLDNEW
« no previous file with comments | « src/uri.js ('k') | src/weak-collection.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698