Commit beaccd74 authored by rossberg@chromium.org's avatar rossberg@chromium.org

Object.observe: implement map bit and functions to access it.

R=danno@chromium.org
BUG=

Review URL: https://codereview.chromium.org/11276028

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12866 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 83378890
...@@ -3159,6 +3159,16 @@ bool Map::owns_descriptors() { ...@@ -3159,6 +3159,16 @@ bool Map::owns_descriptors() {
} }
void Map::set_is_observed(bool is_observed) {
set_bit_field3(IsObserved::update(bit_field3(), is_observed));
}
bool Map::is_observed() {
return IsObserved::decode(bit_field3());
}
void Code::set_flags(Code::Flags flags) { void Code::set_flags(Code::Flags flags) {
STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1); STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1);
// Make sure that all call stubs have an arguments count. // Make sure that all call stubs have an arguments count.
......
...@@ -4704,6 +4704,7 @@ class Map: public HeapObject { ...@@ -4704,6 +4704,7 @@ class Map: public HeapObject {
class FunctionWithPrototype: public BitField<bool, 23, 1> {}; class FunctionWithPrototype: public BitField<bool, 23, 1> {};
class DictionaryMap: public BitField<bool, 24, 1> {}; class DictionaryMap: public BitField<bool, 24, 1> {};
class OwnsDescriptors: public BitField<bool, 25, 1> {}; class OwnsDescriptors: public BitField<bool, 25, 1> {};
class IsObserved: public BitField<bool, 26, 1> {};
// Tells whether the object in the prototype property will be used // Tells whether the object in the prototype property will be used
// for instances created from this function. If the prototype // for instances created from this function. If the prototype
...@@ -4971,6 +4972,8 @@ class Map: public HeapObject { ...@@ -4971,6 +4972,8 @@ class Map: public HeapObject {
inline bool owns_descriptors(); inline bool owns_descriptors();
inline void set_owns_descriptors(bool is_shared); inline void set_owns_descriptors(bool is_shared);
inline bool is_observed();
inline void set_is_observed(bool is_observed);
MUST_USE_RESULT MaybeObject* RawCopy(int instance_size); MUST_USE_RESULT MaybeObject* RawCopy(int instance_size);
MUST_USE_RESULT MaybeObject* CopyWithPreallocatedFieldDescriptors(); MUST_USE_RESULT MaybeObject* CopyWithPreallocatedFieldDescriptors();
......
...@@ -13222,6 +13222,29 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_HaveSameMap) { ...@@ -13222,6 +13222,29 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_HaveSameMap) {
return isolate->heap()->ToBoolean(obj1->map() == obj2->map()); return isolate->heap()->ToBoolean(obj1->map() == obj2->map());
} }
RUNTIME_FUNCTION(MaybeObject*, Runtime_IsObserved) {
ASSERT(args.length() == 1);
CONVERT_ARG_CHECKED(JSReceiver, obj, 0);
return isolate->heap()->ToBoolean(obj->map()->is_observed());
}
RUNTIME_FUNCTION(MaybeObject*, Runtime_SetIsObserved) {
ASSERT(args.length() == 2);
CONVERT_ARG_CHECKED(JSReceiver, obj, 0);
CONVERT_BOOLEAN_ARG_CHECKED(is_observed, 1);
if (obj->map()->is_observed() != is_observed) {
MaybeObject* maybe = obj->map()->Copy();
Map* map;
if (!maybe->To<Map>(&map)) return maybe;
map->set_is_observed(is_observed);
obj->set_map(map);
}
return isolate->heap()->undefined_value();
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Implementation of Runtime // Implementation of Runtime
......
...@@ -317,6 +317,10 @@ namespace internal { ...@@ -317,6 +317,10 @@ namespace internal {
F(WeakMapDelete, 2, 1) \ F(WeakMapDelete, 2, 1) \
F(WeakMapSet, 3, 1) \ F(WeakMapSet, 3, 1) \
\ \
/* Harmony observe */ \
F(IsObserved, 1, 1) \
F(SetIsObserved, 2, 1) \
\
/* Statements */ \ /* Statements */ \
F(NewClosure, 3, 1) \ F(NewClosure, 3, 1) \
F(NewObject, 1, 1) \ F(NewObject, 1, 1) \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment