CallDescriptors::InitializeForIsolate() is no longer needed.

CallInterfaceDescriptors initialize themselves lazily. Soon we can also tear
down the CodeStubInterfaceDescriptor explicit initialization step.

R=yangguo@chromium.org

Review URL: https://codereview.chromium.org/535103002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@23652 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 3e032ad9
......@@ -59,59 +59,61 @@ const Register InstanceofDescriptor::left() { return r0; }
const Register InstanceofDescriptor::right() { return r1; }
void FastNewClosureDescriptor::Initialize(Isolate* isolate) {
void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r2};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void FastNewContextDescriptor::Initialize(Isolate* isolate) {
void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r1};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ToNumberDescriptor::Initialize(Isolate* isolate) {
void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void NumberToStringDescriptor::Initialize(Isolate* isolate) {
void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void FastCloneShallowArrayDescriptor::Initialize(Isolate* isolate) {
void FastCloneShallowArrayDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r3, r2, r1};
Representation representations[] = {
Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
Representation::Tagged()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void FastCloneShallowObjectDescriptor::Initialize(Isolate* isolate) {
void FastCloneShallowObjectDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r3, r2, r1, r0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CreateAllocationSiteDescriptor::Initialize(Isolate* isolate) {
void CreateAllocationSiteDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r2, r3};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CallFunctionDescriptor::Initialize(Isolate* isolate) {
void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r1};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CallConstructDescriptor::Initialize(Isolate* isolate) {
void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// r0 : number of arguments
// r1 : the function to call
// r2 : feedback vector
......@@ -120,97 +122,100 @@ void CallConstructDescriptor::Initialize(Isolate* isolate) {
// TODO(turbofan): So far we don't gather type feedback and hence skip the
// slot parameter, but ArrayConstructStub needs the vector to be undefined.
Register registers[] = {cp, r0, r1, r2};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void RegExpConstructResultDescriptor::Initialize(Isolate* isolate) {
void RegExpConstructResultDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r2, r1, r0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void TransitionElementsKindDescriptor::Initialize(Isolate* isolate) {
void TransitionElementsKindDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r0, r1};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ArrayConstructorConstantArgCountDescriptor::Initialize(Isolate* isolate) {
void ArrayConstructorConstantArgCountDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// register state
// cp -- context
// r0 -- number of arguments
// r1 -- function
// r2 -- allocation site with elements kind
Register registers[] = {cp, r1, r2};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ArrayConstructorDescriptor::Initialize(Isolate* isolate) {
void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// stack param count needs (constructor pointer, and single argument)
Register registers[] = {cp, r1, r2, r0};
Representation representations[] = {
Representation::Tagged(), Representation::Tagged(),
Representation::Tagged(), Representation::Integer32()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
Isolate* isolate) {
CallInterfaceDescriptorData* data) {
// register state
// cp -- context
// r0 -- number of arguments
// r1 -- constructor function
Register registers[] = {cp, r1};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void InternalArrayConstructorDescriptor::Initialize(Isolate* isolate) {
void InternalArrayConstructorDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// stack param count needs (constructor pointer, and single argument)
Register registers[] = {cp, r1, r0};
Representation representations[] = {Representation::Tagged(),
Representation::Tagged(),
Representation::Integer32()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void CompareNilDescriptor::Initialize(Isolate* isolate) {
void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ToBooleanDescriptor::Initialize(Isolate* isolate) {
void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void BinaryOpDescriptor::Initialize(Isolate* isolate) {
void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r1, r0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void BinaryOpWithAllocationSiteDescriptor::Initialize(Isolate* isolate) {
void BinaryOpWithAllocationSiteDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r2, r1, r0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void StringAddDescriptor::Initialize(Isolate* isolate) {
void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {cp, r1, r0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void KeyedDescriptor::Initialize(Isolate* isolate) {
void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
static PlatformInterfaceDescriptor noInlineDescriptor =
PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
......@@ -222,12 +227,12 @@ void KeyedDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // key
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations, &noInlineDescriptor);
data->Initialize(arraysize(registers), registers, representations,
&noInlineDescriptor);
}
void NamedDescriptor::Initialize(Isolate* isolate) {
void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
static PlatformInterfaceDescriptor noInlineDescriptor =
PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
......@@ -239,12 +244,12 @@ void NamedDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // name
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations, &noInlineDescriptor);
data->Initialize(arraysize(registers), registers, representations,
&noInlineDescriptor);
}
void CallHandlerDescriptor::Initialize(Isolate* isolate) {
void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
static PlatformInterfaceDescriptor default_descriptor =
PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
......@@ -256,12 +261,12 @@ void CallHandlerDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // receiver
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations, &default_descriptor);
data->Initialize(arraysize(registers), registers, representations,
&default_descriptor);
}
void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) {
void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
static PlatformInterfaceDescriptor default_descriptor =
PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
......@@ -277,12 +282,12 @@ void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) {
Representation::Integer32(), // actual number of arguments
Representation::Integer32(), // expected number of arguments
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations, &default_descriptor);
data->Initialize(arraysize(registers), registers, representations,
&default_descriptor);
}
void ApiFunctionDescriptor::Initialize(Isolate* isolate) {
void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
static PlatformInterfaceDescriptor default_descriptor =
PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
......@@ -300,8 +305,8 @@ void ApiFunctionDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // holder
Representation::External(), // api_function_address
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations, &default_descriptor);
data->Initialize(arraysize(registers), registers, representations,
&default_descriptor);
}
}
} // namespace v8::internal
......
......@@ -67,39 +67,40 @@ const Register InstanceofDescriptor::right() {
}
void FastNewClosureDescriptor::Initialize(Isolate* isolate) {
void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// cp: context
// x2: function info
Register registers[] = {cp, x2};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void FastNewContextDescriptor::Initialize(Isolate* isolate) {
void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// cp: context
// x1: function
Register registers[] = {cp, x1};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ToNumberDescriptor::Initialize(Isolate* isolate) {
void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// cp: context
// x0: value
Register registers[] = {cp, x0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void NumberToStringDescriptor::Initialize(Isolate* isolate) {
void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// cp: context
// x0: value
Register registers[] = {cp, x0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void FastCloneShallowArrayDescriptor::Initialize(Isolate* isolate) {
void FastCloneShallowArrayDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// cp: context
// x3: array literals array
// x2: array literal index
......@@ -108,39 +109,40 @@ void FastCloneShallowArrayDescriptor::Initialize(Isolate* isolate) {
Representation representations[] = {
Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
Representation::Tagged()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void FastCloneShallowObjectDescriptor::Initialize(Isolate* isolate) {
void FastCloneShallowObjectDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// cp: context
// x3: object literals array
// x2: object literal index
// x1: constant properties
// x0: object literal flags
Register registers[] = {cp, x3, x2, x1, x0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CreateAllocationSiteDescriptor::Initialize(Isolate* isolate) {
void CreateAllocationSiteDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// cp: context
// x2: feedback vector
// x3: call feedback slot
Register registers[] = {cp, x2, x3};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CallFunctionDescriptor::Initialize(Isolate* isolate) {
void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// x1 function the function to call
Register registers[] = {cp, x1};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CallConstructDescriptor::Initialize(Isolate* isolate) {
void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// x0 : number of arguments
// x1 : the function to call
// x2 : feedback vector
......@@ -148,116 +150,119 @@ void CallConstructDescriptor::Initialize(Isolate* isolate) {
// TODO(turbofan): So far we don't gather type feedback and hence skip the
// slot parameter, but ArrayConstructStub needs the vector to be undefined.
Register registers[] = {cp, x0, x1, x2};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void RegExpConstructResultDescriptor::Initialize(Isolate* isolate) {
void RegExpConstructResultDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// cp: context
// x2: length
// x1: index (of last match)
// x0: string
Register registers[] = {cp, x2, x1, x0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void TransitionElementsKindDescriptor::Initialize(Isolate* isolate) {
void TransitionElementsKindDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// cp: context
// x0: value (js_array)
// x1: to_map
Register registers[] = {cp, x0, x1};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ArrayConstructorConstantArgCountDescriptor::Initialize(Isolate* isolate) {
void ArrayConstructorConstantArgCountDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// cp: context
// x1: function
// x2: allocation site with elements kind
// x0: number of arguments to the constructor function
Register registers[] = {cp, x1, x2};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ArrayConstructorDescriptor::Initialize(Isolate* isolate) {
void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// stack param count needs (constructor pointer, and single argument)
Register registers[] = {cp, x1, x2, x0};
Representation representations[] = {
Representation::Tagged(), Representation::Tagged(),
Representation::Tagged(), Representation::Integer32()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
Isolate* isolate) {
CallInterfaceDescriptorData* data) {
// cp: context
// x1: constructor function
// x0: number of arguments to the constructor function
Register registers[] = {cp, x1};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void InternalArrayConstructorDescriptor::Initialize(Isolate* isolate) {
void InternalArrayConstructorDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// stack param count needs (constructor pointer, and single argument)
Register registers[] = {cp, x1, x0};
Representation representations[] = {Representation::Tagged(),
Representation::Tagged(),
Representation::Integer32()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void CompareNilDescriptor::Initialize(Isolate* isolate) {
void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// cp: context
// x0: value to compare
Register registers[] = {cp, x0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ToBooleanDescriptor::Initialize(Isolate* isolate) {
void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// cp: context
// x0: value
Register registers[] = {cp, x0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void BinaryOpDescriptor::Initialize(Isolate* isolate) {
void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// cp: context
// x1: left operand
// x0: right operand
Register registers[] = {cp, x1, x0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void BinaryOpWithAllocationSiteDescriptor::Initialize(Isolate* isolate) {
void BinaryOpWithAllocationSiteDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// cp: context
// x2: allocation site
// x1: left operand
// x0: right operand
Register registers[] = {cp, x2, x1, x0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void StringAddDescriptor::Initialize(Isolate* isolate) {
void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// cp: context
// x1: left operand
// x0: right operand
Register registers[] = {cp, x1, x0};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void KeyedDescriptor::Initialize(Isolate* isolate) {
void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
static PlatformInterfaceDescriptor noInlineDescriptor =
PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
......@@ -269,12 +274,12 @@ void KeyedDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // key
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations, &noInlineDescriptor);
data->Initialize(arraysize(registers), registers, representations,
&noInlineDescriptor);
}
void NamedDescriptor::Initialize(Isolate* isolate) {
void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
static PlatformInterfaceDescriptor noInlineDescriptor =
PlatformInterfaceDescriptor(NEVER_INLINE_TARGET_ADDRESS);
......@@ -286,12 +291,12 @@ void NamedDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // name
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations, &noInlineDescriptor);
data->Initialize(arraysize(registers), registers, representations,
&noInlineDescriptor);
}
void CallHandlerDescriptor::Initialize(Isolate* isolate) {
void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
static PlatformInterfaceDescriptor default_descriptor =
PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
......@@ -303,12 +308,12 @@ void CallHandlerDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // receiver
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations, &default_descriptor);
data->Initialize(arraysize(registers), registers, representations,
&default_descriptor);
}
void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) {
void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
static PlatformInterfaceDescriptor default_descriptor =
PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
......@@ -324,12 +329,12 @@ void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) {
Representation::Integer32(), // actual number of arguments
Representation::Integer32(), // expected number of arguments
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations, &default_descriptor);
data->Initialize(arraysize(registers), registers, representations,
&default_descriptor);
}
void ApiFunctionDescriptor::Initialize(Isolate* isolate) {
void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
static PlatformInterfaceDescriptor default_descriptor =
PlatformInterfaceDescriptor(CAN_INLINE_TARGET_ADDRESS);
......@@ -347,8 +352,8 @@ void ApiFunctionDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // holder
Representation::External(), // api_function_address
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations, &default_descriptor);
data->Initialize(arraysize(registers), registers, representations,
&default_descriptor);
}
}
} // namespace v8::internal
......
......@@ -61,60 +61,62 @@ const Register InstanceofDescriptor::left() { return eax; }
const Register InstanceofDescriptor::right() { return edx; }
void FastNewClosureDescriptor::Initialize(Isolate* isolate) {
void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {esi, ebx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void FastNewContextDescriptor::Initialize(Isolate* isolate) {
void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {esi, edi};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ToNumberDescriptor::Initialize(Isolate* isolate) {
void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// ToNumberStub invokes a function, and therefore needs a context.
Register registers[] = {esi, eax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void NumberToStringDescriptor::Initialize(Isolate* isolate) {
void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {esi, eax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void FastCloneShallowArrayDescriptor::Initialize(Isolate* isolate) {
void FastCloneShallowArrayDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {esi, eax, ebx, ecx};
Representation representations[] = {
Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
Representation::Tagged()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void FastCloneShallowObjectDescriptor::Initialize(Isolate* isolate) {
void FastCloneShallowObjectDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {esi, eax, ebx, ecx, edx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CreateAllocationSiteDescriptor::Initialize(Isolate* isolate) {
void CreateAllocationSiteDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {esi, ebx, edx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CallFunctionDescriptor::Initialize(Isolate* isolate) {
void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {esi, edi};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CallConstructDescriptor::Initialize(Isolate* isolate) {
void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// eax : number of arguments
// ebx : feedback vector
// edx : (only if ebx is not the megamorphic symbol) slot in feedback
......@@ -123,95 +125,98 @@ void CallConstructDescriptor::Initialize(Isolate* isolate) {
// TODO(turbofan): So far we don't gather type feedback and hence skip the
// slot parameter, but ArrayConstructStub needs the vector to be undefined.
Register registers[] = {esi, eax, edi, ebx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void RegExpConstructResultDescriptor::Initialize(Isolate* isolate) {
void RegExpConstructResultDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {esi, ecx, ebx, eax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void TransitionElementsKindDescriptor::Initialize(Isolate* isolate) {
void TransitionElementsKindDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {esi, eax, ebx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ArrayConstructorConstantArgCountDescriptor::Initialize(Isolate* isolate) {
void ArrayConstructorConstantArgCountDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// register state
// eax -- number of arguments
// edi -- function
// ebx -- allocation site with elements kind
Register registers[] = {esi, edi, ebx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ArrayConstructorDescriptor::Initialize(Isolate* isolate) {
void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// stack param count needs (constructor pointer, and single argument)
Register registers[] = {esi, edi, ebx, eax};
Representation representations[] = {
Representation::Tagged(), Representation::Tagged(),
Representation::Tagged(), Representation::Integer32()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
Isolate* isolate) {
CallInterfaceDescriptorData* data) {
// register state
// eax -- number of arguments
// edi -- function
Register registers[] = {esi, edi};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void InternalArrayConstructorDescriptor::Initialize(Isolate* isolate) {
void InternalArrayConstructorDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// stack param count needs (constructor pointer, and single argument)
Register registers[] = {esi, edi, eax};
Representation representations[] = {Representation::Tagged(),
Representation::Tagged(),
Representation::Integer32()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void CompareNilDescriptor::Initialize(Isolate* isolate) {
void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {esi, eax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ToBooleanDescriptor::Initialize(Isolate* isolate) {
void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {esi, eax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void BinaryOpDescriptor::Initialize(Isolate* isolate) {
void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {esi, edx, eax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void BinaryOpWithAllocationSiteDescriptor::Initialize(Isolate* isolate) {
void BinaryOpWithAllocationSiteDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {esi, ecx, edx, eax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void StringAddDescriptor::Initialize(Isolate* isolate) {
void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {esi, edx, eax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void KeyedDescriptor::Initialize(Isolate* isolate) {
void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
esi, // context
ecx, // key
......@@ -220,12 +225,11 @@ void KeyedDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // key
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void NamedDescriptor::Initialize(Isolate* isolate) {
void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
esi, // context
ecx, // name
......@@ -234,12 +238,11 @@ void NamedDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // name
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void CallHandlerDescriptor::Initialize(Isolate* isolate) {
void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
esi, // context
edx, // name
......@@ -248,12 +251,11 @@ void CallHandlerDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // receiver
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) {
void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
esi, // context
edi, // JSFunction
......@@ -266,12 +268,11 @@ void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) {
Representation::Integer32(), // actual number of arguments
Representation::Integer32(), // expected number of arguments
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void ApiFunctionDescriptor::Initialize(Isolate* isolate) {
void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
esi, // context
eax, // callee
......@@ -286,8 +287,7 @@ void ApiFunctionDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // holder
Representation::External(), // api_function_address
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
}
} // namespace v8::internal
......
......@@ -42,50 +42,39 @@ void CallInterfaceDescriptorData::Initialize(
}
void LoadDescriptor::Initialize(Isolate* isolate) {
void LoadDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {ContextRegister(), ReceiverRegister(),
NameRegister()};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void StoreDescriptor::Initialize(Isolate* isolate) {
void StoreDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(),
ValueRegister()};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ElementTransitionAndStoreDescriptor::Initialize(Isolate* isolate) {
void ElementTransitionAndStoreDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {ContextRegister(), ValueRegister(), MapRegister(),
NameRegister(), ReceiverRegister()};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void InstanceofDescriptor::Initialize(Isolate* isolate) {
void InstanceofDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {ContextRegister(), left(), right()};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void VectorLoadICDescriptor::Initialize(Isolate* isolate) {
void VectorLoadICDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {ContextRegister(), ReceiverRegister(), NameRegister(),
SlotRegister(), VectorRegister()};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CallDescriptors::InitializeForIsolate(Isolate* isolate) {
// Mechanically initialize all descriptors. The DCHECK makes sure that the
// Initialize() method did what it is supposed to do.
#define INITIALIZE_DESCRIPTOR(D) \
D##Descriptor::Initialize(isolate); \
DCHECK(D##Descriptor(isolate).IsInitialized());
INTERFACE_DESCRIPTOR_LIST(INITIALIZE_DESCRIPTOR)
#undef INITIALIZE_DESCRIPTOR
}
}
} // namespace v8::internal
......@@ -104,8 +104,6 @@ class CallDescriptors {
#undef DEF_ENUM
NUMBER_OF_DESCRIPTORS
};
static void InitializeForIsolate(Isolate* isolate);
};
......@@ -163,24 +161,18 @@ class CallInterfaceDescriptor {
protected:
const CallInterfaceDescriptorData* data() const { return data_; }
static void InitializeData(
Isolate* isolate, CallDescriptors::Key key, int register_parameter_count,
Register* registers, Representation* param_representations,
PlatformInterfaceDescriptor* platform_descriptor = NULL) {
isolate->call_descriptor_data(key)
->Initialize(register_parameter_count, registers, param_representations,
platform_descriptor);
}
private:
const CallInterfaceDescriptorData* data_;
};
#define DECLARE_DESCRIPTOR(name) \
explicit name(Isolate* isolate) : CallInterfaceDescriptor(isolate, key()) {} \
static inline CallDescriptors::Key key(); \
static void Initialize(Isolate* isolate);
#define DECLARE_DESCRIPTOR(name) \
explicit name(Isolate* isolate) : CallInterfaceDescriptor(isolate, key()) { \
if (!data()->IsInitialized()) \
Initialize(isolate->call_descriptor_data(key())); \
} \
static inline CallDescriptors::Key key(); \
void Initialize(CallInterfaceDescriptorData* data);
class LoadDescriptor : public CallInterfaceDescriptor {
......
......@@ -1917,8 +1917,6 @@ bool Isolate::Init(Deserializer* des) {
deoptimizer_data_ = new DeoptimizerData(memory_allocator_);
CallDescriptors::InitializeForIsolate(this);
const bool create_heap_objects = (des == NULL);
if (create_heap_objects && !heap_.CreateHeapObjects()) {
V8::FatalProcessOutOfMemory("heap object creation");
......
......@@ -61,60 +61,62 @@ const Register InstanceofDescriptor::left() { return rax; }
const Register InstanceofDescriptor::right() { return rdx; }
void FastNewClosureDescriptor::Initialize(Isolate* isolate) {
void FastNewClosureDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rbx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void FastNewContextDescriptor::Initialize(Isolate* isolate) {
void FastNewContextDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rdi};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ToNumberDescriptor::Initialize(Isolate* isolate) {
void ToNumberDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// ToNumberStub invokes a function, and therefore needs a context.
Register registers[] = {rsi, rax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void NumberToStringDescriptor::Initialize(Isolate* isolate) {
void NumberToStringDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void FastCloneShallowArrayDescriptor::Initialize(Isolate* isolate) {
void FastCloneShallowArrayDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rax, rbx, rcx};
Representation representations[] = {
Representation::Tagged(), Representation::Tagged(), Representation::Smi(),
Representation::Tagged()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void FastCloneShallowObjectDescriptor::Initialize(Isolate* isolate) {
void FastCloneShallowObjectDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rax, rbx, rcx, rdx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CreateAllocationSiteDescriptor::Initialize(Isolate* isolate) {
void CreateAllocationSiteDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rbx, rdx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CallFunctionDescriptor::Initialize(Isolate* isolate) {
void CallFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rdi};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void CallConstructDescriptor::Initialize(Isolate* isolate) {
void CallConstructDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// rax : number of arguments
// rbx : feedback vector
// rdx : (only if rbx is not the megamorphic symbol) slot in feedback
......@@ -123,96 +125,99 @@ void CallConstructDescriptor::Initialize(Isolate* isolate) {
// TODO(turbofan): So far we don't gather type feedback and hence skip the
// slot parameter, but ArrayConstructStub needs the vector to be undefined.
Register registers[] = {rsi, rax, rdi, rbx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void RegExpConstructResultDescriptor::Initialize(Isolate* isolate) {
void RegExpConstructResultDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rcx, rbx, rax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void TransitionElementsKindDescriptor::Initialize(Isolate* isolate) {
void TransitionElementsKindDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rax, rbx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ArrayConstructorConstantArgCountDescriptor::Initialize(Isolate* isolate) {
void ArrayConstructorConstantArgCountDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// register state
// rax -- number of arguments
// rdi -- function
// rbx -- allocation site with elements kind
Register registers[] = {rsi, rdi, rbx};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ArrayConstructorDescriptor::Initialize(Isolate* isolate) {
void ArrayConstructorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
// stack param count needs (constructor pointer, and single argument)
Register registers[] = {rsi, rdi, rbx, rax};
Representation representations[] = {
Representation::Tagged(), Representation::Tagged(),
Representation::Tagged(), Representation::Integer32()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void InternalArrayConstructorConstantArgCountDescriptor::Initialize(
Isolate* isolate) {
CallInterfaceDescriptorData* data) {
// register state
// rsi -- context
// rax -- number of arguments
// rdi -- constructor function
Register registers[] = {rsi, rdi};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void InternalArrayConstructorDescriptor::Initialize(Isolate* isolate) {
void InternalArrayConstructorDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
// stack param count needs (constructor pointer, and single argument)
Register registers[] = {rsi, rdi, rax};
Representation representations[] = {Representation::Tagged(),
Representation::Tagged(),
Representation::Integer32()};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void CompareNilDescriptor::Initialize(Isolate* isolate) {
void CompareNilDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void ToBooleanDescriptor::Initialize(Isolate* isolate) {
void ToBooleanDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void BinaryOpDescriptor::Initialize(Isolate* isolate) {
void BinaryOpDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rdx, rax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void BinaryOpWithAllocationSiteDescriptor::Initialize(Isolate* isolate) {
void BinaryOpWithAllocationSiteDescriptor::Initialize(
CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rcx, rdx, rax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void StringAddDescriptor::Initialize(Isolate* isolate) {
void StringAddDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {rsi, rdx, rax};
InitializeData(isolate, key(), arraysize(registers), registers, NULL);
data->Initialize(arraysize(registers), registers, NULL);
}
void KeyedDescriptor::Initialize(Isolate* isolate) {
void KeyedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
rsi, // context
rcx, // key
......@@ -221,12 +226,11 @@ void KeyedDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // key
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void NamedDescriptor::Initialize(Isolate* isolate) {
void NamedDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
rsi, // context
rcx, // name
......@@ -235,12 +239,11 @@ void NamedDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // name
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void CallHandlerDescriptor::Initialize(Isolate* isolate) {
void CallHandlerDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
rsi, // context
rdx, // receiver
......@@ -249,12 +252,11 @@ void CallHandlerDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // context
Representation::Tagged(), // receiver
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) {
void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
rsi, // context
rdi, // JSFunction
......@@ -267,12 +269,11 @@ void ArgumentAdaptorDescriptor::Initialize(Isolate* isolate) {
Representation::Integer32(), // actual number of arguments
Representation::Integer32(), // expected number of arguments
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
void ApiFunctionDescriptor::Initialize(Isolate* isolate) {
void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
rsi, // context
rax, // callee
......@@ -287,8 +288,7 @@ void ApiFunctionDescriptor::Initialize(Isolate* isolate) {
Representation::Tagged(), // holder
Representation::External(), // api_function_address
};
InitializeData(isolate, key(), arraysize(registers), registers,
representations);
data->Initialize(arraysize(registers), registers, representations);
}
}
} // namespace v8::internal
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment