Reviewers: Yang,

Message:
Hey Yang,

This is trivial cleanup.
Please take a look.

Thanks,
Benedikt

Description:
[runtime] Simplify TO_INT32/TO_UINT32 abstract operations.

No need to provide TO_INT32/TO_UINT32 functions for every native
context, as they can be implemented in terms of TO_NUMBER more easily
and efficiently.

Also remove the obsolete TO_BOOLEAN_FUN_INDEX from the native contexts.

Please review this at https://codereview.chromium.org/1275013004/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+23, -66 lines):
  M include/v8.h
  M src/array.js
  M src/bootstrapper.cc
  M src/contexts.h
  M src/execution.cc
  M src/harmony-atomics.js
  M src/macros.py
  M src/runtime.js
  M src/runtime/runtime.h
  M src/runtime/runtime-numbers.cc
  M src/v8natives.js


Index: include/v8.h
diff --git a/include/v8.h b/include/v8.h
index 1b65770d35e3fe98bf6f374b3df5b6c46b817ba6..66d18f89bec1c31a877e174db1febd2c10f51efa 100644
--- a/include/v8.h
+++ b/include/v8.h
@@ -6918,7 +6918,7 @@ class Internals {
   static const int kJSObjectHeaderSize = 3 * kApiPointerSize;
   static const int kFixedArrayHeaderSize = 2 * kApiPointerSize;
   static const int kContextHeaderSize = 2 * kApiPointerSize;
-  static const int kContextEmbedderDataIndex = 86;
+  static const int kContextEmbedderDataIndex = 83;
   static const int kFullStringRepresentationMask = 0x07;
   static const int kStringEncodingMask = 0x4;
   static const int kExternalTwoByteRepresentationTag = 0x02;
Index: src/array.js
diff --git a/src/array.js b/src/array.js
index 7d0fdcafb3d3ef86a9a03c91baef02778553dbe0..cfaa324d18b506fb24ceff19e5f5239fda34c8d4 100644
--- a/src/array.js
+++ b/src/array.js
@@ -1232,7 +1232,7 @@ function ArrayFilter(f, receiver) {
   // Pull out the length so that modifications to the length in the
   // loop will not affect the looping and side effects are visible.
   var array = TO_OBJECT(this);
-  var length = $toUint32(array.length);
+  var length = TO_UINT32(array.length);
   var accumulator = InnerArrayFilter(f, receiver, array, length);
   var result = new GlobalArray();
   %MoveArrayContents(accumulator, result);
@@ -1543,7 +1543,7 @@ function ArrayReduce(callback, current) {
   // Pull out the length so that modifications to the length in the
   // loop will not affect the looping and side effects are visible.
   var array = TO_OBJECT(this);
-  var length = $toUint32(array.length);
+  var length = TO_UINT32(array.length);
   return InnerArrayReduce(callback, current, array, length,
                           %_ArgumentsLength());
 }
@@ -1586,7 +1586,7 @@ function ArrayReduceRight(callback, current) {
   // Pull out the length so that side effects are visible before the
   // callback function is checked.
   var array = TO_OBJECT(this);
-  var length = $toUint32(array.length);
+  var length = TO_UINT32(array.length);
   return InnerArrayReduceRight(callback, current, array, length,
                                %_ArgumentsLength());
 }
Index: src/bootstrapper.cc
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
index 0adbc8fd1a3847630c1a9c804b2cced3be3898b1..b364d223c925dce02ac6920ebc40a1229ce2e863 100644
--- a/src/bootstrapper.cc
+++ b/src/bootstrapper.cc
@@ -1717,8 +1717,6 @@ void Genesis::InstallNativeFunctions() {
   INSTALL_NATIVE(JSFunction, "$toString", to_string_fun);
   INSTALL_NATIVE(JSFunction, "$toDetailString", to_detail_string_fun);
   INSTALL_NATIVE(JSFunction, "$toInteger", to_integer_fun);
-  INSTALL_NATIVE(JSFunction, "$toUint32", to_uint32_fun);
-  INSTALL_NATIVE(JSFunction, "$toInt32", to_int32_fun);
   INSTALL_NATIVE(JSFunction, "$toLength", to_length_fun);

   INSTALL_NATIVE(JSFunction, "$globalEval", global_eval_fun);
Index: src/contexts.h
diff --git a/src/contexts.h b/src/contexts.h
index 0d7da9186859dd1fa1058926cb6601306f24d4b5..408641be967487153fcdc4f16fd8483e95315035 100644
--- a/src/contexts.h
+++ b/src/contexts.h
@@ -104,8 +104,6 @@ enum BindingFlags {
V(TO_STRING_FUN_INDEX, JSFunction, to_string_fun) \ V(TO_DETAIL_STRING_FUN_INDEX, JSFunction, to_detail_string_fun) \ V(TO_INTEGER_FUN_INDEX, JSFunction, to_integer_fun) \ - V(TO_UINT32_FUN_INDEX, JSFunction, to_uint32_fun) \ - V(TO_INT32_FUN_INDEX, JSFunction, to_int32_fun) \ V(TO_LENGTH_FUN_INDEX, JSFunction, to_length_fun) \ V(GLOBAL_EVAL_FUN_INDEX, JSFunction, global_eval_fun) \ V(ARRAY_BUFFER_FUN_INDEX, JSFunction, array_buffer_fun) \
@@ -374,9 +372,6 @@ class Context: public FixedArray {
     TO_STRING_FUN_INDEX,
     TO_DETAIL_STRING_FUN_INDEX,
     TO_INTEGER_FUN_INDEX,
-    TO_UINT32_FUN_INDEX,
-    TO_INT32_FUN_INDEX,
-    TO_BOOLEAN_FUN_INDEX,
     GLOBAL_EVAL_FUN_INDEX,
     ARRAY_BUFFER_FUN_INDEX,
     ARRAY_BUFFER_MAP_INDEX,
Index: src/execution.cc
diff --git a/src/execution.cc b/src/execution.cc
index 687c0f99f9d8be23d213c1b647000fc51c428f0a..52cff2f7900eabe3b554724f3525f449f850a6ad 100644
--- a/src/execution.cc
+++ b/src/execution.cc
@@ -554,18 +554,6 @@ MaybeHandle<Object> Execution::ToInteger(
 }


-MaybeHandle<Object> Execution::ToUint32(
-    Isolate* isolate, Handle<Object> obj) {
-  RETURN_NATIVE_CALL(to_uint32, { obj });
-}
-
-
-MaybeHandle<Object> Execution::ToInt32(
-    Isolate* isolate, Handle<Object> obj) {
-  RETURN_NATIVE_CALL(to_int32, { obj });
-}
-
-
 MaybeHandle<Object> Execution::ToLength(
     Isolate* isolate, Handle<Object> obj) {
   RETURN_NATIVE_CALL(to_length, { obj });
@@ -581,6 +569,13 @@ MaybeHandle<Object> Execution::NewDate(Isolate* isolate, double time) {
 #undef RETURN_NATIVE_CALL


+MaybeHandle<Object> Execution::ToInt32(Isolate* isolate, Handle<Object> obj) { + ASSIGN_RETURN_ON_EXCEPTION(isolate, obj, Execution::ToNumber(isolate, obj),
+                             Object);
+ return isolate->factory()->NewNumberFromInt(DoubleToInt32(obj->Number()));
+}
+
+
MaybeHandle<Object> Execution::ToObject(Isolate* isolate, Handle<Object> obj) {
   Handle<JSReceiver> receiver;
   if (JSReceiver::ToObject(isolate, obj).ToHandle(&receiver)) {
@@ -591,6 +586,13 @@ MaybeHandle<Object> Execution::ToObject(Isolate* isolate, Handle<Object> obj) {
 }


+MaybeHandle<Object> Execution::ToUint32(Isolate* isolate, Handle<Object> obj) { + ASSIGN_RETURN_ON_EXCEPTION(isolate, obj, Execution::ToNumber(isolate, obj),
+                             Object);
+ return isolate->factory()->NewNumberFromUint(DoubleToUint32(obj->Number()));
+}
+
+
 MaybeHandle<JSRegExp> Execution::NewJSRegExp(Handle<String> pattern,
                                              Handle<String> flags) {
   Isolate* isolate = pattern->GetIsolate();
Index: src/harmony-atomics.js
diff --git a/src/harmony-atomics.js b/src/harmony-atomics.js
index 3c7968b1a7dc3bd1ae941cdf0625c79d6aeebd2a..96cc2145df7a2926c5e41dcf890b70169746476a 100644
--- a/src/harmony-atomics.js
+++ b/src/harmony-atomics.js
@@ -172,7 +172,7 @@ function AtomicsFutexWakeOrRequeueJS(ia, index1, count, value, index2) {
   CheckSharedInteger32TypedArray(ia);
   index1 = $toInteger(index1);
   count = MathMax(0, $toInteger(count));
-  value = $toInt32(value);
+  value = TO_INT32(value);
   index2 = $toInteger(index2);
   if (index1 < 0 || index1 >= %_TypedArrayGetLength(ia) ||
       index2 < 0 || index2 >= %_TypedArrayGetLength(ia)) {
Index: src/macros.py
diff --git a/src/macros.py b/src/macros.py
index 97a1fa8f38b6334b04ac66b45897f36a5d8a1728..124b1e7fba9814f07d87ec83c57556bb8770998f 100644
--- a/src/macros.py
+++ b/src/macros.py
@@ -149,7 +149,7 @@ macro NUMBER_IS_FINITE(arg) = (%_IsSmi(%IS_VAR(arg)) || ((arg == arg) && (arg != macro TO_INTEGER(arg) = (%_IsSmi(%IS_VAR(arg)) ? arg : %NumberToInteger($toNumber(arg))); macro TO_INTEGER_FOR_SIDE_EFFECT(arg) = (%_IsSmi(%IS_VAR(arg)) ? arg : $toNumber(arg)); macro TO_INTEGER_MAP_MINUS_ZERO(arg) = (%_IsSmi(%IS_VAR(arg)) ? arg : %NumberToIntegerMapMinusZero($toNumber(arg)));
-macro TO_INT32(arg) = (%_IsSmi(%IS_VAR(arg)) ? arg : (arg >> 0));
+macro TO_INT32(arg) = (arg | 0);
 macro TO_UINT32(arg) = (arg >>> 0);
macro TO_STRING_INLINE(arg) = (IS_STRING(%IS_VAR(arg)) ? arg : $nonStringToString(arg)); macro TO_NUMBER_INLINE(arg) = (IS_NUMBER(%IS_VAR(arg)) ? arg : $nonNumberToNumber(arg));
Index: src/runtime.js
diff --git a/src/runtime.js b/src/runtime.js
index 5e37e26c3c9d7df7bcf802c01bfe0fbc04633c34..21b3da92353eb5cf1a05b5b6700d19dcca5712b7 100644
--- a/src/runtime.js
+++ b/src/runtime.js
@@ -70,7 +70,6 @@ var $nonStringToString;
 var $sameValue;
 var $sameValueZero;
 var $toBoolean;
-var $toInt32;
 var $toInteger;
 var $toLength;
 var $toName;
@@ -78,7 +77,6 @@ var $toNumber;
 var $toPositiveInteger;
 var $toPrimitive;
 var $toString;
-var $toUint32;

 (function(global, utils) {

@@ -610,7 +608,7 @@ APPLY_PREPARE = function APPLY_PREPARE(args) {
     }
   }

-  length = (args == null) ? 0 : %$toUint32(args.length);
+  length = (args == null) ? 0 : TO_UINT32(args.length);

   // We can handle any number of apply arguments if the stack is
   // big enough, but sanity check the value to avoid overflow when
@@ -838,20 +836,6 @@ function ToLength(arg) {
 }


-// ECMA-262, section 9.6, page 34.
-function ToUint32(x) {
-  if (%_IsSmi(x) && x >= 0) return x;
-  return %NumberToJSUint32(ToNumber(x));
-}
-
-
-// ECMA-262, section 9.5, page 34
-function ToInt32(x) {
-  if (%_IsSmi(x)) return x;
-  return %NumberToJSInt32(ToNumber(x));
-}
-
-
 // ES5, section 9.12
 function SameValue(x, y) {
   if (typeof x != typeof y) return false;
@@ -973,7 +957,6 @@ $nonStringToString = NonStringToString;
 $sameValue = SameValue;
 $sameValueZero = SameValueZero;
 $toBoolean = ToBoolean;
-$toInt32 = ToInt32;
 $toInteger = ToInteger;
 $toLength = ToLength;
 $toName = ToName;
@@ -981,6 +964,5 @@ $toNumber = ToNumber;
 $toPositiveInteger = ToPositiveInteger;
 $toPrimitive = ToPrimitive;
 $toString = ToString;
-$toUint32 = ToUint32;

 })
Index: src/runtime/runtime-numbers.cc
diff --git a/src/runtime/runtime-numbers.cc b/src/runtime/runtime-numbers.cc
index d9a0c9ffa6f724cbc6ee1a5f2bdaa55282801c8b..7e6712ad230614f648304c41bd63540d30ce2caa 100644
--- a/src/runtime/runtime-numbers.cc
+++ b/src/runtime/runtime-numbers.cc
@@ -271,24 +271,6 @@ RUNTIME_FUNCTION(Runtime_NumberToIntegerMapMinusZero) {
 }


-RUNTIME_FUNCTION(Runtime_NumberToJSUint32) {
-  HandleScope scope(isolate);
-  DCHECK(args.length() == 1);
-
-  CONVERT_NUMBER_CHECKED(int32_t, number, Uint32, args[0]);
-  return *isolate->factory()->NewNumberFromUint(number);
-}
-
-
-RUNTIME_FUNCTION(Runtime_NumberToJSInt32) {
-  HandleScope scope(isolate);
-  DCHECK(args.length() == 1);
-
-  CONVERT_DOUBLE_ARG_CHECKED(number, 0);
-  return *isolate->factory()->NewNumberFromInt(DoubleToInt32(number));
-}
-
-
// Converts a Number to a Smi, if possible. Returns NaN if the number is not
 // a small integer.
 RUNTIME_FUNCTION(Runtime_NumberToSmi) {
Index: src/runtime/runtime.h
diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h
index 28292a07e9698ef7ef87b57953942691fdbcf81a..c580c83e30a16da74ab02876a6e5c6ac6edfac85 100644
--- a/src/runtime/runtime.h
+++ b/src/runtime/runtime.h
@@ -404,8 +404,6 @@ namespace internal {
   F(NumberToStringSkipCache, 1, 1)     \
   F(NumberToInteger, 1, 1)             \
   F(NumberToIntegerMapMinusZero, 1, 1) \
-  F(NumberToJSUint32, 1, 1)            \
-  F(NumberToJSInt32, 1, 1)             \
   F(NumberToSmi, 1, 1)                 \
   F(NumberAdd, 2, 1)                   \
   F(NumberSub, 2, 1)                   \
Index: src/v8natives.js
diff --git a/src/v8natives.js b/src/v8natives.js
index 542d709663e6205f29a743400ecf7b04e4205ca7..29481d103eff888891e5d30ff20e8a0511c9e114 100644
--- a/src/v8natives.js
+++ b/src/v8natives.js
@@ -803,7 +803,7 @@ function DefineObjectProperty(obj, p, desc, should_throw) {
 function DefineArrayProperty(obj, p, desc, should_throw) {
   // Step 3 - Special handling for array index.
   if (!IS_SYMBOL(p)) {
-    var index = $toUint32(p);
+    var index = TO_UINT32(p);
     var emit_splice = false;
     if ($toString(index) == p && index != 4294967295) {
       var length = obj.length;
@@ -899,7 +899,7 @@ function ToNameArray(obj, trap, includeSymbols) {
   if (!IS_SPEC_OBJECT(obj)) {
     throw MakeTypeError(kProxyNonObjectPropNames, trap, obj);
   }
-  var n = $toUint32(obj.length);
+  var n = TO_UINT32(obj.length);
   var array = new GlobalArray(n);
   var realLength = 0;
   var names = { __proto__: null };  // TODO(rossberg): use sets once ready.


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to