1 // Copyright 2014 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/arguments.h" 6 #include "src/isolate-inl.h" 7 #include "src/runtime/runtime-utils.h" 8 9 namespace v8 { 10 namespace internal { 11 12 RUNTIME_FUNCTION(Runtime_Multiply) { 13 HandleScope scope(isolate); 14 DCHECK_EQ(2, args.length()); 15 CONVERT_ARG_HANDLE_CHECKED(Object, lhs, 0); 16 CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1); 17 RETURN_RESULT_OR_FAILURE(isolate, Object::Multiply(isolate, lhs, rhs)); 18 } 19 20 21 RUNTIME_FUNCTION(Runtime_Divide) { 22 HandleScope scope(isolate); 23 DCHECK_EQ(2, args.length()); 24 CONVERT_ARG_HANDLE_CHECKED(Object, lhs, 0); 25 CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1); 26 RETURN_RESULT_OR_FAILURE(isolate, Object::Divide(isolate, lhs, rhs)); 27 } 28 29 30 RUNTIME_FUNCTION(Runtime_Modulus) { 31 HandleScope scope(isolate); 32 DCHECK_EQ(2, args.length()); 33 CONVERT_ARG_HANDLE_CHECKED(Object, lhs, 0); 34 CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1); 35 RETURN_RESULT_OR_FAILURE(isolate, Object::Modulus(isolate, lhs, rhs)); 36 } 37 38 39 RUNTIME_FUNCTION(Runtime_Add) { 40 HandleScope scope(isolate); 41 DCHECK_EQ(2, args.length()); 42 CONVERT_ARG_HANDLE_CHECKED(Object, lhs, 0); 43 CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1); 44 RETURN_RESULT_OR_FAILURE(isolate, Object::Add(isolate, lhs, rhs)); 45 } 46 47 48 RUNTIME_FUNCTION(Runtime_Subtract) { 49 HandleScope scope(isolate); 50 DCHECK_EQ(2, args.length()); 51 CONVERT_ARG_HANDLE_CHECKED(Object, lhs, 0); 52 CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1); 53 RETURN_RESULT_OR_FAILURE(isolate, Object::Subtract(isolate, lhs, rhs)); 54 } 55 56 57 RUNTIME_FUNCTION(Runtime_ShiftLeft) { 58 HandleScope scope(isolate); 59 DCHECK_EQ(2, args.length()); 60 CONVERT_ARG_HANDLE_CHECKED(Object, lhs, 0); 61 CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1); 62 RETURN_RESULT_OR_FAILURE(isolate, Object::ShiftLeft(isolate, lhs, rhs)); 63 } 64 65 66 RUNTIME_FUNCTION(Runtime_ShiftRight) { 67 HandleScope scope(isolate); 68 DCHECK_EQ(2, args.length()); 69 CONVERT_ARG_HANDLE_CHECKED(Object, lhs, 0); 70 CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1); 71 RETURN_RESULT_OR_FAILURE(isolate, Object::ShiftRight(isolate, lhs, rhs)); 72 } 73 74 75 RUNTIME_FUNCTION(Runtime_ShiftRightLogical) { 76 HandleScope scope(isolate); 77 DCHECK_EQ(2, args.length()); 78 CONVERT_ARG_HANDLE_CHECKED(Object, lhs, 0); 79 CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1); 80 RETURN_RESULT_OR_FAILURE(isolate, 81 Object::ShiftRightLogical(isolate, lhs, rhs)); 82 } 83 84 85 RUNTIME_FUNCTION(Runtime_BitwiseAnd) { 86 HandleScope scope(isolate); 87 DCHECK_EQ(2, args.length()); 88 CONVERT_ARG_HANDLE_CHECKED(Object, lhs, 0); 89 CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1); 90 RETURN_RESULT_OR_FAILURE(isolate, Object::BitwiseAnd(isolate, lhs, rhs)); 91 } 92 93 94 RUNTIME_FUNCTION(Runtime_BitwiseOr) { 95 HandleScope scope(isolate); 96 DCHECK_EQ(2, args.length()); 97 CONVERT_ARG_HANDLE_CHECKED(Object, lhs, 0); 98 CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1); 99 RETURN_RESULT_OR_FAILURE(isolate, Object::BitwiseOr(isolate, lhs, rhs)); 100 } 101 102 103 RUNTIME_FUNCTION(Runtime_BitwiseXor) { 104 HandleScope scope(isolate); 105 DCHECK_EQ(2, args.length()); 106 CONVERT_ARG_HANDLE_CHECKED(Object, lhs, 0); 107 CONVERT_ARG_HANDLE_CHECKED(Object, rhs, 1); 108 RETURN_RESULT_OR_FAILURE(isolate, Object::BitwiseXor(isolate, lhs, rhs)); 109 } 110 111 RUNTIME_FUNCTION(Runtime_Equal) { 112 HandleScope scope(isolate); 113 DCHECK_EQ(2, args.length()); 114 CONVERT_ARG_HANDLE_CHECKED(Object, x, 0); 115 CONVERT_ARG_HANDLE_CHECKED(Object, y, 1); 116 Maybe<bool> result = Object::Equals(x, y); 117 if (!result.IsJust()) return isolate->heap()->exception(); 118 return isolate->heap()->ToBoolean(result.FromJust()); 119 } 120 121 RUNTIME_FUNCTION(Runtime_NotEqual) { 122 HandleScope scope(isolate); 123 DCHECK_EQ(2, args.length()); 124 CONVERT_ARG_HANDLE_CHECKED(Object, x, 0); 125 CONVERT_ARG_HANDLE_CHECKED(Object, y, 1); 126 Maybe<bool> result = Object::Equals(x, y); 127 if (!result.IsJust()) return isolate->heap()->exception(); 128 return isolate->heap()->ToBoolean(!result.FromJust()); 129 } 130 131 RUNTIME_FUNCTION(Runtime_StrictEqual) { 132 SealHandleScope scope(isolate); 133 DCHECK_EQ(2, args.length()); 134 CONVERT_ARG_CHECKED(Object, x, 0); 135 CONVERT_ARG_CHECKED(Object, y, 1); 136 return isolate->heap()->ToBoolean(x->StrictEquals(y)); 137 } 138 139 RUNTIME_FUNCTION(Runtime_StrictNotEqual) { 140 SealHandleScope scope(isolate); 141 DCHECK_EQ(2, args.length()); 142 CONVERT_ARG_CHECKED(Object, x, 0); 143 CONVERT_ARG_CHECKED(Object, y, 1); 144 return isolate->heap()->ToBoolean(!x->StrictEquals(y)); 145 } 146 147 RUNTIME_FUNCTION(Runtime_LessThan) { 148 HandleScope scope(isolate); 149 DCHECK_EQ(2, args.length()); 150 CONVERT_ARG_HANDLE_CHECKED(Object, x, 0); 151 CONVERT_ARG_HANDLE_CHECKED(Object, y, 1); 152 Maybe<bool> result = Object::LessThan(x, y); 153 if (!result.IsJust()) return isolate->heap()->exception(); 154 return isolate->heap()->ToBoolean(result.FromJust()); 155 } 156 157 RUNTIME_FUNCTION(Runtime_GreaterThan) { 158 HandleScope scope(isolate); 159 DCHECK_EQ(2, args.length()); 160 CONVERT_ARG_HANDLE_CHECKED(Object, x, 0); 161 CONVERT_ARG_HANDLE_CHECKED(Object, y, 1); 162 Maybe<bool> result = Object::GreaterThan(x, y); 163 if (!result.IsJust()) return isolate->heap()->exception(); 164 return isolate->heap()->ToBoolean(result.FromJust()); 165 } 166 167 RUNTIME_FUNCTION(Runtime_LessThanOrEqual) { 168 HandleScope scope(isolate); 169 DCHECK_EQ(2, args.length()); 170 CONVERT_ARG_HANDLE_CHECKED(Object, x, 0); 171 CONVERT_ARG_HANDLE_CHECKED(Object, y, 1); 172 Maybe<bool> result = Object::LessThanOrEqual(x, y); 173 if (!result.IsJust()) return isolate->heap()->exception(); 174 return isolate->heap()->ToBoolean(result.FromJust()); 175 } 176 177 RUNTIME_FUNCTION(Runtime_GreaterThanOrEqual) { 178 HandleScope scope(isolate); 179 DCHECK_EQ(2, args.length()); 180 CONVERT_ARG_HANDLE_CHECKED(Object, x, 0); 181 CONVERT_ARG_HANDLE_CHECKED(Object, y, 1); 182 Maybe<bool> result = Object::GreaterThanOrEqual(x, y); 183 if (!result.IsJust()) return isolate->heap()->exception(); 184 return isolate->heap()->ToBoolean(result.FromJust()); 185 } 186 187 RUNTIME_FUNCTION(Runtime_InstanceOf) { 188 HandleScope shs(isolate); 189 DCHECK_EQ(2, args.length()); 190 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); 191 CONVERT_ARG_HANDLE_CHECKED(Object, callable, 1); 192 RETURN_RESULT_OR_FAILURE(isolate, 193 Object::InstanceOf(isolate, object, callable)); 194 } 195 196 } // namespace internal 197 } // namespace v8 198