mirror of https://github.com/lukechilds/node.git
Ryan Dahl
15 years ago
270 changed files with 25077 additions and 6186 deletions
@ -0,0 +1,54 @@ |
|||
# Authors ordered by first contribution. |
|||
|
|||
Ryan Dahl <ry@tinyclouds.org> |
|||
Urban Hafner <urban@bettong.net> |
|||
Joshaven Potter <yourtech@gmail.com> |
|||
Abe Fettig <abefettig@gmail.com> |
|||
Kevin van Zonneveld <kevin@vanzonneveld.net> |
|||
Michael Carter <cartermichael@gmail.com> |
|||
Jeff Smick <sprsquish@gmail.com> |
|||
Jon Crosby <jon@joncrosby.me> |
|||
Felix Geisendörfer <felix@debuggable.com> |
|||
Ray Morgan <rmorgan@zappos.com> |
|||
Jérémy Lal <holisme@gmail.com> |
|||
Isaac Z. Schlueter <i@izs.me> |
|||
Brandon Beacher <brandon.beacher@gmail.com> |
|||
Tim Caswell <tim@creationix.com> |
|||
Connor Dunn <connorhd@gmail.com> |
|||
Johan Sørensen <johan@johansorensen.com> |
|||
Friedemann Altrock <frodenius@gmail.com> |
|||
Onne Gorter <onne@onnlucky.com> |
|||
Rhys Jones <rhys@wave.to> |
|||
Jan Lehnardt <jan@apache.org> |
|||
Simon Willison <simon@simonwillison.net> |
|||
Chew Choon Keat <choonkeat@gmail.com> |
|||
Jed Schmidt <tr@nslator.jp> |
|||
Michaeljohn Clement <inimino@inimino.org> |
|||
Karl Guertin <grayrest@gr.ayre.st> |
|||
Xavier Shay <xavier@rhnh.net> |
|||
Christopher Lenz <chris@lamech.local> |
|||
TJ Holowaychuk <tj@vision-media.ca> |
|||
Johan Dahlberg <jfd@distrop.com> |
|||
Simon Cornelius P. Umacob <simoncpu@gmail.com> |
|||
Ryan McGrath <ryan@venodesigns.net> |
|||
Rasmus Andersson <rasmus@notion.se> |
|||
Micheil Smith <micheil@brandedcode.com> |
|||
Jonas Pfenniger <jonas@pfenniger.name> |
|||
Charles Lehner <celehner1@gmail.com> |
|||
Elliott Cable <me@ell.io> |
|||
Benjamin Thomas <benjamin@benjaminthomas.org> |
|||
Vanilla Hsu <v@fatpipi.com> |
|||
Ben Williamson <benw@pobox.com> |
|||
Joseph Pecoraro <joepeck02@gmail.com> |
|||
Erich Ocean <erich.ocean@me.com> |
|||
Alexis Sellier <self@cloudhead.net> |
|||
Blaine Cook <romeda@gmail.com> |
|||
Standa Opichal <opichals@gmail.com> |
|||
Aaron Heckmann <aaron.heckmann@gmail.com> |
|||
Mikeal Rogers <mikeal.rogers@gmail.com> |
|||
Matt Brubeck <mbrubeck@limpet.net> |
|||
Michael Stillwell <mjs@beebo.org> |
|||
Yuichiro MASUI <masui@masuidrive.jp> |
|||
Mark Hansen <mark@markhansen.co.nz> |
|||
Zoran Tomicic <ztomicic@gmail.com> |
|||
Jeremy Ashkenas <jashkenas@gmail.com> |
File diff suppressed because it is too large
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.
|
|||
|
|||
|
|||
#include "v8.h" |
|||
|
|||
#include "liveedit.h" |
|||
#include "compiler.h" |
|||
#include "oprofile-agent.h" |
|||
#include "scopes.h" |
|||
#include "global-handles.h" |
|||
#include "debug.h" |
|||
|
|||
namespace v8 { |
|||
namespace internal { |
|||
|
|||
|
|||
class FunctionInfoListener { |
|||
public: |
|||
void FunctionStarted(FunctionLiteral* fun) { |
|||
// Implementation follows.
|
|||
} |
|||
|
|||
void FunctionDone() { |
|||
// Implementation follows.
|
|||
} |
|||
|
|||
void FunctionScope(Scope* scope) { |
|||
// Implementation follows.
|
|||
} |
|||
|
|||
void FunctionCode(Handle<Code> function_code) { |
|||
// Implementation follows.
|
|||
} |
|||
}; |
|||
|
|||
static FunctionInfoListener* active_function_info_listener = NULL; |
|||
|
|||
LiveEditFunctionTracker::LiveEditFunctionTracker(FunctionLiteral* fun) { |
|||
if (active_function_info_listener != NULL) { |
|||
active_function_info_listener->FunctionStarted(fun); |
|||
} |
|||
} |
|||
LiveEditFunctionTracker::~LiveEditFunctionTracker() { |
|||
if (active_function_info_listener != NULL) { |
|||
active_function_info_listener->FunctionDone(); |
|||
} |
|||
} |
|||
void LiveEditFunctionTracker::RecordFunctionCode(Handle<Code> code) { |
|||
if (active_function_info_listener != NULL) { |
|||
active_function_info_listener->FunctionCode(code); |
|||
} |
|||
} |
|||
void LiveEditFunctionTracker::RecordFunctionScope(Scope* scope) { |
|||
if (active_function_info_listener != NULL) { |
|||
active_function_info_listener->FunctionScope(scope); |
|||
} |
|||
} |
|||
bool LiveEditFunctionTracker::IsActive() { |
|||
return active_function_info_listener != NULL; |
|||
} |
|||
|
|||
} } // namespace v8::internal
|
@ -0,0 +1,78 @@ |
|||
// 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_LIVEEDIT_H_ |
|||
#define V8_LIVEEDIT_H_ |
|||
|
|||
|
|||
|
|||
// Live Edit feature implementation.
|
|||
// User should be able to change script on already running VM. This feature
|
|||
// matches hot swap features in other frameworks.
|
|||
//
|
|||
// The basic use-case is when user spots some mistake in function body
|
|||
// from debugger and wishes to change the algorithm without restart.
|
|||
//
|
|||
// A single change always has a form of a simple replacement (in pseudo-code):
|
|||
// script.source[positions, positions+length] = new_string;
|
|||
// Implementation first determines, which function's body includes this
|
|||
// change area. Then both old and new versions of script are fully compiled
|
|||
// in order to analyze, whether the function changed its outer scope
|
|||
// expectations (or number of parameters). If it didn't, function's code is
|
|||
// patched with a newly compiled code. If it did change, enclosing function
|
|||
// gets patched. All inner functions are left untouched, whatever happened
|
|||
// to them in a new script version. However, new version of code will
|
|||
// instantiate newly compiled functions.
|
|||
|
|||
|
|||
#include "compiler.h" |
|||
|
|||
namespace v8 { |
|||
namespace internal { |
|||
|
|||
// This class collects some specific information on structure of functions
|
|||
// in a particular script. It gets called from compiler all the time, but
|
|||
// actually records any data only when liveedit operation is in process;
|
|||
// in any other time this class is very cheap.
|
|||
//
|
|||
// The primary interest of the Tracker is to record function scope structures
|
|||
// in order to analyze whether function code maybe safely patched (with new
|
|||
// code successfully reading existing data from function scopes). The Tracker
|
|||
// also collects compiled function codes.
|
|||
class LiveEditFunctionTracker { |
|||
public: |
|||
explicit LiveEditFunctionTracker(FunctionLiteral* fun); |
|||
~LiveEditFunctionTracker(); |
|||
void RecordFunctionCode(Handle<Code> code); |
|||
void RecordFunctionScope(Scope* scope); |
|||
|
|||
static bool IsActive(); |
|||
}; |
|||
|
|||
} } // namespace v8::internal
|
|||
|
|||
#endif /* V*_LIVEEDIT_H_ */ |
@ -0,0 +1,215 @@ |
|||
// Copyright (c) 1994-2006 Sun Microsystems Inc.
|
|||
// 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.
|
|||
//
|
|||
// - Redistribution 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 Sun Microsystems or the names of 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.
|
|||
|
|||
// The original source code covered by the above license above has been
|
|||
// modified significantly by Google Inc.
|
|||
// Copyright 2010 the V8 project authors. All rights reserved.
|
|||
|
|||
|
|||
#ifndef V8_MIPS_ASSEMBLER_MIPS_INL_H_ |
|||
#define V8_MIPS_ASSEMBLER_MIPS_INL_H_ |
|||
|
|||
#include "mips/assembler-mips.h" |
|||
#include "cpu.h" |
|||
|
|||
|
|||
namespace v8 { |
|||
namespace internal { |
|||
|
|||
// -----------------------------------------------------------------------------
|
|||
// Condition
|
|||
|
|||
Condition NegateCondition(Condition cc) { |
|||
ASSERT(cc != cc_always); |
|||
return static_cast<Condition>(cc ^ 1); |
|||
} |
|||
|
|||
|
|||
// -----------------------------------------------------------------------------
|
|||
// Operand and MemOperand
|
|||
|
|||
Operand::Operand(int32_t immediate, RelocInfo::Mode rmode) { |
|||
rm_ = no_reg; |
|||
imm32_ = immediate; |
|||
rmode_ = rmode; |
|||
} |
|||
|
|||
Operand::Operand(const ExternalReference& f) { |
|||
rm_ = no_reg; |
|||
imm32_ = reinterpret_cast<int32_t>(f.address()); |
|||
rmode_ = RelocInfo::EXTERNAL_REFERENCE; |
|||
} |
|||
|
|||
Operand::Operand(const char* s) { |
|||
rm_ = no_reg; |
|||
imm32_ = reinterpret_cast<int32_t>(s); |
|||
rmode_ = RelocInfo::EMBEDDED_STRING; |
|||
} |
|||
|
|||
Operand::Operand(Smi* value) { |
|||
rm_ = no_reg; |
|||
imm32_ = reinterpret_cast<intptr_t>(value); |
|||
rmode_ = RelocInfo::NONE; |
|||
} |
|||
|
|||
Operand::Operand(Register rm) { |
|||
rm_ = rm; |
|||
} |
|||
|
|||
bool Operand::is_reg() const { |
|||
return rm_.is_valid(); |
|||
} |
|||
|
|||
|
|||
|
|||
// -----------------------------------------------------------------------------
|
|||
// RelocInfo
|
|||
|
|||
void RelocInfo::apply(intptr_t delta) { |
|||
// On MIPS we do not use pc relative addressing, so we don't need to patch the
|
|||
// code here.
|
|||
} |
|||
|
|||
|
|||
Address RelocInfo::target_address() { |
|||
ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); |
|||
return Assembler::target_address_at(pc_); |
|||
} |
|||
|
|||
|
|||
Address RelocInfo::target_address_address() { |
|||
ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); |
|||
return reinterpret_cast<Address>(pc_); |
|||
} |
|||
|
|||
|
|||
void RelocInfo::set_target_address(Address target) { |
|||
ASSERT(IsCodeTarget(rmode_) || rmode_ == RUNTIME_ENTRY); |
|||
Assembler::set_target_address_at(pc_, target); |
|||
} |
|||
|
|||
|
|||
Object* RelocInfo::target_object() { |
|||
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
|||
return reinterpret_cast<Object*>(Assembler::target_address_at(pc_)); |
|||
} |
|||
|
|||
|
|||
Handle<Object> RelocInfo::target_object_handle(Assembler *origin) { |
|||
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
|||
return Handle<Object>(reinterpret_cast<Object**>( |
|||
Assembler::target_address_at(pc_))); |
|||
} |
|||
|
|||
|
|||
Object** RelocInfo::target_object_address() { |
|||
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
|||
return reinterpret_cast<Object**>(pc_); |
|||
} |
|||
|
|||
|
|||
void RelocInfo::set_target_object(Object* target) { |
|||
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); |
|||
Assembler::set_target_address_at(pc_, reinterpret_cast<Address>(target)); |
|||
} |
|||
|
|||
|
|||
Address* RelocInfo::target_reference_address() { |
|||
ASSERT(rmode_ == EXTERNAL_REFERENCE); |
|||
return reinterpret_cast<Address*>(pc_); |
|||
} |
|||
|
|||
|
|||
Address RelocInfo::call_address() { |
|||
ASSERT(IsPatchedReturnSequence()); |
|||
// The 2 instructions offset assumes patched return sequence.
|
|||
ASSERT(IsJSReturn(rmode())); |
|||
return Memory::Address_at(pc_ + 2 * Assembler::kInstrSize); |
|||
} |
|||
|
|||
|
|||
void RelocInfo::set_call_address(Address target) { |
|||
ASSERT(IsPatchedReturnSequence()); |
|||
// The 2 instructions offset assumes patched return sequence.
|
|||
ASSERT(IsJSReturn(rmode())); |
|||
Memory::Address_at(pc_ + 2 * Assembler::kInstrSize) = target; |
|||
} |
|||
|
|||
|
|||
Object* RelocInfo::call_object() { |
|||
return *call_object_address(); |
|||
} |
|||
|
|||
|
|||
Object** RelocInfo::call_object_address() { |
|||
ASSERT(IsPatchedReturnSequence()); |
|||
// The 2 instructions offset assumes patched return sequence.
|
|||
ASSERT(IsJSReturn(rmode())); |
|||
return reinterpret_cast<Object**>(pc_ + 2 * Assembler::kInstrSize); |
|||
} |
|||
|
|||
|
|||
void RelocInfo::set_call_object(Object* target) { |
|||
*call_object_address() = target; |
|||
} |
|||
|
|||
|
|||
bool RelocInfo::IsPatchedReturnSequence() { |
|||
#ifdef DEBUG |
|||
PrintF("%s - %d - %s : Checking for jal(r)", |
|||
__FILE__, __LINE__, __func__); |
|||
#endif |
|||
return ((Assembler::instr_at(pc_) & kOpcodeMask) == SPECIAL) && |
|||
(((Assembler::instr_at(pc_) & kFunctionFieldMask) == JAL) || |
|||
((Assembler::instr_at(pc_) & kFunctionFieldMask) == JALR)); |
|||
} |
|||
|
|||
|
|||
// -----------------------------------------------------------------------------
|
|||
// Assembler
|
|||
|
|||
|
|||
void Assembler::CheckBuffer() { |
|||
if (buffer_space() <= kGap) { |
|||
GrowBuffer(); |
|||
} |
|||
} |
|||
|
|||
|
|||
void Assembler::emit(Instr x) { |
|||
CheckBuffer(); |
|||
*reinterpret_cast<Instr*>(pc_) = x; |
|||
pc_ += kInstrSize; |
|||
} |
|||
|
|||
|
|||
} } // namespace v8::internal
|
|||
|
|||
#endif // V8_MIPS_ASSEMBLER_MIPS_INL_H_
|
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue