Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Unified Diff: src/code-stubs.h

Issue 8932004: Implement target cache for constructor calls. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/code-stubs.h
diff --git a/src/code-stubs.h b/src/code-stubs.h
index 34da148e5d1a9d8ca6f3603d8eee025e15b5b865..d9c337d744e6666d530bc275042b0be3dd00f1d6 100644
--- a/src/code-stubs.h
+++ b/src/code-stubs.h
@@ -38,6 +38,7 @@ namespace internal {
// List of code stubs used on all platforms.
#define CODE_STUB_LIST_ALL_PLATFORMS(V) \
V(CallFunction) \
+ V(CallConstruct) \
V(UnaryOp) \
V(BinaryOp) \
V(StringAdd) \
@@ -731,21 +732,19 @@ class RegExpConstructResultStub: public CodeStub {
};
-class CallFunctionStub: public CodeStub {
+// Base class for call stubs caching call targets in the instruction stream.
+class CallStub: public CodeStub {
public:
- CallFunctionStub(int argc, CallFunctionFlags flags)
- : argc_(argc), flags_(flags) { }
-
- void Generate(MacroAssembler* masm);
-
- virtual void FinishCode(Handle<Code> code);
-
static void Clear(Heap* heap, Address address);
static Object* GetCachedValue(Address address);
- static int ExtractArgcFromMinorKey(int minor_key) {
- return ArgcBits::decode(minor_key);
+ // Checks whether a call to the given target has a cache attached.
+ static bool HasCache(Code* target) {
+ return target->kind() == Code::STUB &&
+ (target->major_key() == CallFunction ||
+ target->major_key() == CallConstruct) &&
+ target->has_function_cache();
}
// The object that indicates an uninitialized cache.
@@ -764,6 +763,24 @@ class CallFunctionStub: public CodeStub {
return isolate->factory()->undefined_value();
}
+ protected:
+ void GenerateRecordCallTarget(MacroAssembler* masm);
+};
+
+
+class CallFunctionStub: public CallStub {
+ public:
+ CallFunctionStub(int argc, CallFunctionFlags flags)
+ : argc_(argc), flags_(flags) { }
+
+ void Generate(MacroAssembler* masm);
+
+ virtual void FinishCode(Handle<Code> code);
+
+ static int ExtractArgcFromMinorKey(int minor_key) {
+ return ArgcBits::decode(minor_key);
+ }
+
private:
int argc_;
CallFunctionFlags flags_;
@@ -790,6 +807,26 @@ class CallFunctionStub: public CodeStub {
};
+class CallConstructStub: public CallStub {
+ public:
+ explicit CallConstructStub(CallFunctionFlags flags) : flags_(flags) {}
+
+ void Generate(MacroAssembler* masm);
+
+ virtual void FinishCode(Handle<Code> code);
+
+ private:
+ CallFunctionFlags flags_;
+
+ Major MajorKey() { return CallConstruct; }
+ int MinorKey() { return flags_; }
+
+ bool RecordCallTarget() {
+ return (flags_ & RECORD_CALL_TARGET) != 0;
+ }
+};
+
+
enum StringIndexFlags {
// Accepts smis or heap numbers.
STRING_INDEX_IS_NUMBER,
« no previous file with comments | « src/builtins.h ('k') | src/ia32/builtins-ia32.cc » ('j') | src/ia32/builtins-ia32.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698