Chromium Code Reviews| Index: runtime/vm/dart_api_impl.cc |
| diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc |
| index 070d646c975b60b8603d4836301f084ec22aca7d..3fd21df97db5f576021cb6e5c7e6954baffaa6f6 100644 |
| --- a/runtime/vm/dart_api_impl.cc |
| +++ b/runtime/vm/dart_api_impl.cc |
| @@ -599,6 +599,50 @@ DART_EXPORT bool Dart_IdentityEquals(Dart_Handle obj1, Dart_Handle obj2) { |
| } |
| +DART_EXPORT uint64_t Dart_IdentityHash(Dart_Handle obj) { |
| + Isolate* isolate = Isolate::Current(); |
| + DARTSCOPE(isolate); |
| + |
| + const Object& object = Object::Handle(isolate, Api::UnwrapHandle(obj)); |
| + if (!object.IsInstance() && !object.IsNull()) { |
| + return 0; |
| + } |
|
siva
2014/05/02 17:29:59
Maybe use the pattern:
const Instance& obj = Api
|
| + |
| + const Library& libcore = Library::Handle(isolate, Library::CoreLibrary()); |
| + const String& function_name = String::Handle(isolate, |
| + String::New("identityHashCode")); |
| + const Function& function = |
| + Function::Handle(isolate, |
| + libcore.LookupFunctionAllowPrivate(function_name)); |
| + if (function.IsNull()) { |
| + UNREACHABLE(); |
| + return 0; |
| + } |
| + |
| + const Array& arguments = Array::Handle(isolate, Array::New(1)); |
| + arguments.SetAt(0, object); |
| + const Object& result = |
| + Object::Handle(isolate, DartEntry::InvokeFunction(function, arguments)); |
| + |
| + if (result.IsSmi()) { |
| + return Smi::Cast(result).Value(); |
| + } |
| + if (result.IsMint()) { |
| + const Mint& mint = Mint::Cast(result); |
| + if (!mint.IsNegative()) { |
| + return mint.AsInt64Value(); |
| + } |
| + } |
| + if (result.IsBigint()) { |
| + const Bigint& bigint = Bigint::Cast(result); |
| + if (BigintOperations::FitsIntoUint64(bigint)) { |
| + return BigintOperations::ToUint64(bigint); |
| + } |
| + } |
|
siva
2014/05/02 17:29:59
We have a similar pattern in Dart_NativeIntegerArg
rmacnak
2014/05/02 21:19:13
Given the lack of failure cases here I don't think
|
| + return 0; |
| +} |
| + |
| + |
| DART_EXPORT Dart_Handle Dart_HandleFromPersistent( |
| Dart_PersistentHandle object) { |
| Isolate* isolate = Isolate::Current(); |