| Index: src/code-stubs.cc
|
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc
|
| index 5a3f4e4c34d23aff9289bdf472104d5d0accf652..0fd96f96c7d5349f6e66593ea58e5d861cc37e41 100644
|
| --- a/src/code-stubs.cc
|
| +++ b/src/code-stubs.cc
|
| @@ -16,9 +16,12 @@ namespace v8 {
|
| namespace internal {
|
|
|
|
|
| +InterfaceDescriptor::InterfaceDescriptor()
|
| + : register_param_count_(-1) { }
|
| +
|
| +
|
| CodeStubInterfaceDescriptor::CodeStubInterfaceDescriptor()
|
| - : register_param_count_(-1),
|
| - stack_parameter_count_(no_reg),
|
| + : stack_parameter_count_(no_reg),
|
| hint_stack_parameter_count_(-1),
|
| function_mode_(NOT_JS_FUNCTION_STUB_MODE),
|
| deoptimization_handler_(NULL),
|
| @@ -27,15 +30,18 @@ CodeStubInterfaceDescriptor::CodeStubInterfaceDescriptor()
|
| has_miss_handler_(false) { }
|
|
|
|
|
| -void CodeStubInterfaceDescriptor::Initialize(
|
| +void InterfaceDescriptor::Initialize(
|
| int register_parameter_count,
|
| Register* registers,
|
| - Address deoptimization_handler,
|
| Representation* register_param_representations,
|
| - int hint_stack_parameter_count,
|
| - StubFunctionMode function_mode) {
|
| - // CodeStubInterfaceDescriptor owns a copy of the registers array.
|
| + PlatformInterfaceDescriptor* platform_descriptor) {
|
| + platform_specific_descriptor_ = platform_descriptor;
|
| register_param_count_ = register_parameter_count;
|
| +
|
| + // An interface descriptor must have a context register.
|
| + ASSERT(register_parameter_count > 0 && registers[0].is(ContextRegister()));
|
| +
|
| + // InterfaceDescriptor owns a copy of the registers array.
|
| register_params_.Reset(NewArray<Register>(register_parameter_count));
|
| for (int i = 0; i < register_parameter_count; i++) {
|
| register_params_[i] = registers[i];
|
| @@ -47,9 +53,24 @@ void CodeStubInterfaceDescriptor::Initialize(
|
| register_param_representations_.Reset(
|
| NewArray<Representation>(register_parameter_count));
|
| for (int i = 0; i < register_parameter_count; i++) {
|
| + // If there is a context register, the representation must be tagged.
|
| + ASSERT(i != 0 || register_param_representations[i].Equals(
|
| + Representation::Tagged()));
|
| register_param_representations_[i] = register_param_representations[i];
|
| }
|
| }
|
| +}
|
| +
|
| +
|
| +void CodeStubInterfaceDescriptor::Initialize(
|
| + int register_parameter_count,
|
| + Register* registers,
|
| + Address deoptimization_handler,
|
| + Representation* register_param_representations,
|
| + int hint_stack_parameter_count,
|
| + StubFunctionMode function_mode) {
|
| + InterfaceDescriptor::Initialize(register_parameter_count, registers,
|
| + register_param_representations);
|
|
|
| deoptimization_handler_ = deoptimization_handler;
|
|
|
| @@ -81,22 +102,9 @@ void CallInterfaceDescriptor::Initialize(
|
| int register_parameter_count,
|
| Register* registers,
|
| Representation* param_representations,
|
| - PlatformCallInterfaceDescriptor* platform_descriptor) {
|
| - // CallInterfaceDescriptor owns a copy of the registers array.
|
| - register_param_count_ = register_parameter_count;
|
| - register_params_.Reset(NewArray<Register>(register_parameter_count));
|
| - for (int i = 0; i < register_parameter_count; i++) {
|
| - register_params_[i] = registers[i];
|
| - }
|
| -
|
| - // Also the register parameter representations.
|
| - param_representations_.Reset(
|
| - NewArray<Representation>(register_parameter_count));
|
| - for (int i = 0; i < register_parameter_count; i++) {
|
| - param_representations_[i] = param_representations[i];
|
| - }
|
| -
|
| - platform_specific_descriptor_ = platform_descriptor;
|
| + PlatformInterfaceDescriptor* platform_descriptor) {
|
| + InterfaceDescriptor::Initialize(register_parameter_count, registers,
|
| + param_representations, platform_descriptor);
|
| }
|
|
|
|
|
| @@ -574,7 +582,8 @@ void JSEntryStub::FinishCode(Handle<Code> code) {
|
|
|
| void KeyedLoadFastElementStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| - Register registers[] = { LoadIC::ReceiverRegister(),
|
| + Register registers[] = { InterfaceDescriptor::ContextRegister(),
|
| + LoadIC::ReceiverRegister(),
|
| LoadIC::NameRegister() };
|
| STATIC_ASSERT(LoadIC::kRegisterArgumentCount == 2);
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| @@ -584,7 +593,8 @@ void KeyedLoadFastElementStub::InitializeInterfaceDescriptor(
|
|
|
| void KeyedLoadDictionaryElementStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| - Register registers[] = { LoadIC::ReceiverRegister(),
|
| + Register registers[] = { InterfaceDescriptor::ContextRegister(),
|
| + LoadIC::ReceiverRegister(),
|
| LoadIC::NameRegister() };
|
| STATIC_ASSERT(LoadIC::kRegisterArgumentCount == 2);
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| @@ -594,7 +604,8 @@ void KeyedLoadDictionaryElementStub::InitializeInterfaceDescriptor(
|
|
|
| void KeyedLoadGenericElementStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| - Register registers[] = { LoadIC::ReceiverRegister(),
|
| + Register registers[] = { InterfaceDescriptor::ContextRegister(),
|
| + LoadIC::ReceiverRegister(),
|
| LoadIC::NameRegister() };
|
| STATIC_ASSERT(LoadIC::kRegisterArgumentCount == 2);
|
| descriptor->Initialize(
|
| @@ -605,21 +616,24 @@ void KeyedLoadGenericElementStub::InitializeInterfaceDescriptor(
|
|
|
| void LoadFieldStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| - Register registers[] = { LoadIC::ReceiverRegister() };
|
| + Register registers[] = { InterfaceDescriptor::ContextRegister(),
|
| + LoadIC::ReceiverRegister() };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers);
|
| }
|
|
|
|
|
| void KeyedLoadFieldStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| - Register registers[] = { LoadIC::ReceiverRegister() };
|
| + Register registers[] = { InterfaceDescriptor::ContextRegister(),
|
| + LoadIC::ReceiverRegister() };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers);
|
| }
|
|
|
|
|
| void StringLengthStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| - Register registers[] = { LoadIC::ReceiverRegister(),
|
| + Register registers[] = { InterfaceDescriptor::ContextRegister(),
|
| + LoadIC::ReceiverRegister(),
|
| LoadIC::NameRegister() };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers);
|
| }
|
| @@ -627,7 +641,8 @@ void StringLengthStub::InitializeInterfaceDescriptor(
|
|
|
| void KeyedStringLengthStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| - Register registers[] = { LoadIC::ReceiverRegister(),
|
| + Register registers[] = { InterfaceDescriptor::ContextRegister(),
|
| + LoadIC::ReceiverRegister(),
|
| LoadIC::NameRegister() };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers);
|
| }
|
| @@ -635,7 +650,8 @@ void KeyedStringLengthStub::InitializeInterfaceDescriptor(
|
|
|
| void KeyedStoreFastElementStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| - Register registers[] = { KeyedStoreIC::ReceiverRegister(),
|
| + Register registers[] = { InterfaceDescriptor::ContextRegister(),
|
| + KeyedStoreIC::ReceiverRegister(),
|
| KeyedStoreIC::NameRegister(),
|
| KeyedStoreIC::ValueRegister() };
|
| descriptor->Initialize(
|
| @@ -646,7 +662,8 @@ void KeyedStoreFastElementStub::InitializeInterfaceDescriptor(
|
|
|
| void StoreGlobalStub::InitializeInterfaceDescriptor(
|
| CodeStubInterfaceDescriptor* descriptor) {
|
| - Register registers[] = { StoreIC::ReceiverRegister(),
|
| + Register registers[] = { InterfaceDescriptor::ContextRegister(),
|
| + StoreIC::ReceiverRegister(),
|
| StoreIC::NameRegister(),
|
| StoreIC::ValueRegister() };
|
| descriptor->Initialize(ARRAY_SIZE(registers), registers,
|
| @@ -853,7 +870,7 @@ static void InstallDescriptor(Isolate* isolate, HydrogenCodeStub* stub) {
|
| int major_key = stub->MajorKey();
|
| CodeStubInterfaceDescriptor* descriptor =
|
| isolate->code_stub_interface_descriptor(major_key);
|
| - if (!descriptor->initialized()) {
|
| + if (!descriptor->IsInitialized()) {
|
| stub->InitializeInterfaceDescriptor(descriptor);
|
| }
|
| }
|
|
|