Reviewers: Toon Verwaest,

Description:
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

Please review this at https://codereview.chromium.org/307543008/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+17, -46 lines):
  M src/object-observe.js
  M src/runtime.h
  M src/runtime.cc


Index: src/object-observe.js
diff --git a/src/object-observe.js b/src/object-observe.js
index 03afd3f366b5b41b8a20e3c0d2e729dfa934e2cf..a875435bf0f7acb3da0717d49bafd3378002729e 100644
--- a/src/object-observe.js
+++ b/src/object-observe.js
@@ -368,7 +368,8 @@ function ObjectObserve(object, callback, acceptList) {
   if (ObjectIsFrozen(callback))
     throw MakeTypeError("observe_callback_frozen");

-  return %ObjectObserveInObjectContext(object, callback, acceptList);
+  var objectObserveFn = %GetObjectContextObjectObserve(object);
+  return objectObserveFn(object, callback, acceptList);
 }

 function NativeObjectObserve(object, callback, acceptList) {
@@ -543,8 +544,8 @@ function ObjectNotifierPerformChange(changeType, changeFn) {
   if (!IS_SPEC_FUNCTION(changeFn))
     throw MakeTypeError("observe_perform_non_function");

-  return %ObjectNotifierPerformChangeInObjectContext(
-      objectInfo, changeType, changeFn);
+  var performChangeFn = %GetObjectContextNotifierPerformChange(object);
+  performChangeFn(objectInfo, changeType, changeFn);
 }

function NativeObjectNotifierPerformChange(objectInfo, changeType, changeFn) {
@@ -571,7 +572,8 @@ function ObjectGetNotifier(object) {

   if (!%ObjectWasCreatedInCurrentOrigin(object)) return null;

-  return %ObjectGetNotifierInObjectContext(object);
+  var getNotifierFn = %GetObjectContextObjectGetNotifier(object);
+  return getNotifierFn(object);
 }

 function NativeObjectGetNotifier(object) {
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index 0bff90b8c0bac865eef8a2544679140e6bbe8202..fcfd8571dce3d4c4caf08342326ac28d5b2f9ad6 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -14902,64 +14902,33 @@ RUNTIME_FUNCTION(Runtime_ObjectWasCreatedInCurrentOrigin) {
 }


-RUNTIME_FUNCTION(Runtime_ObjectObserveInObjectContext) {
+RUNTIME_FUNCTION(Runtime_GetObjectContextObjectObserve) {
   HandleScope scope(isolate);
-  ASSERT(args.length() == 3);
+  ASSERT(args.length() == 1);
   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;
+  return context->native_object_observe();
 }


-RUNTIME_FUNCTION(Runtime_ObjectGetNotifierInObjectContext) {
+RUNTIME_FUNCTION(Runtime_GetObjectContextObjectGetNotifier) {
   HandleScope scope(isolate);
   ASSERT(args.length() == 1);
   CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);

   Handle<Context> context(object->GetCreationContext(), isolate);
- Handle<JSFunction> function(context->native_object_get_notifier(), isolate);
-  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;
+  return context->native_object_get_notifier();
 }


-RUNTIME_FUNCTION(Runtime_ObjectNotifierPerformChangeInObjectContext) {
+RUNTIME_FUNCTION(Runtime_GetObjectContextNotifierPerformChange) {
   HandleScope scope(isolate);
-  ASSERT(args.length() == 3);
+  ASSERT(args.length() == 1);
   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<JSFunction> function(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;
+  return context->native_object_notifier_perform_change();
 }


Index: src/runtime.h
diff --git a/src/runtime.h b/src/runtime.h
index 566a5ebeabef50f7c30c3f090752f0e2a8bc50b4..1e32d801d0a014c8ab8e9b5a35156f98d406d821 100644
--- a/src/runtime.h
+++ b/src/runtime.h
@@ -306,9 +306,9 @@ namespace internal {
   F(ObservationWeakMapCreate, 0, 1) \
   F(ObserverObjectAndRecordHaveSameOrigin, 3, 1) \
   F(ObjectWasCreatedInCurrentOrigin, 1, 1) \
-  F(ObjectObserveInObjectContext, 3, 1) \
-  F(ObjectGetNotifierInObjectContext, 1, 1) \
-  F(ObjectNotifierPerformChangeInObjectContext, 3, 1) \
+  F(GetObjectContextObjectObserve, 1, 1) \
+  F(GetObjectContextObjectGetNotifier, 1, 1) \
+  F(GetObjectContextNotifierPerformChange, 1, 1) \
   \
   /* Harmony typed arrays */ \
   F(ArrayBufferInitialize, 2, 1)\


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to