From 5cb22f6d6f7b815e0c528cf2caebf52f6625cbf1 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Fri, 2 Mar 2018 11:46:20 +0100 Subject: [PATCH 1/5] src: add incr/decr operators for Reference This commit adds operator overloads for increment/decrement to AliasedBuffer::Reference. The motivation for doing this is to hopefully make code that needs to increment/decrement a little simpler. --- src/aliased_buffer.h | 24 ++++++++++++++++++++++++ src/env-inl.h | 16 +++++++--------- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/aliased_buffer.h b/src/aliased_buffer.h index b99b01f5d94ca2..0990ce576934af 100644 --- a/src/aliased_buffer.h +++ b/src/aliased_buffer.h @@ -141,6 +141,30 @@ class AliasedBuffer { return aliased_buffer_->GetValue(index_); } + template + inline Reference& operator+=(const T& val) { + const T current = aliased_buffer_->GetValue(index_); + aliased_buffer_->SetValue(index_, current + val); + return *this; + } + + inline Reference& operator+=(const Reference& val) { + this->operator+=(static_cast(val)); + return *this; + } + + template + inline Reference& operator-=(const T& val) { + const T current = aliased_buffer_->GetValue(index_); + aliased_buffer_->SetValue(index_, current - val); + return *this; + } + + inline Reference& operator-=(const Reference& val) { + this->operator-=(static_cast(val)); + return *this; + } + private: AliasedBuffer* aliased_buffer_; size_t index_; diff --git a/src/env-inl.h b/src/env-inl.h index a91ef578c8a04a..55649e8bc5f1f8 100644 --- a/src/env-inl.h +++ b/src/env-inl.h @@ -112,8 +112,7 @@ inline v8::Local Environment::AsyncHooks::provider_string(int idx) { } inline void Environment::AsyncHooks::no_force_checks() { - // fields_ does not have the -= operator defined - fields_[kCheck] = fields_[kCheck] - 1; + fields_[kCheck] -= 1; } inline Environment* Environment::AsyncHooks::env() { @@ -135,7 +134,7 @@ inline void Environment::AsyncHooks::push_async_ids(double async_id, grow_async_ids_stack(); async_ids_stack_[2 * offset] = async_id_fields_[kExecutionAsyncId]; async_ids_stack_[2 * offset + 1] = async_id_fields_[kTriggerAsyncId]; - fields_[kStackLength] = fields_[kStackLength] + 1; + fields_[kStackLength] += 1; async_id_fields_[kExecutionAsyncId] = async_id; async_id_fields_[kTriggerAsyncId] = trigger_async_id; } @@ -240,19 +239,19 @@ inline bool Environment::ImmediateInfo::has_outstanding() const { } inline void Environment::ImmediateInfo::count_inc(uint32_t increment) { - fields_[kCount] = fields_[kCount] + increment; + fields_[kCount] += increment; } inline void Environment::ImmediateInfo::count_dec(uint32_t decrement) { - fields_[kCount] = fields_[kCount] - decrement; + fields_[kCount] -= decrement; } inline void Environment::ImmediateInfo::ref_count_inc(uint32_t increment) { - fields_[kRefCount] = fields_[kRefCount] + increment; + fields_[kRefCount] += increment; } inline void Environment::ImmediateInfo::ref_count_dec(uint32_t decrement) { - fields_[kRefCount] = fields_[kRefCount] - decrement; + fields_[kRefCount] -= decrement; } inline Environment::TickInfo::TickInfo(v8::Isolate* isolate) @@ -478,8 +477,7 @@ inline std::vector* Environment::destroy_async_id_list() { } inline double Environment::new_async_id() { - async_hooks()->async_id_fields()[AsyncHooks::kAsyncIdCounter] = - async_hooks()->async_id_fields()[AsyncHooks::kAsyncIdCounter] + 1; + async_hooks()->async_id_fields()[AsyncHooks::kAsyncIdCounter] += 1; return async_hooks()->async_id_fields()[AsyncHooks::kAsyncIdCounter]; } From 4fca5f78e3aef3eab869661c6e500dd2bdcb2227 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Sat, 3 Mar 2018 08:53:16 +0100 Subject: [PATCH 2/5] squash: fix return statements --- src/aliased_buffer.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/aliased_buffer.h b/src/aliased_buffer.h index 0990ce576934af..d68db504657198 100644 --- a/src/aliased_buffer.h +++ b/src/aliased_buffer.h @@ -149,8 +149,7 @@ class AliasedBuffer { } inline Reference& operator+=(const Reference& val) { - this->operator+=(static_cast(val)); - return *this; + return *this->operator+=(static_cast(val)); } template @@ -161,8 +160,7 @@ class AliasedBuffer { } inline Reference& operator-=(const Reference& val) { - this->operator-=(static_cast(val)); - return *this; + return *this->operator-=(static_cast(val)); } private: From 5c687c07789fcc66faca8e41d27f665a66ad9e32 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Mon, 5 Mar 2018 14:33:42 +0100 Subject: [PATCH 3/5] squash: call inc operator for decr operator --- src/aliased_buffer.h | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/aliased_buffer.h b/src/aliased_buffer.h index d68db504657198..91dbc1317514cf 100644 --- a/src/aliased_buffer.h +++ b/src/aliased_buffer.h @@ -154,13 +154,7 @@ class AliasedBuffer { template inline Reference& operator-=(const T& val) { - const T current = aliased_buffer_->GetValue(index_); - aliased_buffer_->SetValue(index_, current - val); - return *this; - } - - inline Reference& operator-=(const Reference& val) { - return *this->operator-=(static_cast(val)); + return this->operator+=(-val); } private: From 651bfb207a5c82615c8fd773f368f9cc7dc6484b Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Mon, 5 Mar 2018 14:35:12 +0100 Subject: [PATCH 4/5] squash: add test for overload operators --- test/cctest/test_aliased_buffer.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/cctest/test_aliased_buffer.cc b/test/cctest/test_aliased_buffer.cc index 0eaddf773555db..5a9bea7c5b3b87 100644 --- a/test/cctest/test_aliased_buffer.cc +++ b/test/cctest/test_aliased_buffer.cc @@ -207,3 +207,17 @@ TEST_F(AliasBufferTest, SharedArrayBuffer4) { int8_t, v8::Int8Array, int32_t, v8::Int32Array>(isolate_, 1, 3, 1); } + +TEST_F(AliasBufferTest, OperatorOverloads) { + v8::Isolate::Scope isolate_scope(isolate_); + v8::HandleScope handle_scope(isolate_); + v8::Local context = v8::Context::New(isolate_); + v8::Context::Scope context_scope(context); + const size_t size = 10; + AliasedBuffer ab{isolate_, size}; + + EXPECT_EQ(static_cast(1), ab[0] = 1); + EXPECT_EQ(static_cast(4), ab[0] += 3); + EXPECT_EQ(static_cast(2), ab[0] -= 2); + EXPECT_EQ(static_cast(-2), -ab[0]); +} From 18f46e8bc091967fb8e42ecbaac6f83be1748f88 Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Fri, 9 Mar 2018 07:42:00 +0100 Subject: [PATCH 5/5] squash: add test for Reference overloads --- src/aliased_buffer.h | 2 +- test/cctest/test_aliased_buffer.cc | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/aliased_buffer.h b/src/aliased_buffer.h index 91dbc1317514cf..8b103f4949030c 100644 --- a/src/aliased_buffer.h +++ b/src/aliased_buffer.h @@ -149,7 +149,7 @@ class AliasedBuffer { } inline Reference& operator+=(const Reference& val) { - return *this->operator+=(static_cast(val)); + return this->operator+=(static_cast(val)); } template diff --git a/test/cctest/test_aliased_buffer.cc b/test/cctest/test_aliased_buffer.cc index 5a9bea7c5b3b87..7afa466133b757 100644 --- a/test/cctest/test_aliased_buffer.cc +++ b/test/cctest/test_aliased_buffer.cc @@ -221,3 +221,19 @@ TEST_F(AliasBufferTest, OperatorOverloads) { EXPECT_EQ(static_cast(2), ab[0] -= 2); EXPECT_EQ(static_cast(-2), -ab[0]); } + +TEST_F(AliasBufferTest, OperatorOverloadsRefs) { + v8::Isolate::Scope isolate_scope(isolate_); + v8::HandleScope handle_scope(isolate_); + v8::Local context = v8::Context::New(isolate_); + v8::Context::Scope context_scope(context); + AliasedBuffer ab{isolate_, 2}; + using Reference = AliasedBuffer::Reference; + Reference ref = ab[0]; + Reference ref_value = ab[1] = 2; + + EXPECT_EQ(static_cast(2), ref = ref_value); + EXPECT_EQ(static_cast(4), ref += ref_value); + EXPECT_EQ(static_cast(2), ref -= ref_value); + EXPECT_EQ(static_cast(-2), -ref); +}