Revision: 13459
Author: [email protected]
Date: Mon Jan 21 09:54:36 2013
Log: Migrate FunctionPrototype (Keyed|Named)LoadIC to CodeStub
Review URL: https://chromiumcodereview.appspot.com/11941016
http://code.google.com/p/v8/source/detail?r=13459
Modified:
/branches/bleeding_edge/src/arm/code-stubs-arm.cc
/branches/bleeding_edge/src/arm/ic-arm.cc
/branches/bleeding_edge/src/arm/stub-cache-arm.cc
/branches/bleeding_edge/src/ast.cc
/branches/bleeding_edge/src/builtins.cc
/branches/bleeding_edge/src/builtins.h
/branches/bleeding_edge/src/code-stubs.h
/branches/bleeding_edge/src/ia32/code-stubs-ia32.cc
/branches/bleeding_edge/src/ia32/ic-ia32.cc
/branches/bleeding_edge/src/ia32/stub-cache-ia32.cc
/branches/bleeding_edge/src/ic.cc
/branches/bleeding_edge/src/stub-cache.cc
/branches/bleeding_edge/src/stub-cache.h
/branches/bleeding_edge/src/x64/code-stubs-x64.cc
/branches/bleeding_edge/src/x64/ic-x64.cc
/branches/bleeding_edge/src/x64/stub-cache-x64.cc
=======================================
--- /branches/bleeding_edge/src/arm/code-stubs-arm.cc Mon Jan 21 09:17:02
2013
+++ /branches/bleeding_edge/src/arm/code-stubs-arm.cc Mon Jan 21 09:54:36
2013
@@ -4530,6 +4530,35 @@
__ bind(&miss);
StubCompiler::GenerateLoadMiss(masm, kind());
}
+
+
+void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
+ Label miss;
+ Register receiver;
+ if (kind() == Code::KEYED_LOAD_IC) {
+ // ----------- S t a t e -------------
+ // -- lr : return address
+ // -- r0 : key
+ // -- r1 : receiver
+ // -----------------------------------
+ __ cmp(r0, Operand(masm->isolate()->factory()->prototype_symbol()));
+ __ b(ne, &miss);
+ receiver = r1;
+ } else {
+ ASSERT(kind() == Code::LOAD_IC);
+ // ----------- S t a t e -------------
+ // -- r2 : name
+ // -- lr : return address
+ // -- r0 : receiver
+ // -- sp[0] : receiver
+ // -----------------------------------
+ receiver = r0;
+ }
+
+ StubCompiler::GenerateLoadFunctionPrototype(masm, receiver, r3, r4,
&miss);
+ __ bind(&miss);
+ StubCompiler::GenerateLoadMiss(masm, kind());
+}
void StringLengthStub::Generate(MacroAssembler* masm) {
=======================================
--- /branches/bleeding_edge/src/arm/ic-arm.cc Mon Jan 21 09:17:02 2013
+++ /branches/bleeding_edge/src/arm/ic-arm.cc Mon Jan 21 09:54:36 2013
@@ -211,21 +211,6 @@
__ RecordWrite(
elements, scratch2, scratch1, kLRHasNotBeenSaved, kDontSaveFPRegs);
}
-
-
-void LoadIC::GenerateFunctionPrototype(MacroAssembler* masm) {
- // ----------- S t a t e -------------
- // -- r2 : name
- // -- lr : return address
- // -- r0 : receiver
- // -- sp[0] : receiver
- // -----------------------------------
- Label miss;
-
- StubCompiler::GenerateLoadFunctionPrototype(masm, r0, r1, r3, &miss);
- __ bind(&miss);
- StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC);
-}
// Checks the receiver for special cases (value type, slow case bits).
=======================================
--- /branches/bleeding_edge/src/arm/stub-cache-arm.cc Mon Jan 21 09:17:02
2013
+++ /branches/bleeding_edge/src/arm/stub-cache-arm.cc Mon Jan 21 09:54:36
2013
@@ -3205,31 +3205,6 @@
return GetCode(Code::INTERCEPTOR, name);
}
-
-
-Handle<Code> KeyedLoadStubCompiler::CompileLoadFunctionPrototype(
- Handle<String> name) {
- // ----------- S t a t e -------------
- // -- lr : return address
- // -- r0 : key
- // -- r1 : receiver
- // -----------------------------------
- Label miss;
-
- Counters* counters = masm()->isolate()->counters();
- __ IncrementCounter(counters->keyed_load_function_prototype(), 1, r2,
r3);
-
- // Check the name hasn't changed.
- __ cmp(r0, Operand(name));
- __ b(ne, &miss);
-
- GenerateLoadFunctionPrototype(masm(), r1, r2, r3, &miss);
- __ bind(&miss);
- __ DecrementCounter(counters->keyed_load_function_prototype(), 1, r2,
r3);
- GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
-
- return GetCode(Code::CALLBACKS, name);
-}
Handle<Code> KeyedLoadStubCompiler::CompileLoadElement(
=======================================
--- /branches/bleeding_edge/src/ast.cc Mon Jan 21 09:17:02 2013
+++ /branches/bleeding_edge/src/ast.cc Mon Jan 21 09:54:36 2013
@@ -414,13 +414,13 @@
receiver_types_.Clear();
if (key()->IsPropertyName()) {
ArrayLengthStub array_stub(Code::LOAD_IC);
+ FunctionPrototypeStub proto_stub(Code::LOAD_IC);
StringLengthStub string_stub(Code::LOAD_IC, false);
if (oracle->LoadIsStub(this, &array_stub)) {
is_array_length_ = true;
} else if (oracle->LoadIsStub(this, &string_stub)) {
is_string_length_ = true;
- } else if (oracle->LoadIsBuiltin(this,
- Builtins::kLoadIC_FunctionPrototype))
{
+ } else if (oracle->LoadIsStub(this, &proto_stub)) {
is_function_prototype_ = true;
} else {
Literal* lit_key = key()->AsLiteral();
=======================================
--- /branches/bleeding_edge/src/builtins.cc Mon Jan 21 09:17:02 2013
+++ /branches/bleeding_edge/src/builtins.cc Mon Jan 21 09:54:36 2013
@@ -1451,11 +1451,6 @@
BUILTIN(HandleApiCallAsConstructor) {
return HandleApiCallAsFunctionOrConstructor(isolate, true, args);
}
-
-
-static void Generate_LoadIC_FunctionPrototype(MacroAssembler* masm) {
- LoadIC::GenerateFunctionPrototype(masm);
-}
static void Generate_LoadIC_Initialize(MacroAssembler* masm) {
=======================================
--- /branches/bleeding_edge/src/builtins.h Mon Jan 21 09:17:02 2013
+++ /branches/bleeding_edge/src/builtins.h Mon Jan 21 09:54:36 2013
@@ -134,8 +134,6 @@
Code::kNoExtraICState) \
V(LoadIC_Normal, LOAD_IC, MONOMORPHIC, \
Code::kNoExtraICState) \
- V(LoadIC_FunctionPrototype, LOAD_IC, MONOMORPHIC, \
- Code::kNoExtraICState) \
V(LoadIC_Megamorphic, LOAD_IC, MEGAMORPHIC, \
Code::kNoExtraICState) \
V(LoadIC_Getter_ForDeopt, LOAD_IC, MONOMORPHIC, \
=======================================
--- /branches/bleeding_edge/src/code-stubs.h Mon Jan 21 09:17:02 2013
+++ /branches/bleeding_edge/src/code-stubs.h Mon Jan 21 09:54:36 2013
@@ -49,6 +49,7 @@
V(MathPow) \
V(ArrayLength) \
V(StringLength) \
+ V(FunctionPrototype) \
V(RecordWrite) \
V(StoreBufferOverflow) \
V(RegExpExec) \
@@ -577,6 +578,16 @@
};
+class FunctionPrototypeStub: public ICStub {
+ public:
+ explicit FunctionPrototypeStub(Code::Kind kind) : ICStub(kind) { }
+ virtual void Generate(MacroAssembler* masm);
+
+ private:
+ virtual CodeStub::Major MajorKey() { return FunctionPrototype; }
+};
+
+
class StringLengthStub: public ICStub {
public:
StringLengthStub(Code::Kind kind, bool support_wrapper)
=======================================
--- /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Mon Jan 21 09:17:02
2013
+++ /branches/bleeding_edge/src/ia32/code-stubs-ia32.cc Mon Jan 21 09:54:36
2013
@@ -3276,6 +3276,25 @@
__ bind(&miss);
StubCompiler::GenerateLoadMiss(masm, kind());
}
+
+
+void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
+ // ----------- S t a t e -------------
+ // -- ecx : name
+ // -- edx : receiver
+ // -- esp[0] : return address
+ // -----------------------------------
+ Label miss;
+
+ if (kind() == Code::KEYED_LOAD_IC) {
+ __ cmp(ecx, Immediate(masm->isolate()->factory()->prototype_symbol()));
+ __ j(not_equal, &miss);
+ }
+
+ StubCompiler::GenerateLoadFunctionPrototype(masm, edx, eax, ebx, &miss);
+ __ bind(&miss);
+ StubCompiler::GenerateLoadMiss(masm, kind());
+}
void StringLengthStub::Generate(MacroAssembler* masm) {
=======================================
--- /branches/bleeding_edge/src/ia32/ic-ia32.cc Mon Jan 21 09:17:02 2013
+++ /branches/bleeding_edge/src/ia32/ic-ia32.cc Mon Jan 21 09:54:36 2013
@@ -214,20 +214,6 @@
__ mov(r1, value);
__ RecordWrite(elements, r0, r1, kDontSaveFPRegs);
}
-
-
-void LoadIC::GenerateFunctionPrototype(MacroAssembler* masm) {
- // ----------- S t a t e -------------
- // -- ecx : name
- // -- edx : receiver
- // -- esp[0] : return address
- // -----------------------------------
- Label miss;
-
- StubCompiler::GenerateLoadFunctionPrototype(masm, edx, eax, ebx, &miss);
- __ bind(&miss);
- StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC);
-}
// Checks the receiver for special cases (value type, slow case bits).
=======================================
--- /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Mon Jan 21 09:17:02
2013
+++ /branches/bleeding_edge/src/ia32/stub-cache-ia32.cc Mon Jan 21 09:54:36
2013
@@ -3313,32 +3313,6 @@
// Return the generated code.
return GetCode(Code::INTERCEPTOR, name);
}
-
-
-Handle<Code> KeyedLoadStubCompiler::CompileLoadFunctionPrototype(
- Handle<String> name) {
- // ----------- S t a t e -------------
- // -- ecx : key
- // -- edx : receiver
- // -- esp[0] : return address
- // -----------------------------------
- Label miss;
-
- Counters* counters = isolate()->counters();
- __ IncrementCounter(counters->keyed_load_function_prototype(), 1);
-
- // Check that the name has not changed.
- __ cmp(ecx, Immediate(name));
- __ j(not_equal, &miss);
-
- GenerateLoadFunctionPrototype(masm(), edx, eax, ebx, &miss);
- __ bind(&miss);
- __ DecrementCounter(counters->keyed_load_function_prototype(), 1);
- GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
-
- // Return the generated code.
- return GetCode(Code::CALLBACKS, name);
-}
Handle<Code> KeyedLoadStubCompiler::CompileLoadElement(
=======================================
--- /branches/bleeding_edge/src/ic.cc Mon Jan 21 09:17:02 2013
+++ /branches/bleeding_edge/src/ic.cc Mon Jan 21 09:54:36 2013
@@ -836,78 +836,61 @@
Handle<Object> object,
Handle<String> name,
MaybeObject** result) {
- // Use specialized code for getting the length of strings and
- // string wrapper objects. The length property of string wrapper
- // objects is read-only and therefore always returns the length of
- // the underlying string value. See ECMA-262 15.5.5.1.
- if ((object->IsString() || object->IsStringWrapper()) &&
- name->Equals(isolate()->heap()->length_symbol())) {
- Handle<Code> stub;
- if (state == UNINITIALIZED) {
- stub = pre_monomorphic_stub();
- } else if (state == PREMONOMORPHIC) {
- StringLengthStub string_length_stub(kind(), !object->IsString());
- stub = string_length_stub.GetCode();
- } else if (state == MONOMORPHIC && object->IsStringWrapper()) {
- StringLengthStub string_length_stub(kind(), true);
- stub = string_length_stub.GetCode();
- } else if (state != MEGAMORPHIC) {
- ASSERT(state != GENERIC);
- stub = megamorphic_stub();
- }
- if (!stub.is_null()) {
- set_target(*stub);
+ if (FLAG_use_ic) {
+ // Use specialized code for getting the length of strings and
+ // string wrapper objects. The length property of string wrapper
+ // objects is read-only and therefore always returns the length of
+ // the underlying string value. See ECMA-262 15.5.5.1.
+ if ((object->IsString() || object->IsStringWrapper()) &&
+ name->Equals(isolate()->heap()->length_symbol())) {
+ Handle<Code> stub;
+ if (state == UNINITIALIZED) {
+ stub = pre_monomorphic_stub();
+ } else if (state == PREMONOMORPHIC) {
+ StringLengthStub string_length_stub(kind(), !object->IsString());
+ stub = string_length_stub.GetCode();
+ } else if (state == MONOMORPHIC && object->IsStringWrapper()) {
+ StringLengthStub string_length_stub(kind(), true);
+ stub = string_length_stub.GetCode();
+ } else if (state != MEGAMORPHIC) {
+ ASSERT(state != GENERIC);
+ stub = megamorphic_stub();
+ }
+ if (!stub.is_null()) {
+ set_target(*stub);
#ifdef DEBUG
- if (FLAG_trace_ic) PrintF("[LoadIC : +#length /string]\n");
+ if (FLAG_trace_ic) PrintF("[LoadIC : +#length /string]\n");
#endif
+ }
+ // Get the string if we have a string wrapper object.
+ Handle<Object> string = object->IsJSValue()
+ ? Handle<Object>(Handle<JSValue>::cast(object)->value())
+ : object;
+ *result = Smi::FromInt(String::cast(*string)->length());
+ return true;
}
- // Get the string if we have a string wrapper object.
- Handle<Object> string = object->IsJSValue()
- ? Handle<Object>(Handle<JSValue>::cast(object)->value())
- : object;
- *result = Smi::FromInt(String::cast(*string)->length());
- return true;
- }
- // Use specialized code for getting the length of arrays.
- if (object->IsJSArray() &&
name->Equals(isolate()->heap()->length_symbol())) {
- Handle<Code> stub;
- if (state == UNINITIALIZED) {
- stub = pre_monomorphic_stub();
- } else if (state == PREMONOMORPHIC) {
- ArrayLengthStub array_length_stub(kind());
- stub = array_length_stub.GetCode();
- } else if (state != MEGAMORPHIC) {
- ASSERT(state != GENERIC);
- stub = megamorphic_stub();
- }
- if (!stub.is_null()) {
- set_target(*stub);
+ // Use specialized code for getting the length of arrays.
+ if (object->IsJSArray() &&
+ name->Equals(isolate()->heap()->length_symbol())) {
+ Handle<Code> stub;
+ if (state == UNINITIALIZED) {
+ stub = pre_monomorphic_stub();
+ } else if (state == PREMONOMORPHIC) {
+ ArrayLengthStub array_length_stub(kind());
+ stub = array_length_stub.GetCode();
+ } else if (state != MEGAMORPHIC) {
+ ASSERT(state != GENERIC);
+ stub = megamorphic_stub();
+ }
+ if (!stub.is_null()) {
+ set_target(*stub);
#ifdef DEBUG
- if (FLAG_trace_ic) PrintF("[LoadIC : +#length /array]\n");
+ if (FLAG_trace_ic) PrintF("[LoadIC : +#length /array]\n");
#endif
- }
- *result = JSArray::cast(*object)->length();
- return true;
- }
-
- return false;
-}
-
-
-MaybeObject* LoadIC::Load(State state,
- Handle<Object> object,
- Handle<String> name) {
- // If the object is undefined or null it's illegal to try to get any
- // of its properties; throw a TypeError in that case.
- if (object->IsUndefined() || object->IsNull()) {
- return TypeError("non_object_property_load", object, name);
- }
-
- if (FLAG_use_ic) {
- MaybeObject* result;
- if (HandleLoad(state, object, name, &result)) {
- return result;
+ }
+ *result = JSArray::cast(*object)->length();
+ return true;
}
// Use specialized code for getting prototype of functions.
@@ -918,7 +901,8 @@
if (state == UNINITIALIZED) {
stub = pre_monomorphic_stub();
} else if (state == PREMONOMORPHIC) {
- stub = isolate()->builtins()->LoadIC_FunctionPrototype();
+ FunctionPrototypeStub function_prototype_stub(kind());
+ stub = function_prototype_stub.GetCode();
} else if (state != MEGAMORPHIC) {
ASSERT(state != GENERIC);
stub = megamorphic_stub();
@@ -929,9 +913,28 @@
if (FLAG_trace_ic) PrintF("[LoadIC : +#prototype /function]\n");
#endif
}
- return Accessors::FunctionGetPrototype(*object, 0);
+ *result = Accessors::FunctionGetPrototype(*object, 0);
+ return true;
}
}
+
+ return false;
+}
+
+
+MaybeObject* LoadIC::Load(State state,
+ Handle<Object> object,
+ Handle<String> name) {
+ // If the object is undefined or null it's illegal to try to get any
+ // of its properties; throw a TypeError in that case.
+ if (object->IsUndefined() || object->IsNull()) {
+ return TypeError("non_object_property_load", object, name);
+ }
+
+ MaybeObject* result;
+ if (HandleLoad(state, object, name, &result)) {
+ return result;
+ }
// Check if the name is trivially convertible to an index and get
// the element if so.
@@ -1170,26 +1173,9 @@
return TypeError("non_object_property_load", object, name);
}
- if (FLAG_use_ic) {
- MaybeObject* result;
- if (HandleLoad(state, object, name, &result)) {
- return result;
- }
-
- // TODO(1073): don't ignore the current stub state.
- // Use specialized code for getting prototype of functions.
- if (object->IsJSFunction() &&
- name->Equals(isolate()->heap()->prototype_symbol()) &&
- Handle<JSFunction>::cast(object)->should_have_prototype()) {
- Handle<JSFunction> function = Handle<JSFunction>::cast(object);
- Handle<Code> code =
- isolate()->stub_cache()->ComputeKeyedLoadFunctionPrototype(
- name, function);
- ASSERT(!code.is_null());
- set_target(*code);
- TRACE_IC("KeyedLoadIC", name, state, target());
- return Accessors::FunctionGetPrototype(*object, 0);
- }
+ MaybeObject* result;
+ if (HandleLoad(state, object, name, &result)) {
+ return result;
}
// Check if the name is trivially convertible to an index and get
=======================================
--- /branches/bleeding_edge/src/stub-cache.cc Mon Jan 21 09:17:02 2013
+++ /branches/bleeding_edge/src/stub-cache.cc Mon Jan 21 09:54:36 2013
@@ -346,24 +346,6 @@
JSObject::UpdateMapCodeCache(receiver, name, code);
return code;
}
-
-
-Handle<Code> StubCache::ComputeKeyedLoadFunctionPrototype(
- Handle<String> name,
- Handle<JSFunction> receiver) {
- Code::Flags flags =
- Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS);
- Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
- isolate_);
- if (probe->IsCode()) return Handle<Code>::cast(probe);
-
- KeyedLoadStubCompiler compiler(isolate_);
- Handle<Code> code = compiler.CompileLoadFunctionPrototype(name);
- PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code,
*name));
- GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code));
- JSObject::UpdateMapCodeCache(receiver, name, code);
- return code;
-}
Handle<Code> StubCache::ComputeStoreField(Handle<String> name,
=======================================
--- /branches/bleeding_edge/src/stub-cache.h Mon Jan 21 09:17:02 2013
+++ /branches/bleeding_edge/src/stub-cache.h Mon Jan 21 09:54:36 2013
@@ -133,9 +133,6 @@
Handle<JSObject> receiver,
Handle<JSObject> holder);
- Handle<Code> ComputeKeyedLoadFunctionPrototype(Handle<String> name,
- Handle<JSFunction>
receiver);
-
// ---
Handle<Code> ComputeStoreField(Handle<String> name,
@@ -664,8 +661,6 @@
Handle<JSObject> holder,
Handle<String> name);
- Handle<Code> CompileLoadFunctionPrototype(Handle<String> name);
-
Handle<Code> CompileLoadElement(Handle<Map> receiver_map);
Handle<Code> CompileLoadPolymorphic(MapHandleList* receiver_maps,
=======================================
--- /branches/bleeding_edge/src/x64/code-stubs-x64.cc Mon Jan 21 09:17:02
2013
+++ /branches/bleeding_edge/src/x64/code-stubs-x64.cc Mon Jan 21 09:54:36
2013
@@ -2385,6 +2385,33 @@
__ bind(&miss);
StubCompiler::GenerateLoadMiss(masm, kind());
}
+
+
+void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
+ Label miss;
+ Register receiver;
+ if (kind() == Code::KEYED_LOAD_IC) {
+ // ----------- S t a t e -------------
+ // -- rax : key
+ // -- rdx : receiver
+ // -- rsp[0] : return address
+ // -----------------------------------
+ __ Cmp(rax, masm->isolate()->factory()->prototype_symbol());
+ receiver = rdx;
+ } else {
+ ASSERT(kind() == Code::LOAD_IC);
+ // ----------- S t a t e -------------
+ // -- rax : receiver
+ // -- rcx : name
+ // -- rsp[0] : return address
+ // -----------------------------------
+ receiver = rax;
+ }
+
+ StubCompiler::GenerateLoadFunctionPrototype(masm, receiver, r8, r9,
&miss);
+ __ bind(&miss);
+ StubCompiler::GenerateLoadMiss(masm, kind());
+}
void StringLengthStub::Generate(MacroAssembler* masm) {
=======================================
--- /branches/bleeding_edge/src/x64/ic-x64.cc Mon Jan 21 09:17:02 2013
+++ /branches/bleeding_edge/src/x64/ic-x64.cc Mon Jan 21 09:54:36 2013
@@ -222,20 +222,6 @@
__ movq(scratch0, value);
__ RecordWrite(elements, scratch1, scratch0, kDontSaveFPRegs);
}
-
-
-void LoadIC::GenerateFunctionPrototype(MacroAssembler* masm) {
- // ----------- S t a t e -------------
- // -- rax : receiver
- // -- rcx : name
- // -- rsp[0] : return address
- // -----------------------------------
- Label miss;
-
- StubCompiler::GenerateLoadFunctionPrototype(masm, rax, rdx, rbx, &miss);
- __ bind(&miss);
- StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC);
-}
// Checks the receiver for special cases (value type, slow case bits).
=======================================
--- /branches/bleeding_edge/src/x64/stub-cache-x64.cc Mon Jan 21 09:17:02
2013
+++ /branches/bleeding_edge/src/x64/stub-cache-x64.cc Mon Jan 21 09:54:36
2013
@@ -3126,32 +3126,6 @@
// Return the generated code.
return GetCode(Code::INTERCEPTOR, name);
}
-
-
-Handle<Code> KeyedLoadStubCompiler::CompileLoadFunctionPrototype(
- Handle<String> name) {
- // ----------- S t a t e -------------
- // -- rax : key
- // -- rdx : receiver
- // -- rsp[0] : return address
- // -----------------------------------
- Label miss;
-
- Counters* counters = isolate()->counters();
- __ IncrementCounter(counters->keyed_load_function_prototype(), 1);
-
- // Check that the name has not changed.
- __ Cmp(rax, name);
- __ j(not_equal, &miss);
-
- GenerateLoadFunctionPrototype(masm(), rdx, rcx, rbx, &miss);
- __ bind(&miss);
- __ DecrementCounter(counters->keyed_load_function_prototype(), 1);
- GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
-
- // Return the generated code.
- return GetCode(Code::CALLBACKS, name);
-}
Handle<Code> KeyedLoadStubCompiler::CompileLoadElement(
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev