| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "include/dart_api.h" | 5 #include "include/dart_api.h" |
| 6 #include "include/dart_mirrors_api.h" | 6 #include "include/dart_mirrors_api.h" |
| 7 #include "include/dart_native_api.h" | 7 #include "include/dart_native_api.h" |
| 8 | 8 |
| 9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
| 10 #include "lib/stacktrace.h" | 10 #include "lib/stacktrace.h" |
| (...skipping 2134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2145 return Api::NewHandle(T, Integer::New(str_obj)); | 2145 return Api::NewHandle(T, Integer::New(str_obj)); |
| 2146 } | 2146 } |
| 2147 | 2147 |
| 2148 | 2148 |
| 2149 DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer, | 2149 DART_EXPORT Dart_Handle Dart_IntegerToInt64(Dart_Handle integer, |
| 2150 int64_t* value) { | 2150 int64_t* value) { |
| 2151 // Fast path for Smis. | 2151 // Fast path for Smis. |
| 2152 Thread* thread = Thread::Current(); | 2152 Thread* thread = Thread::Current(); |
| 2153 Isolate* isolate = thread->isolate(); | 2153 Isolate* isolate = thread->isolate(); |
| 2154 CHECK_ISOLATE(isolate); | 2154 CHECK_ISOLATE(isolate); |
| 2155 API_TIMELINE_DURATION; | |
| 2156 if (Api::IsSmi(integer)) { | 2155 if (Api::IsSmi(integer)) { |
| 2157 *value = Api::SmiValue(integer); | 2156 *value = Api::SmiValue(integer); |
| 2158 return Api::Success(); | 2157 return Api::Success(); |
| 2159 } | 2158 } |
| 2160 // Slow path for Mints and Bigints. | 2159 // Slow path for Mints and Bigints. |
| 2161 DARTSCOPE(thread); | 2160 DARTSCOPE(thread); |
| 2162 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); | 2161 const Integer& int_obj = Api::UnwrapIntegerHandle(Z, integer); |
| 2163 if (int_obj.IsNull()) { | 2162 if (int_obj.IsNull()) { |
| 2164 RETURN_TYPE_ERROR(Z, integer, Integer); | 2163 RETURN_TYPE_ERROR(Z, integer, Integer); |
| 2165 } | 2164 } |
| 2166 ASSERT(!int_obj.IsSmi()); | 2165 ASSERT(!int_obj.IsSmi()); |
| 2167 if (int_obj.IsMint()) { | 2166 if (int_obj.IsMint()) { |
| 2168 *value = int_obj.AsInt64Value(); | 2167 *value = int_obj.AsInt64Value(); |
| 2169 return Api::Success(); | 2168 return Api::Success(); |
| 2170 } else { | 2169 } else { |
| 2171 const Bigint& bigint = Bigint::Cast(int_obj); | 2170 const Bigint& bigint = Bigint::Cast(int_obj); |
| 2172 if (bigint.FitsIntoInt64()) { | 2171 if (bigint.FitsIntoInt64()) { |
| 2173 *value = bigint.AsInt64Value(); | 2172 *value = bigint.AsInt64Value(); |
| 2174 return Api::Success(); | 2173 return Api::Success(); |
| 2175 } | 2174 } |
| 2176 } | 2175 } |
| 2177 return Api::NewError("%s: Integer %s cannot be represented as an int64_t.", | 2176 return Api::NewError("%s: Integer %s cannot be represented as an int64_t.", |
| 2178 CURRENT_FUNC, int_obj.ToCString()); | 2177 CURRENT_FUNC, int_obj.ToCString()); |
| 2179 } | 2178 } |
| 2180 | 2179 |
| 2181 | 2180 |
| 2182 DART_EXPORT Dart_Handle Dart_IntegerToUint64(Dart_Handle integer, | 2181 DART_EXPORT Dart_Handle Dart_IntegerToUint64(Dart_Handle integer, |
| 2183 uint64_t* value) { | 2182 uint64_t* value) { |
| 2184 API_TIMELINE_DURATION; | |
| 2185 // Fast path for Smis. | 2183 // Fast path for Smis. |
| 2186 Thread* thread = Thread::Current(); | 2184 Thread* thread = Thread::Current(); |
| 2187 Isolate* isolate = thread->isolate(); | 2185 Isolate* isolate = thread->isolate(); |
| 2188 CHECK_ISOLATE(isolate); | 2186 CHECK_ISOLATE(isolate); |
| 2189 if (Api::IsSmi(integer)) { | 2187 if (Api::IsSmi(integer)) { |
| 2190 intptr_t smi_value = Api::SmiValue(integer); | 2188 intptr_t smi_value = Api::SmiValue(integer); |
| 2191 if (smi_value >= 0) { | 2189 if (smi_value >= 0) { |
| 2192 *value = smi_value; | 2190 *value = smi_value; |
| 2193 return Api::Success(); | 2191 return Api::Success(); |
| 2194 } | 2192 } |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2234 Bigint::NewFromInt64(int_obj.AsInt64Value())); | 2232 Bigint::NewFromInt64(int_obj.AsInt64Value())); |
| 2235 *value = bigint.ToHexCString(BigintAllocate); | 2233 *value = bigint.ToHexCString(BigintAllocate); |
| 2236 } else { | 2234 } else { |
| 2237 *value = Bigint::Cast(int_obj).ToHexCString(BigintAllocate); | 2235 *value = Bigint::Cast(int_obj).ToHexCString(BigintAllocate); |
| 2238 } | 2236 } |
| 2239 return Api::Success(); | 2237 return Api::Success(); |
| 2240 } | 2238 } |
| 2241 | 2239 |
| 2242 | 2240 |
| 2243 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { | 2241 DART_EXPORT Dart_Handle Dart_NewDouble(double value) { |
| 2244 API_TIMELINE_DURATION; | |
| 2245 DARTSCOPE(Thread::Current()); | 2242 DARTSCOPE(Thread::Current()); |
| 2246 CHECK_CALLBACK_STATE(T); | 2243 CHECK_CALLBACK_STATE(T); |
| 2247 return Api::NewHandle(T, Double::New(value)); | 2244 return Api::NewHandle(T, Double::New(value)); |
| 2248 } | 2245 } |
| 2249 | 2246 |
| 2250 | 2247 |
| 2251 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj, | 2248 DART_EXPORT Dart_Handle Dart_DoubleValue(Dart_Handle double_obj, |
| 2252 double* value) { | 2249 double* value) { |
| 2253 API_TIMELINE_DURATION; | |
| 2254 DARTSCOPE(Thread::Current()); | 2250 DARTSCOPE(Thread::Current()); |
| 2255 const Double& obj = Api::UnwrapDoubleHandle(Z, double_obj); | 2251 const Double& obj = Api::UnwrapDoubleHandle(Z, double_obj); |
| 2256 if (obj.IsNull()) { | 2252 if (obj.IsNull()) { |
| 2257 RETURN_TYPE_ERROR(Z, double_obj, Double); | 2253 RETURN_TYPE_ERROR(Z, double_obj, Double); |
| 2258 } | 2254 } |
| 2259 *value = obj.value(); | 2255 *value = obj.value(); |
| 2260 return Api::Success(); | 2256 return Api::Success(); |
| 2261 } | 2257 } |
| 2262 | 2258 |
| 2263 | 2259 |
| (...skipping 2552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4816 return Api::NewError("%s: invalid argument type %d.", | 4812 return Api::NewError("%s: invalid argument type %d.", |
| 4817 CURRENT_FUNC, arg_type); | 4813 CURRENT_FUNC, arg_type); |
| 4818 } | 4814 } |
| 4819 } | 4815 } |
| 4820 return Api::Success(); | 4816 return Api::Success(); |
| 4821 } | 4817 } |
| 4822 | 4818 |
| 4823 | 4819 |
| 4824 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, | 4820 DART_EXPORT Dart_Handle Dart_GetNativeArgument(Dart_NativeArguments args, |
| 4825 int index) { | 4821 int index) { |
| 4826 API_TIMELINE_DURATION; | |
| 4827 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4822 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4828 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4823 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4829 return Api::NewError( | 4824 return Api::NewError( |
| 4830 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4825 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4831 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4826 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4832 } | 4827 } |
| 4833 return Api::NewHandle(arguments->thread(), | 4828 return Api::NewHandle(arguments->thread(), |
| 4834 arguments->NativeArgAt(index)); | 4829 arguments->NativeArgAt(index)); |
| 4835 } | 4830 } |
| 4836 | 4831 |
| 4837 | 4832 |
| 4838 DART_EXPORT int Dart_GetNativeArgumentCount(Dart_NativeArguments args) { | 4833 DART_EXPORT int Dart_GetNativeArgumentCount(Dart_NativeArguments args) { |
| 4839 API_TIMELINE_DURATION; | |
| 4840 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4834 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4841 return arguments->NativeArgCount(); | 4835 return arguments->NativeArgCount(); |
| 4842 } | 4836 } |
| 4843 | 4837 |
| 4844 | 4838 |
| 4845 DART_EXPORT Dart_Handle Dart_GetNativeFieldsOfArgument( | 4839 DART_EXPORT Dart_Handle Dart_GetNativeFieldsOfArgument( |
| 4846 Dart_NativeArguments args, | 4840 Dart_NativeArguments args, |
| 4847 int arg_index, | 4841 int arg_index, |
| 4848 int num_fields, | 4842 int num_fields, |
| 4849 intptr_t* field_values) { | 4843 intptr_t* field_values) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4888 return Api::NewError("%s expects argument at %d to be of" | 4882 return Api::NewError("%s expects argument at %d to be of" |
| 4889 " type String.", CURRENT_FUNC, arg_index); | 4883 " type String.", CURRENT_FUNC, arg_index); |
| 4890 } | 4884 } |
| 4891 return result; | 4885 return result; |
| 4892 } | 4886 } |
| 4893 | 4887 |
| 4894 | 4888 |
| 4895 DART_EXPORT Dart_Handle Dart_GetNativeIntegerArgument(Dart_NativeArguments args, | 4889 DART_EXPORT Dart_Handle Dart_GetNativeIntegerArgument(Dart_NativeArguments args, |
| 4896 int index, | 4890 int index, |
| 4897 int64_t* value) { | 4891 int64_t* value) { |
| 4898 API_TIMELINE_DURATION; | |
| 4899 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4892 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4900 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4893 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4901 return Api::NewError( | 4894 return Api::NewError( |
| 4902 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4895 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4903 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4896 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4904 } | 4897 } |
| 4905 if (!GetNativeIntegerArgument(arguments, index, value)) { | 4898 if (!GetNativeIntegerArgument(arguments, index, value)) { |
| 4906 return Api::NewError("%s: expects argument at %d to be of" | 4899 return Api::NewError("%s: expects argument at %d to be of" |
| 4907 " type Integer.", CURRENT_FUNC, index); | 4900 " type Integer.", CURRENT_FUNC, index); |
| 4908 } | 4901 } |
| 4909 return Api::Success(); | 4902 return Api::Success(); |
| 4910 } | 4903 } |
| 4911 | 4904 |
| 4912 | 4905 |
| 4913 DART_EXPORT Dart_Handle Dart_GetNativeBooleanArgument(Dart_NativeArguments args, | 4906 DART_EXPORT Dart_Handle Dart_GetNativeBooleanArgument(Dart_NativeArguments args, |
| 4914 int index, | 4907 int index, |
| 4915 bool* value) { | 4908 bool* value) { |
| 4916 API_TIMELINE_DURATION; | |
| 4917 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4909 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4918 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4910 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4919 return Api::NewError( | 4911 return Api::NewError( |
| 4920 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4912 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4921 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4913 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4922 } | 4914 } |
| 4923 if (!Api::GetNativeBooleanArgument(arguments, index, value)) { | 4915 if (!Api::GetNativeBooleanArgument(arguments, index, value)) { |
| 4924 return Api::NewError("%s: expects argument at %d to be of type Boolean.", | 4916 return Api::NewError("%s: expects argument at %d to be of type Boolean.", |
| 4925 CURRENT_FUNC, index); | 4917 CURRENT_FUNC, index); |
| 4926 } | 4918 } |
| 4927 return Api::Success(); | 4919 return Api::Success(); |
| 4928 } | 4920 } |
| 4929 | 4921 |
| 4930 | 4922 |
| 4931 DART_EXPORT Dart_Handle Dart_GetNativeDoubleArgument(Dart_NativeArguments args, | 4923 DART_EXPORT Dart_Handle Dart_GetNativeDoubleArgument(Dart_NativeArguments args, |
| 4932 int index, | 4924 int index, |
| 4933 double* value) { | 4925 double* value) { |
| 4934 API_TIMELINE_DURATION; | |
| 4935 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 4926 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 4936 if ((index < 0) || (index >= arguments->NativeArgCount())) { | 4927 if ((index < 0) || (index >= arguments->NativeArgCount())) { |
| 4937 return Api::NewError( | 4928 return Api::NewError( |
| 4938 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", | 4929 "%s: argument 'index' out of range. Expected 0..%d but saw %d.", |
| 4939 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); | 4930 CURRENT_FUNC, arguments->NativeArgCount() - 1, index); |
| 4940 } | 4931 } |
| 4941 if (!GetNativeDoubleArgument(arguments, index, value)) { | 4932 if (!GetNativeDoubleArgument(arguments, index, value)) { |
| 4942 return Api::NewError("%s: expects argument at %d to be of" | 4933 return Api::NewError("%s: expects argument at %d to be of" |
| 4943 " type Double.", CURRENT_FUNC, index); | 4934 " type Double.", CURRENT_FUNC, index); |
| 4944 } | 4935 } |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5049 Isolate* isolate = Isolate::Current(); | 5040 Isolate* isolate = Isolate::Current(); |
| 5050 CHECK_ISOLATE(isolate); | 5041 CHECK_ISOLATE(isolate); |
| 5051 isolate->set_environment_callback(callback); | 5042 isolate->set_environment_callback(callback); |
| 5052 return Api::Success(); | 5043 return Api::Success(); |
| 5053 } | 5044 } |
| 5054 | 5045 |
| 5055 | 5046 |
| 5056 // --- Scripts and Libraries --- | 5047 // --- Scripts and Libraries --- |
| 5057 DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args, | 5048 DART_EXPORT void Dart_SetBooleanReturnValue(Dart_NativeArguments args, |
| 5058 bool retval) { | 5049 bool retval) { |
| 5059 API_TIMELINE_DURATION; | |
| 5060 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 5050 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 5061 arguments->SetReturn(Bool::Get(retval)); | 5051 arguments->SetReturn(Bool::Get(retval)); |
| 5062 } | 5052 } |
| 5063 | 5053 |
| 5064 | 5054 |
| 5065 DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args, | 5055 DART_EXPORT void Dart_SetIntegerReturnValue(Dart_NativeArguments args, |
| 5066 int64_t retval) { | 5056 int64_t retval) { |
| 5067 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); | 5057 NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args); |
| 5068 ASSERT(arguments->thread()->isolate() == Isolate::Current()); | 5058 ASSERT(arguments->thread()->isolate() == Isolate::Current()); |
| 5069 if (Smi::IsValid(retval)) { | 5059 if (Smi::IsValid(retval)) { |
| (...skipping 1059 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6129 return Api::Success(); | 6119 return Api::Success(); |
| 6130 } | 6120 } |
| 6131 #endif // DART_PRECOMPILER | 6121 #endif // DART_PRECOMPILER |
| 6132 | 6122 |
| 6133 | 6123 |
| 6134 DART_EXPORT bool Dart_IsRunningPrecompiledCode() { | 6124 DART_EXPORT bool Dart_IsRunningPrecompiledCode() { |
| 6135 return Dart::IsRunningPrecompiledCode(); | 6125 return Dart::IsRunningPrecompiledCode(); |
| 6136 } | 6126 } |
| 6137 | 6127 |
| 6138 } // namespace dart | 6128 } // namespace dart |
| OLD | NEW |