Now throws if its argument is already observed, or if the argument is
the global proxy.
BUG=371782
LOG=Y
R=jkummerow@chromium.org
Review URL: https://codereview.chromium.org/
274163002
git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21256
ce2b1a6d-e550-0410-aec6-
3dcde31c8c00
HandleScope scope(isolate);
ASSERT(args.length() == 1);
CONVERT_ARG_HANDLE_CHECKED(JSReceiver, obj, 0);
- ASSERT(!obj->IsJSGlobalProxy());
- if (obj->IsJSProxy())
- return isolate->heap()->undefined_value();
+ RUNTIME_ASSERT(!obj->IsJSGlobalProxy());
+ if (obj->IsJSProxy()) return isolate->heap()->undefined_value();
+ RUNTIME_ASSERT(!obj->map()->is_observed());
ASSERT(obj->IsJSObject());
JSObject::SetObserved(Handle<JSObject>::cast(obj));
--- /dev/null
+// Copyright 2014 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Flags: --allow-natives-syntax
+
+// These tests are meant to ensure that that the Object.observe runtime
+// functions are hardened.
+
+var obj = {};
+%SetIsObserved(obj);
+assertThrows(function() {
+ %SetIsObserved(obj);
+});
+
+assertThrows(function() {
+ %SetIsObserved(this);
+});