| Index: src/ic.h
|
| diff --git a/src/ic.h b/src/ic.h
|
| index f6b4800294b5f57d3c3dbe430a73b7e1c06ba0b1..829c6b1547666c708e41f15c36a7dcc49f4211ee 100644
|
| --- a/src/ic.h
|
| +++ b/src/ic.h
|
| @@ -57,6 +57,7 @@ namespace internal {
|
| ICU(LoadPropertyWithInterceptorForCall) \
|
| ICU(KeyedLoadPropertyWithInterceptor) \
|
| ICU(StoreInterceptorProperty) \
|
| + ICU(UnaryOp_Patch) \
|
| ICU(BinaryOp_Patch) \
|
| ICU(CompareIC_Miss) \
|
| ICU(CompareNilIC_Miss) \
|
| @@ -680,9 +681,28 @@ class KeyedStoreIC: public StoreIC {
|
|
|
| class UnaryOpIC: public IC {
|
| public:
|
| - explicit UnaryOpIC(Isolate* isolate) : IC(EXTRA_CALL_FRAME, isolate) { }
|
| + // sorted: increasingly more unspecific (ignoring UNINITIALIZED)
|
| + // TODO(svenpanne) Using enums+switch is an antipattern, use a class instead.
|
| + enum TypeInfo {
|
| + UNINITIALIZED,
|
| + SMI,
|
| + NUMBER,
|
| + GENERIC
|
| + };
|
| +
|
| + static Handle<Type> TypeInfoToType(TypeInfo info, Isolate* isolate);
|
| +
|
| + explicit UnaryOpIC(Isolate* isolate) : IC(NO_EXTRA_FRAME, isolate) { }
|
| +
|
| + void patch(Code* code);
|
| +
|
| + static const char* GetName(TypeInfo type_info);
|
| +
|
| + static State ToState(TypeInfo type_info);
|
| +
|
| + static TypeInfo GetTypeInfo(Handle<Object> operand);
|
|
|
| - MUST_USE_RESULT MaybeObject* Transition(Handle<Object> object);
|
| + static TypeInfo ComputeNewType(TypeInfo type, TypeInfo previous);
|
| };
|
|
|
|
|
| @@ -818,7 +838,6 @@ void PatchInlinedSmiCode(Address address, InlinedSmiCheck check);
|
|
|
| DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadIC_MissFromStubFailure);
|
| DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedStoreIC_MissFromStubFailure);
|
| -DECLARE_RUNTIME_FUNCTION(MaybeObject*, UnaryOpIC_Miss);
|
| DECLARE_RUNTIME_FUNCTION(MaybeObject*, CompareNilIC_Miss);
|
| DECLARE_RUNTIME_FUNCTION(MaybeObject*, ToBooleanIC_Miss);
|
|
|
|
|