summaryrefslogtreecommitdiff
path: root/src/3rdparty/v8/src/object-observe.js
diff options
context:
space:
mode:
authorPeter Varga <pvarga@inf.u-szeged.hu>2012-11-23 15:47:13 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-01-09 13:05:41 +0100
commit29614f3a7f84955e75dbdacdaa0abb18fc9e5231 (patch)
treea9a7d039ce37ae3af3b20699e732b8e7de496805 /src/3rdparty/v8/src/object-observe.js
parentf3e57accf67099f668b069b1e248b4d4e424385b (diff)
downloadqtjsbackend-29614f3a7f84955e75dbdacdaa0abb18fc9e5231.tar.gz
Updated V8 from git://github.com/v8/v8.git to 2215c442af2f0a4fce076e35ea061486d62778a1
Update V8 source to version 3.15.2 * Performance and stability improvements on all platforms. * Avoid overdeep recursion in regexp where a guarded expression with a minimum repetition count is inside another quantifier. * Exposed last seen heap object id via v8 public api. * Implemented heap profiler memory usage reporting. * Preserved error message during finally block in try..finally. * Improved heuristics to keep objects in fast mode with inherited constructors. * Fixed lazy sweeping heuristics to prevent old-space expansion. * Fixed sharing of literal boilerplates for optimized code. * Expose more detailed memory statistics. * Cleaned up hardfp ABI detection for ARM (V8 issue 2140). * Report "hidden properties" in heap profiler for properties case. * Added optimizing compiler support for JavaScript getters. * Fixed computation of call targets on prototypes in Crankshaft. * Fixed ICs for slow objects with native accessor. * Fixed transcendental cache on ARM in optimized code (issue 2234). * New heap inspection tools: counters for object sizes and counts, histograms for external fragmentation. * Added more support for heap analysis. * Interpret negative hexadecimal literals as NaN. (issue 2240) * Improved API calls that return empty handles. * Added checks for interceptors to negative lookup code in Crankshaft. * Introduced global contexts to represent lexical global scope(s). * Allocate block-scoped global bindings to global context. * Add empty-handle checks to API functions (#ifdef ENABLE_EXTRA_CHECKS) * Check the return value of API calls on ia32 and x64. * Activated fixed ES5 readonly semantics by default. * Added validity checking to API functions and calls. * Switched on code compaction on incremental GCs. * ARM: allowed VFP3 instructions when hardfloat is enabled. (Chromium issue 152506) * Killed off the SCons based build. (relevant for testing) * Added a faster API for creating v8::Integer objects. * Speeded up function deoptimization by avoiding quadratic pass over optimized function list. (Chromium issue 155270) * ES6: Added support for size to Set and Map (issue 2395) * ES6: Added support for Set and Map clear method (issue 2400) * Made formatting error message side-effect-free. (issue 2398) * Fixed V8 issues: 915, 1374, 1465, 1569, 1591, 1609 1645, 1804, 1914, 1981, 1991, 2016, 2017, 2034, 2077, 2087, 2094, 2119, 2120, 2133, 2134, 2139, 2143, 2151, 2156, 2166, 2170, 2172, 2177, 2179, 2185, 2193, 2194, 2201, 2210, 2212, 2219, 2220, 2225, 2239, 2245, 2252, 2260, 2261, 2294, 2297, 2308, 2312, 2313, 2317, 2318, 2322, 2326, 2364, 2372, 2380 Change-Id: Ifa82ec37b6150fdf1c4364c93987a32bbbf6bfd1 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/3rdparty/v8/src/object-observe.js')
-rw-r--r--src/3rdparty/v8/src/object-observe.js240
1 files changed, 240 insertions, 0 deletions
diff --git a/src/3rdparty/v8/src/object-observe.js b/src/3rdparty/v8/src/object-observe.js
new file mode 100644
index 0000000..28aa1f4
--- /dev/null
+++ b/src/3rdparty/v8/src/object-observe.js
@@ -0,0 +1,240 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * 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.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 THE COPYRIGHT
+// OWNER 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.
+
+"use strict";
+
+var InternalObjectIsFrozen = $Object.isFrozen;
+var InternalObjectFreeze = $Object.freeze;
+
+var observationState = %GetObservationState();
+if (IS_UNDEFINED(observationState.observerInfoMap)) {
+ observationState.observerInfoMap = %CreateObjectHashTable();
+ observationState.objectInfoMap = %CreateObjectHashTable();
+ observationState.notifierTargetMap = %CreateObjectHashTable();
+ observationState.activeObservers = new InternalArray;
+ observationState.observerPriority = 0;
+}
+
+function InternalObjectHashTable(tableName) {
+ this.tableName = tableName;
+}
+
+InternalObjectHashTable.prototype = {
+ get: function(key) {
+ return %ObjectHashTableGet(observationState[this.tableName], key);
+ },
+ set: function(key, value) {
+ observationState[this.tableName] =
+ %ObjectHashTableSet(observationState[this.tableName], key, value);
+ },
+ has: function(key) {
+ return %ObjectHashTableHas(observationState[this.tableName], key);
+ }
+};
+
+var observerInfoMap = new InternalObjectHashTable('observerInfoMap');
+var objectInfoMap = new InternalObjectHashTable('objectInfoMap');
+var notifierTargetMap = new InternalObjectHashTable('notifierTargetMap');
+
+function CreateObjectInfo(object) {
+ var info = {
+ changeObservers: new InternalArray,
+ notifier: null,
+ };
+ objectInfoMap.set(object, info);
+ return info;
+}
+
+function ObjectObserve(object, callback) {
+ if (!IS_SPEC_OBJECT(object))
+ throw MakeTypeError("observe_non_object", ["observe"]);
+ if (!IS_SPEC_FUNCTION(callback))
+ throw MakeTypeError("observe_non_function", ["observe"]);
+ if (InternalObjectIsFrozen(callback))
+ throw MakeTypeError("observe_callback_frozen");
+
+ if (!observerInfoMap.has(callback)) {
+ observerInfoMap.set(callback, {
+ pendingChangeRecords: null,
+ priority: observationState.observerPriority++,
+ });
+ }
+
+ var objectInfo = objectInfoMap.get(object);
+ if (IS_UNDEFINED(objectInfo)) {
+ objectInfo = CreateObjectInfo(object);
+ %SetIsObserved(object, true);
+ }
+
+ var changeObservers = objectInfo.changeObservers;
+ if (changeObservers.indexOf(callback) >= 0)
+ return;
+
+ changeObservers.push(callback);
+}
+
+function ObjectUnobserve(object, callback) {
+ if (!IS_SPEC_OBJECT(object))
+ throw MakeTypeError("observe_non_object", ["unobserve"]);
+
+ var objectInfo = objectInfoMap.get(object);
+ if (IS_UNDEFINED(objectInfo))
+ return;
+
+ var changeObservers = objectInfo.changeObservers;
+ var index = changeObservers.indexOf(callback);
+ if (index < 0)
+ return;
+
+ changeObservers.splice(index, 1);
+}
+
+function EnqueueChangeRecord(changeRecord, observers) {
+ for (var i = 0; i < observers.length; i++) {
+ var observer = observers[i];
+ var observerInfo = observerInfoMap.get(observer);
+ observationState.activeObservers[observerInfo.priority] = observer;
+ %SetObserverDeliveryPending();
+ if (IS_NULL(observerInfo.pendingChangeRecords)) {
+ observerInfo.pendingChangeRecords = new InternalArray(changeRecord);
+ } else {
+ observerInfo.pendingChangeRecords.push(changeRecord);
+ }
+ }
+}
+
+function NotifyChange(type, object, name, oldValue) {
+ var objectInfo = objectInfoMap.get(object);
+ var changeRecord = (arguments.length < 4) ?
+ { type: type, object: object, name: name } :
+ { type: type, object: object, name: name, oldValue: oldValue };
+ InternalObjectFreeze(changeRecord);
+ EnqueueChangeRecord(changeRecord, objectInfo.changeObservers);
+}
+
+var notifierPrototype = {};
+
+function ObjectNotifierNotify(changeRecord) {
+ if (!IS_SPEC_OBJECT(this))
+ throw MakeTypeError("called_on_non_object", ["notify"]);
+
+ var target = notifierTargetMap.get(this);
+ if (IS_UNDEFINED(target))
+ throw MakeTypeError("observe_notify_non_notifier");
+
+ if (!IS_STRING(changeRecord.type))
+ throw MakeTypeError("observe_type_non_string");
+
+ var objectInfo = objectInfoMap.get(target);
+ if (IS_UNDEFINED(objectInfo))
+ return;
+
+ if (!objectInfo.changeObservers.length)
+ return;
+
+ var newRecord = {
+ object: target
+ };
+ for (var prop in changeRecord) {
+ if (prop === 'object')
+ continue;
+ newRecord[prop] = changeRecord[prop];
+ }
+ InternalObjectFreeze(newRecord);
+
+ EnqueueChangeRecord(newRecord, objectInfo.changeObservers);
+}
+
+function ObjectGetNotifier(object) {
+ if (!IS_SPEC_OBJECT(object))
+ throw MakeTypeError("observe_non_object", ["getNotifier"]);
+
+ if (InternalObjectIsFrozen(object))
+ return null;
+
+ var objectInfo = objectInfoMap.get(object);
+ if (IS_UNDEFINED(objectInfo))
+ objectInfo = CreateObjectInfo(object);
+
+ if (IS_NULL(objectInfo.notifier)) {
+ objectInfo.notifier = {
+ __proto__: notifierPrototype
+ };
+ notifierTargetMap.set(objectInfo.notifier, object);
+ }
+
+ return objectInfo.notifier;
+}
+
+function DeliverChangeRecordsForObserver(observer) {
+ var observerInfo = observerInfoMap.get(observer);
+ if (IS_UNDEFINED(observerInfo))
+ return;
+
+ var pendingChangeRecords = observerInfo.pendingChangeRecords;
+ if (IS_NULL(pendingChangeRecords))
+ return;
+
+ observerInfo.pendingChangeRecords = null;
+ var delivered = [];
+ %MoveArrayContents(pendingChangeRecords, delivered);
+ try {
+ %Call(void 0, delivered, observer);
+ } catch (ex) {}
+}
+
+function ObjectDeliverChangeRecords(callback) {
+ if (!IS_SPEC_FUNCTION(callback))
+ throw MakeTypeError("observe_non_function", ["deliverChangeRecords"]);
+
+ DeliverChangeRecordsForObserver(callback);
+}
+
+function DeliverChangeRecords() {
+ while (observationState.activeObservers.length) {
+ var activeObservers = observationState.activeObservers;
+ observationState.activeObservers = new InternalArray;
+ for (var i in activeObservers) {
+ DeliverChangeRecordsForObserver(activeObservers[i]);
+ }
+ }
+}
+
+function SetupObjectObserve() {
+ %CheckIsBootstrapping();
+ InstallFunctions($Object, DONT_ENUM, $Array(
+ "deliverChangeRecords", ObjectDeliverChangeRecords,
+ "getNotifier", ObjectGetNotifier,
+ "observe", ObjectObserve,
+ "unobserve", ObjectUnobserve
+ ));
+ InstallFunctions(notifierPrototype, DONT_ENUM, $Array(
+ "notify", ObjectNotifierNotify
+ ));
+}
+
+SetupObjectObserve();