Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index c3958e2396848bc87a603b639aab13b42529c6e6..b8bc132ab46a4dc13923caef2dd8b6e73dbe6459 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -3714,24 +3714,48 @@ class Script: public Struct { |
}; |
-enum MathFunctionId { |
- kNotSpecialMathFunction = 0, |
- // These numbers must be kept in sync with the ones in math.js. |
- kMathFloor = 1, |
- kMathRound = 2, |
- kMathCeil = 3, |
- kMathAbs = 4, |
- kMathLog = 5, |
- kMathSin = 6, |
- kMathCos = 7, |
- kMathTan = 8, |
- kMathASin = 9, |
- kMathACos = 0xa, |
- kMathATan = 0xb, |
- kMathExp = 0xc, |
- kMathSqrt = 0xd, |
- kMathPow = 0xe, |
- kMathPowHalf = 0xf |
+// List of builtin functions we want to identify to improve code |
+// generation. |
+// |
+// Each entry has a name of a global object property holding an object |
+// optionally followed by ".prototype", a name of a builtin function |
+// on the object (the one the id is set for), and a label. |
+// |
+// Installation of ids for the selected builtin functions is handled |
+// by the bootstrapper. |
+// |
+// NOTE: Order is important: math functions should be at the end of |
+// the list and MathFloor should be the first math function. |
+#define FUNCTIONS_WITH_ID_LIST(V) \ |
+ V(Array.prototype, push, ArrayPush) \ |
+ V(Array.prototype, pop, ArrayPop) \ |
+ V(String.prototype, charCodeAt, StringCharCodeAt) \ |
+ V(String.prototype, charAt, StringCharAt) \ |
+ V(String, fromCharCode, StringFromCharCode) \ |
+ V(Math, floor, MathFloor) \ |
+ V(Math, round, MathRound) \ |
+ V(Math, ceil, MathCeil) \ |
+ V(Math, abs, MathAbs) \ |
+ V(Math, log, MathLog) \ |
+ V(Math, sin, MathSin) \ |
+ V(Math, cos, MathCos) \ |
+ V(Math, tan, MathTan) \ |
+ V(Math, asin, MathASin) \ |
+ V(Math, acos, MathACos) \ |
+ V(Math, atan, MathATan) \ |
+ V(Math, exp, MathExp) \ |
+ V(Math, sqrt, MathSqrt) \ |
+ V(Math, pow, MathPow) |
+ |
+ |
+enum BuiltinFunctionId { |
+#define DECLARE_FUNCTION_ID(ignored1, ignore2, name) \ |
+ k##name, |
+ FUNCTIONS_WITH_ID_LIST(DECLARE_FUNCTION_ID) |
+#undef DECLARE_FUNCTION_ID |
+ // Fake id for a special case of Math.pow. Note, it continues the |
+ // list of math functions. |
+ kMathPowHalf |
}; |
@@ -3872,7 +3896,7 @@ class SharedFunctionInfo: public HeapObject { |
// [function data]: This field holds some additional data for function. |
// Currently it either has FunctionTemplateInfo to make benefit the API |
- // or Smi identifying a custom call generator. |
+ // or Smi identifying a builtin function. |
// In the long run we don't want all functions to have this field but |
// we can fix that when we have a better model for storing hidden data |
// on objects. |
@@ -3880,8 +3904,9 @@ class SharedFunctionInfo: public HeapObject { |
inline bool IsApiFunction(); |
inline FunctionTemplateInfo* get_api_func_data(); |
- inline bool HasCustomCallGenerator(); |
- inline int custom_call_generator_id(); |
+ inline bool HasBuiltinFunctionId(); |
+ inline bool IsBuiltinMathFunction(); |
+ inline BuiltinFunctionId builtin_function_id(); |
// [script info]: Script from which the function originates. |
DECL_ACCESSORS(script, Object) |
@@ -4132,12 +4157,6 @@ class SharedFunctionInfo: public HeapObject { |
static const int kAlignedSize = POINTER_SIZE_ALIGN(kSize); |
- // Get/set a special tag on the functions from math.js so we can inline |
- // efficient versions of them in the code. |
- inline MathFunctionId math_function_id(); |
- inline void set_math_function_id(int id); |
- static inline int max_math_id_number() { return kMathFunctionMask; } |
- |
typedef FixedBodyDescriptor<kNameOffset, |
kThisPropertyAssignmentsOffset + kPointerSize, |
kSize> BodyDescriptor; |
@@ -4155,12 +4174,10 @@ class SharedFunctionInfo: public HeapObject { |
static const int kHasOnlySimpleThisPropertyAssignments = 0; |
static const int kTryFullCodegen = 1; |
static const int kAllowLazyCompilation = 2; |
- static const int kMathFunctionShift = 3; |
- static const int kMathFunctionMask = 0x1f; |
- static const int kLiveObjectsMayExist = 8; |
- static const int kCodeAgeShift = 9; |
+ static const int kLiveObjectsMayExist = 3; |
+ static const int kCodeAgeShift = 4; |
static const int kCodeAgeMask = 0x7; |
- static const int kOptimizationDisabled = 12; |
+ static const int kOptimizationDisabled = 7; |
DISALLOW_IMPLICIT_CONSTRUCTORS(SharedFunctionInfo); |
}; |