Files
sdk/runtime/lib/mirrors.cc
T
turnidge@google.com ff26341fd6 Heartbeat implementation of dart:mirrors.
Add the skeleton for the dart:mirrors library in all the appropriate
places.  The only thing we can do right now is ask an Isolate for its
debugName.  Add a few tests.
Review URL: https://chromiumcodereview.appspot.com//9420038

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@5370 260f80e4-7a28-3924-810f-c04153c831b5
2012-03-12 23:51:03 +00:00

81 lines
2.4 KiB
C++

// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#include "vm/bootstrap_natives.h"
#include "vm/dart_entry.h"
#include "vm/exceptions.h"
#include "vm/message.h"
#include "vm/port.h"
namespace dart {
static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
void* new_ptr = realloc(reinterpret_cast<void*>(ptr), new_size);
return reinterpret_cast<uint8_t*>(new_ptr);
}
DEFINE_NATIVE_ENTRY(Mirrors_send, 3) {
GET_NATIVE_ARGUMENT(Instance, port, arguments->At(0));
GET_NATIVE_ARGUMENT(Instance, message, arguments->At(1));
GET_NATIVE_ARGUMENT(Instance, replyTo, arguments->At(2));
// Get the send port id.
Object& result = Object::Handle();
result = DartLibraryCalls::PortGetId(port);
if (result.IsError()) {
Exceptions::PropagateError(result);
}
Integer& value = Integer::Handle();
value ^= result.raw();
int64_t send_port_id = value.AsInt64Value();
// Get the reply port id.
result = DartLibraryCalls::PortGetId(replyTo);
if (result.IsError()) {
Exceptions::PropagateError(result);
}
value ^= result.raw();
int64_t reply_port_id = value.AsInt64Value();
// Construct the message.
uint8_t* data = NULL;
SnapshotWriter writer(Snapshot::kMessage, &data, &allocator);
writer.WriteObject(message.raw());
writer.FinalizeBuffer();
// Post the message.
bool retval = PortMap::PostMessage(new Message(
send_port_id, reply_port_id, data, Message::kOOBPriority));
const Bool& retval_obj = Bool::Handle(Bool::Get(retval));
arguments->SetReturn(retval_obj);
}
DEFINE_NATIVE_ENTRY(IsolateMirrorImpl_buildResponse, 1) {
GET_NATIVE_ARGUMENT(Instance, map, arguments->At(0));
String& key = String::Handle();
Instance& value = Instance::Handle();
Object& result = Object::Handle();
key = String::New("debugName");
value = String::New(isolate->name());
result = DartLibraryCalls::MapSetAt(map, key, value);
if (result.IsError()) {
// TODO(turnidge): Prevent mirror operations from crashing other isolates?
Exceptions::PropagateError(result);
}
key = String::New("ok");
value = Bool::True();
result = DartLibraryCalls::MapSetAt(map, key, value);
if (result.IsError()) {
Exceptions::PropagateError(result);
}
}
} // namespace dart