Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index b56a3ecfcb24b94535408b6734aeb8364aa0924a..8f1b686743317a39f95b764933a901de4b788214 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -277,23 +277,23 @@ class PlatformCodeStub : public CodeStub { |
enum StubFunctionMode { NOT_JS_FUNCTION_STUB_MODE, JS_FUNCTION_STUB_MODE }; |
- |
+enum HandlerArgumentsMode { DONT_PASS_ARGUMENTS, PASS_ARGUMENTS }; |
struct CodeStubInterfaceDescriptor { |
CodeStubInterfaceDescriptor(); |
int register_param_count_; |
+ |
Register stack_parameter_count_; |
// if hint_stack_parameter_count_ > 0, the code stub can optimize the |
// return sequence. Default value is -1, which means it is ignored. |
int hint_stack_parameter_count_; |
StubFunctionMode function_mode_; |
Register* register_params_; |
+ |
Address deoptimization_handler_; |
+ HandlerArgumentsMode handler_arguments_mode_; |
int environment_length() const { |
- if (stack_parameter_count_.is_valid()) { |
- return register_param_count_ + 1; |
- } |
return register_param_count_; |
} |
@@ -302,6 +302,9 @@ struct CodeStubInterfaceDescriptor { |
void SetMissHandler(ExternalReference handler) { |
miss_handler_ = handler; |
has_miss_handler_ = true; |
+ // Our miss handler infrastructure doesn't currently support |
+ // variable stack parameter counts. |
+ ASSERT(!stack_parameter_count_.is_valid()); |
} |
ExternalReference miss_handler() { |
@@ -313,18 +316,27 @@ struct CodeStubInterfaceDescriptor { |
return has_miss_handler_; |
} |
+ Register GetParameterRegister(int index) { |
+ return register_params_[index]; |
+ } |
+ |
+ bool IsParameterCountRegister(int index) { |
+ return GetParameterRegister(index).is(stack_parameter_count_); |
+ } |
+ |
+ int GetHandlerParameterCount() { |
+ int params = environment_length(); |
+ if (handler_arguments_mode_ == PASS_ARGUMENTS) { |
+ params += 1; |
+ } |
+ return params; |
+ } |
+ |
private: |
ExternalReference miss_handler_; |
bool has_miss_handler_; |
}; |
-// A helper to make up for the fact that type Register is not fully |
-// defined outside of the platform directories |
-#define DESCRIPTOR_GET_PARAMETER_REGISTER(descriptor, index) \ |
- ((index) == (descriptor)->register_param_count_) \ |
- ? (descriptor)->stack_parameter_count_ \ |
- : (descriptor)->register_params_[(index)] |
- |
class HydrogenCodeStub : public CodeStub { |
public: |