mirror of https://github.com/lukechilds/node.git
Ryan Dahl
15 years ago
69 changed files with 3820 additions and 868 deletions
File diff suppressed because it is too large
@ -0,0 +1,87 @@ |
|||
// Copyright 2010 the V8 project authors. All rights reserved.
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following
|
|||
// disclaimer in the documentation and/or other materials provided
|
|||
// with the distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived
|
|||
// from this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
#ifndef V8_UNBOUND_QUEUE_INL_H_ |
|||
#define V8_UNBOUND_QUEUE_INL_H_ |
|||
|
|||
#include "unbound-queue.h" |
|||
|
|||
namespace v8 { |
|||
namespace internal { |
|||
|
|||
template<typename Record> |
|||
struct UnboundQueue<Record>::Node: public Malloced { |
|||
explicit Node(const Record& value) |
|||
: value(value), next(NULL) { |
|||
} |
|||
|
|||
Record value; |
|||
Node* next; |
|||
}; |
|||
|
|||
|
|||
template<typename Record> |
|||
UnboundQueue<Record>::UnboundQueue() { |
|||
first_ = new Node(Record()); |
|||
divider_ = last_ = reinterpret_cast<AtomicWord>(first_); |
|||
} |
|||
|
|||
|
|||
template<typename Record> |
|||
UnboundQueue<Record>::~UnboundQueue() { |
|||
while (first_ != NULL) DeleteFirst(); |
|||
} |
|||
|
|||
|
|||
template<typename Record> |
|||
void UnboundQueue<Record>::DeleteFirst() { |
|||
Node* tmp = first_; |
|||
first_ = tmp->next; |
|||
delete tmp; |
|||
} |
|||
|
|||
|
|||
template<typename Record> |
|||
void UnboundQueue<Record>::Dequeue(Record* rec) { |
|||
ASSERT(divider_ != last_); |
|||
Node* next = reinterpret_cast<Node*>(divider_)->next; |
|||
*rec = next->value; |
|||
OS::ReleaseStore(÷r_, reinterpret_cast<AtomicWord>(next)); |
|||
} |
|||
|
|||
|
|||
template<typename Record> |
|||
void UnboundQueue<Record>::Enqueue(const Record& rec) { |
|||
Node*& next = reinterpret_cast<Node*>(last_)->next; |
|||
next = new Node(rec); |
|||
OS::ReleaseStore(&last_, reinterpret_cast<AtomicWord>(next)); |
|||
while (first_ != reinterpret_cast<Node*>(divider_)) DeleteFirst(); |
|||
} |
|||
|
|||
} } // namespace v8::internal
|
|||
|
|||
#endif // V8_UNBOUND_QUEUE_INL_H_
|
@ -0,0 +1,66 @@ |
|||
// Copyright 2010 the V8 project authors. All rights reserved.
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following
|
|||
// disclaimer in the documentation and/or other materials provided
|
|||
// with the distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived
|
|||
// from this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
#ifndef V8_UNBOUND_QUEUE_ |
|||
#define V8_UNBOUND_QUEUE_ |
|||
|
|||
namespace v8 { |
|||
namespace internal { |
|||
|
|||
|
|||
// Lock-free unbound queue for small records. Intended for
|
|||
// transferring small records between a Single producer and a Single
|
|||
// consumer. Doesn't have restrictions on the number of queued
|
|||
// elements, so producer never blocks. Implemented after Herb
|
|||
// Sutter's article:
|
|||
// http://www.ddj.com/high-performance-computing/210604448
|
|||
template<typename Record> |
|||
class UnboundQueue BASE_EMBEDDED { |
|||
public: |
|||
inline UnboundQueue(); |
|||
inline ~UnboundQueue(); |
|||
|
|||
INLINE(void Dequeue(Record* rec)); |
|||
INLINE(void Enqueue(const Record& rec)); |
|||
INLINE(bool IsEmpty()) { return divider_ == last_; } |
|||
|
|||
private: |
|||
INLINE(void DeleteFirst()); |
|||
|
|||
struct Node; |
|||
|
|||
Node* first_; |
|||
AtomicWord divider_; // Node*
|
|||
AtomicWord last_; // Node*
|
|||
|
|||
DISALLOW_COPY_AND_ASSIGN(UnboundQueue); |
|||
}; |
|||
|
|||
|
|||
} } // namespace v8::internal
|
|||
|
|||
#endif // V8_UNBOUND_QUEUE_
|
@ -0,0 +1,54 @@ |
|||
// Copyright 2010 the V8 project authors. All rights reserved.
|
|||
//
|
|||
// Tests of the unbound queue.
|
|||
|
|||
#include "v8.h" |
|||
#include "unbound-queue-inl.h" |
|||
#include "cctest.h" |
|||
|
|||
namespace i = v8::internal; |
|||
|
|||
using i::UnboundQueue; |
|||
|
|||
|
|||
TEST(SingleRecord) { |
|||
typedef int Record; |
|||
UnboundQueue<Record> cq; |
|||
CHECK(cq.IsEmpty()); |
|||
cq.Enqueue(1); |
|||
CHECK(!cq.IsEmpty()); |
|||
Record rec = 0; |
|||
cq.Dequeue(&rec); |
|||
CHECK_EQ(1, rec); |
|||
CHECK(cq.IsEmpty()); |
|||
} |
|||
|
|||
|
|||
TEST(MultipleRecords) { |
|||
typedef int Record; |
|||
UnboundQueue<Record> cq; |
|||
CHECK(cq.IsEmpty()); |
|||
cq.Enqueue(1); |
|||
CHECK(!cq.IsEmpty()); |
|||
for (int i = 2; i <= 5; ++i) { |
|||
cq.Enqueue(i); |
|||
CHECK(!cq.IsEmpty()); |
|||
} |
|||
Record rec = 0; |
|||
for (int i = 1; i <= 4; ++i) { |
|||
CHECK(!cq.IsEmpty()); |
|||
cq.Dequeue(&rec); |
|||
CHECK_EQ(i, rec); |
|||
} |
|||
for (int i = 6; i <= 12; ++i) { |
|||
cq.Enqueue(i); |
|||
CHECK(!cq.IsEmpty()); |
|||
} |
|||
for (int i = 5; i <= 12; ++i) { |
|||
CHECK(!cq.IsEmpty()); |
|||
cq.Dequeue(&rec); |
|||
CHECK_EQ(i, rec); |
|||
} |
|||
CHECK(cq.IsEmpty()); |
|||
} |
|||
|
@ -0,0 +1,38 @@ |
|||
// Copyright 2010 the V8 project authors. All rights reserved.
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following
|
|||
// disclaimer in the documentation and/or other materials provided
|
|||
// with the distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived
|
|||
// from this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
// This regression test is used to ensure that Object.defineProperty
|
|||
// can't be called with an empty property descriptor on a non-configurable
|
|||
// existing property and override the existing property.
|
|||
// See: http://code.google.com/p/v8/issues/detail?id=712
|
|||
|
|||
var obj = {}; |
|||
Object.defineProperty(obj, "x", { get: function() { return "42"; }, |
|||
configurable: false }); |
|||
assertEquals(obj.x, "42"); |
|||
Object.defineProperty(obj, 'x', {}); |
|||
assertEquals(obj.x, "42"); |
@ -0,0 +1,36 @@ |
|||
// Copyright 2010 the V8 project authors. All rights reserved.
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following
|
|||
// disclaimer in the documentation and/or other materials provided
|
|||
// with the distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived
|
|||
// from this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
// This regression test is used to ensure that Object.defineProperty
|
|||
// keeps the existing value of the writable flag if none is given
|
|||
// in the provided descriptor.
|
|||
// See: http://code.google.com/p/v8/issues/detail?id=720
|
|||
|
|||
var o = {x: 10}; |
|||
Object.defineProperty(o, "x", {value: 5}); |
|||
var desc = Object.getOwnPropertyDescriptor(o, "x"); |
|||
assertTrue(desc["writable"]); |
@ -0,0 +1,102 @@ |
|||
// Copyright 2010 the V8 project authors. All rights reserved.
|
|||
// Redistribution and use in source and binary forms, with or without
|
|||
// modification, are permitted provided that the following conditions are
|
|||
// met:
|
|||
//
|
|||
// * Redistributions of source code must retain the above copyright
|
|||
// notice, this list of conditions and the following disclaimer.
|
|||
// * Redistributions in binary form must reproduce the above
|
|||
// copyright notice, this list of conditions and the following
|
|||
// disclaimer in the documentation and/or other materials provided
|
|||
// with the distribution.
|
|||
// * Neither the name of Google Inc. nor the names of its
|
|||
// contributors may be used to endorse or promote products derived
|
|||
// from this software without specific prior written permission.
|
|||
//
|
|||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|||
|
|||
// Flags: --expose-natives_as natives
|
|||
// Test the SameValue internal method.
|
|||
|
|||
var obj1 = {x: 10, y: 11, z: "test"}; |
|||
var obj2 = {x: 10, y: 11, z: "test"}; |
|||
|
|||
assertTrue(natives.SameValue(0, 0)); |
|||
assertTrue(natives.SameValue(+0, +0)); |
|||
assertTrue(natives.SameValue(-0, -0)); |
|||
assertTrue(natives.SameValue(1, 1)); |
|||
assertTrue(natives.SameValue(2, 2)); |
|||
assertTrue(natives.SameValue(-1, -1)); |
|||
assertTrue(natives.SameValue(0.5, 0.5)); |
|||
assertTrue(natives.SameValue(true, true)); |
|||
assertTrue(natives.SameValue(false, false)); |
|||
assertTrue(natives.SameValue(NaN, NaN)); |
|||
assertTrue(natives.SameValue(null, null)); |
|||
assertTrue(natives.SameValue("foo", "foo")); |
|||
assertTrue(natives.SameValue(obj1, obj1)); |
|||
// Undefined values.
|
|||
assertTrue(natives.SameValue()); |
|||
assertTrue(natives.SameValue(undefined, undefined)); |
|||
|
|||
assertFalse(natives.SameValue(0,1)); |
|||
assertFalse(natives.SameValue("foo", "bar")); |
|||
assertFalse(natives.SameValue(obj1, obj2)); |
|||
assertFalse(natives.SameValue(true, false)); |
|||
|
|||
assertFalse(natives.SameValue(obj1, true)); |
|||
assertFalse(natives.SameValue(obj1, "foo")); |
|||
assertFalse(natives.SameValue(obj1, 1)); |
|||
assertFalse(natives.SameValue(obj1, undefined)); |
|||
assertFalse(natives.SameValue(obj1, NaN)); |
|||
|
|||
assertFalse(natives.SameValue(undefined, true)); |
|||
assertFalse(natives.SameValue(undefined, "foo")); |
|||
assertFalse(natives.SameValue(undefined, 1)); |
|||
assertFalse(natives.SameValue(undefined, obj1)); |
|||
assertFalse(natives.SameValue(undefined, NaN)); |
|||
|
|||
assertFalse(natives.SameValue(NaN, true)); |
|||
assertFalse(natives.SameValue(NaN, "foo")); |
|||
assertFalse(natives.SameValue(NaN, 1)); |
|||
assertFalse(natives.SameValue(NaN, obj1)); |
|||
assertFalse(natives.SameValue(NaN, undefined)); |
|||
|
|||
assertFalse(natives.SameValue("foo", true)); |
|||
assertFalse(natives.SameValue("foo", 1)); |
|||
assertFalse(natives.SameValue("foo", obj1)); |
|||
assertFalse(natives.SameValue("foo", undefined)); |
|||
assertFalse(natives.SameValue("foo", NaN)); |
|||
|
|||
assertFalse(natives.SameValue(true, 1)); |
|||
assertFalse(natives.SameValue(true, obj1)); |
|||
assertFalse(natives.SameValue(true, undefined)); |
|||
assertFalse(natives.SameValue(true, NaN)); |
|||
assertFalse(natives.SameValue(true, "foo")); |
|||
|
|||
assertFalse(natives.SameValue(1, true)); |
|||
assertFalse(natives.SameValue(1, obj1)); |
|||
assertFalse(natives.SameValue(1, undefined)); |
|||
assertFalse(natives.SameValue(1, NaN)); |
|||
assertFalse(natives.SameValue(1, "foo")); |
|||
|
|||
// Special string cases.
|
|||
assertFalse(natives.SameValue("1", 1)); |
|||
assertFalse(natives.SameValue("true", true)); |
|||
assertFalse(natives.SameValue("false", false)); |
|||
assertFalse(natives.SameValue("undefined", undefined)); |
|||
assertFalse(natives.SameValue("NaN", NaN)); |
|||
|
|||
// -0 and +0 are should be different
|
|||
assertFalse(natives.SameValue(+0, -0)); |
|||
assertFalse(natives.SameValue(-0, +0)); |
Loading…
Reference in new issue