Simplify, speed-up correct-context ObjectObserve calls
The original patch which ensured that Object.observe did allocations in the correct context regressed performance about 12%. This patch gets back most of that (about 11%) by simply returning the correct function which is then directly callable from JS, rather than by making the call from the runtime function. A side-effect is that their implementation is shorter. LOG=Y BUG=NONE R=verwaest@chromium.org Review URL: https://codereview.chromium.org/307543008 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21575 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
20eeff9ae4
commit
74f92f21da
@ -368,7 +368,8 @@ function ObjectObserve(object, callback, acceptList) {
|
|||||||
if (ObjectIsFrozen(callback))
|
if (ObjectIsFrozen(callback))
|
||||||
throw MakeTypeError("observe_callback_frozen");
|
throw MakeTypeError("observe_callback_frozen");
|
||||||
|
|
||||||
return %ObjectObserveInObjectContext(object, callback, acceptList);
|
var objectObserveFn = %GetObjectContextObjectObserve(object);
|
||||||
|
return objectObserveFn(object, callback, acceptList);
|
||||||
}
|
}
|
||||||
|
|
||||||
function NativeObjectObserve(object, callback, acceptList) {
|
function NativeObjectObserve(object, callback, acceptList) {
|
||||||
@ -543,8 +544,8 @@ function ObjectNotifierPerformChange(changeType, changeFn) {
|
|||||||
if (!IS_SPEC_FUNCTION(changeFn))
|
if (!IS_SPEC_FUNCTION(changeFn))
|
||||||
throw MakeTypeError("observe_perform_non_function");
|
throw MakeTypeError("observe_perform_non_function");
|
||||||
|
|
||||||
return %ObjectNotifierPerformChangeInObjectContext(
|
var performChangeFn = %GetObjectContextNotifierPerformChange(objectInfo);
|
||||||
objectInfo, changeType, changeFn);
|
performChangeFn(objectInfo, changeType, changeFn);
|
||||||
}
|
}
|
||||||
|
|
||||||
function NativeObjectNotifierPerformChange(objectInfo, changeType, changeFn) {
|
function NativeObjectNotifierPerformChange(objectInfo, changeType, changeFn) {
|
||||||
@ -571,7 +572,8 @@ function ObjectGetNotifier(object) {
|
|||||||
|
|
||||||
if (!%ObjectWasCreatedInCurrentOrigin(object)) return null;
|
if (!%ObjectWasCreatedInCurrentOrigin(object)) return null;
|
||||||
|
|
||||||
return %ObjectGetNotifierInObjectContext(object);
|
var getNotifierFn = %GetObjectContextObjectGetNotifier(object);
|
||||||
|
return getNotifierFn(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
function NativeObjectGetNotifier(object) {
|
function NativeObjectGetNotifier(object) {
|
||||||
|
@ -14889,64 +14889,33 @@ RUNTIME_FUNCTION(Runtime_ObjectWasCreatedInCurrentOrigin) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RUNTIME_FUNCTION(Runtime_ObjectObserveInObjectContext) {
|
RUNTIME_FUNCTION(Runtime_GetObjectContextObjectObserve) {
|
||||||
HandleScope scope(isolate);
|
|
||||||
ASSERT(args.length() == 3);
|
|
||||||
CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
|
|
||||||
CONVERT_ARG_HANDLE_CHECKED(JSFunction, callback, 1);
|
|
||||||
CONVERT_ARG_HANDLE_CHECKED(Object, accept, 2);
|
|
||||||
|
|
||||||
Handle<Context> context(object->GetCreationContext(), isolate);
|
|
||||||
Handle<JSFunction> function(context->native_object_observe(), isolate);
|
|
||||||
Handle<Object> call_args[] = { object, callback, accept };
|
|
||||||
Handle<Object> result;
|
|
||||||
|
|
||||||
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
|
|
||||||
isolate, result,
|
|
||||||
Execution::Call(isolate, function,
|
|
||||||
handle(context->object_function(), isolate),
|
|
||||||
ARRAY_SIZE(call_args), call_args, true));
|
|
||||||
return *result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RUNTIME_FUNCTION(Runtime_ObjectGetNotifierInObjectContext) {
|
|
||||||
HandleScope scope(isolate);
|
HandleScope scope(isolate);
|
||||||
ASSERT(args.length() == 1);
|
ASSERT(args.length() == 1);
|
||||||
CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
|
CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
|
||||||
|
|
||||||
Handle<Context> context(object->GetCreationContext(), isolate);
|
Handle<Context> context(object->GetCreationContext(), isolate);
|
||||||
Handle<JSFunction> function(context->native_object_get_notifier(), isolate);
|
return context->native_object_observe();
|
||||||
Handle<Object> call_args[] = { object };
|
|
||||||
Handle<Object> result;
|
|
||||||
|
|
||||||
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
|
|
||||||
isolate, result,
|
|
||||||
Execution::Call(isolate, function,
|
|
||||||
handle(context->object_function(), isolate),
|
|
||||||
ARRAY_SIZE(call_args), call_args, true));
|
|
||||||
return *result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
RUNTIME_FUNCTION(Runtime_ObjectNotifierPerformChangeInObjectContext) {
|
RUNTIME_FUNCTION(Runtime_GetObjectContextObjectGetNotifier) {
|
||||||
HandleScope scope(isolate);
|
HandleScope scope(isolate);
|
||||||
ASSERT(args.length() == 3);
|
ASSERT(args.length() == 1);
|
||||||
|
CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
|
||||||
|
|
||||||
|
Handle<Context> context(object->GetCreationContext(), isolate);
|
||||||
|
return context->native_object_get_notifier();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RUNTIME_FUNCTION(Runtime_GetObjectContextNotifierPerformChange) {
|
||||||
|
HandleScope scope(isolate);
|
||||||
|
ASSERT(args.length() == 1);
|
||||||
CONVERT_ARG_HANDLE_CHECKED(JSObject, object_info, 0);
|
CONVERT_ARG_HANDLE_CHECKED(JSObject, object_info, 0);
|
||||||
CONVERT_ARG_HANDLE_CHECKED(String, change_type, 1);
|
|
||||||
CONVERT_ARG_HANDLE_CHECKED(JSFunction, change_fn, 2);
|
|
||||||
|
|
||||||
Handle<Context> context(object_info->GetCreationContext(), isolate);
|
Handle<Context> context(object_info->GetCreationContext(), isolate);
|
||||||
Handle<JSFunction> function(context->native_object_notifier_perform_change(),
|
return context->native_object_notifier_perform_change();
|
||||||
isolate);
|
|
||||||
Handle<Object> call_args[] = { object_info, change_type, change_fn };
|
|
||||||
Handle<Object> result;
|
|
||||||
|
|
||||||
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
|
|
||||||
isolate, result,
|
|
||||||
Execution::Call(isolate, function, isolate->factory()->undefined_value(),
|
|
||||||
ARRAY_SIZE(call_args), call_args, true));
|
|
||||||
return *result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -306,9 +306,9 @@ namespace internal {
|
|||||||
F(ObservationWeakMapCreate, 0, 1) \
|
F(ObservationWeakMapCreate, 0, 1) \
|
||||||
F(ObserverObjectAndRecordHaveSameOrigin, 3, 1) \
|
F(ObserverObjectAndRecordHaveSameOrigin, 3, 1) \
|
||||||
F(ObjectWasCreatedInCurrentOrigin, 1, 1) \
|
F(ObjectWasCreatedInCurrentOrigin, 1, 1) \
|
||||||
F(ObjectObserveInObjectContext, 3, 1) \
|
F(GetObjectContextObjectObserve, 1, 1) \
|
||||||
F(ObjectGetNotifierInObjectContext, 1, 1) \
|
F(GetObjectContextObjectGetNotifier, 1, 1) \
|
||||||
F(ObjectNotifierPerformChangeInObjectContext, 3, 1) \
|
F(GetObjectContextNotifierPerformChange, 1, 1) \
|
||||||
\
|
\
|
||||||
/* Harmony typed arrays */ \
|
/* Harmony typed arrays */ \
|
||||||
F(ArrayBufferInitialize, 2, 1)\
|
F(ArrayBufferInitialize, 2, 1)\
|
||||||
|
@ -2,6 +2,4 @@
|
|||||||
// AUTO-GENERATED BY tools/generate-runtime-tests.py, DO NOT MODIFY
|
// AUTO-GENERATED BY tools/generate-runtime-tests.py, DO NOT MODIFY
|
||||||
// Flags: --allow-natives-syntax --harmony
|
// Flags: --allow-natives-syntax --harmony
|
||||||
var _object_info = new Object();
|
var _object_info = new Object();
|
||||||
var _change_type = "foo";
|
%GetObjectContextNotifierPerformChange(_object_info);
|
||||||
var _change_fn = function() {};
|
|
||||||
%ObjectNotifierPerformChangeInObjectContext(_object_info, _change_type, _change_fn);
|
|
@ -2,6 +2,4 @@
|
|||||||
// AUTO-GENERATED BY tools/generate-runtime-tests.py, DO NOT MODIFY
|
// AUTO-GENERATED BY tools/generate-runtime-tests.py, DO NOT MODIFY
|
||||||
// Flags: --allow-natives-syntax --harmony
|
// Flags: --allow-natives-syntax --harmony
|
||||||
var _object = new Object();
|
var _object = new Object();
|
||||||
var _callback = function() {};
|
%GetObjectContextObjectGetNotifier(_object);
|
||||||
var _accept = new Object();
|
|
||||||
%ObjectObserveInObjectContext(_object, _callback, _accept);
|
|
@ -2,4 +2,4 @@
|
|||||||
// AUTO-GENERATED BY tools/generate-runtime-tests.py, DO NOT MODIFY
|
// AUTO-GENERATED BY tools/generate-runtime-tests.py, DO NOT MODIFY
|
||||||
// Flags: --allow-natives-syntax --harmony
|
// Flags: --allow-natives-syntax --harmony
|
||||||
var _object = new Object();
|
var _object = new Object();
|
||||||
%ObjectGetNotifierInObjectContext(_object);
|
%GetObjectContextObjectObserve(_object);
|
Loading…
Reference in New Issue
Block a user