clang-format runtime/lib
R=johnmccutchan@google.com Review URL: https://codereview.chromium.org/2468093007 .
This commit is contained in:
+4
-10
@@ -54,20 +54,14 @@ DEFINE_NATIVE_ENTRY(List_slice, 4) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Bool, needs_type_arg, arguments->NativeArgAt(3));
|
||||
intptr_t istart = start.Value();
|
||||
if ((istart < 0) || (istart > src.Length())) {
|
||||
Exceptions::ThrowRangeError(
|
||||
"start",
|
||||
start,
|
||||
0,
|
||||
src.Length());
|
||||
Exceptions::ThrowRangeError("start", start, 0, src.Length());
|
||||
}
|
||||
intptr_t icount = count.Value();
|
||||
// Zero count should be handled outside already.
|
||||
if ((icount <= 0) || (icount > src.Length())) {
|
||||
Exceptions::ThrowRangeError(
|
||||
"count",
|
||||
count,
|
||||
0, // This is the limit the user sees.
|
||||
src.Length() - istart);
|
||||
Exceptions::ThrowRangeError("count", count,
|
||||
0, // This is the limit the user sees.
|
||||
src.Length() - istart);
|
||||
}
|
||||
|
||||
return src.Slice(istart, icount, needs_type_arg.value());
|
||||
|
||||
+4
-4
@@ -15,8 +15,8 @@ namespace dart {
|
||||
static int64_t kMaxAllowedSeconds = kMaxInt32;
|
||||
|
||||
DEFINE_NATIVE_ENTRY(DateTime_timeZoneName, 1) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
Integer, dart_seconds, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Integer, dart_seconds,
|
||||
arguments->NativeArgAt(0));
|
||||
int64_t seconds = dart_seconds.AsInt64Value();
|
||||
if (llabs(seconds) > kMaxAllowedSeconds) {
|
||||
Exceptions::ThrowArgumentError(dart_seconds);
|
||||
@@ -27,8 +27,8 @@ DEFINE_NATIVE_ENTRY(DateTime_timeZoneName, 1) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(DateTime_timeZoneOffsetInSeconds, 1) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
Integer, dart_seconds, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Integer, dart_seconds,
|
||||
arguments->NativeArgAt(0));
|
||||
int64_t seconds = dart_seconds.AsInt64Value();
|
||||
if (llabs(seconds) > kMaxAllowedSeconds) {
|
||||
Exceptions::ThrowArgumentError(dart_seconds);
|
||||
|
||||
@@ -59,15 +59,9 @@ DEFINE_NATIVE_ENTRY(Developer_log, 8) {
|
||||
GET_NATIVE_ARGUMENT(Instance, dart_zone, arguments->NativeArgAt(5));
|
||||
GET_NATIVE_ARGUMENT(Instance, error, arguments->NativeArgAt(6));
|
||||
GET_NATIVE_ARGUMENT(Instance, stack_trace, arguments->NativeArgAt(7));
|
||||
Service::SendLogEvent(isolate,
|
||||
sequence.AsInt64Value(),
|
||||
timestamp.AsInt64Value(),
|
||||
level.Value(),
|
||||
name,
|
||||
message,
|
||||
dart_zone,
|
||||
error,
|
||||
stack_trace);
|
||||
Service::SendLogEvent(isolate, sequence.AsInt64Value(),
|
||||
timestamp.AsInt64Value(), level.Value(), name, message,
|
||||
dart_zone, error, stack_trace);
|
||||
return Object::null();
|
||||
#endif // PRODUCT
|
||||
}
|
||||
@@ -141,8 +135,8 @@ DEFINE_NATIVE_ENTRY(Developer_getServiceMinorVersion, 0) {
|
||||
|
||||
static void SendNull(const SendPort& port) {
|
||||
const Dart_Port destination_port_id = port.Id();
|
||||
PortMap::PostMessage(new Message(
|
||||
destination_port_id, Object::null(), Message::kNormalPriority));
|
||||
PortMap::PostMessage(new Message(destination_port_id, Object::null(),
|
||||
Message::kNormalPriority));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -144,8 +144,8 @@ DEFINE_NATIVE_ENTRY(Double_greaterThan, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Double, right, arguments->NativeArgAt(1));
|
||||
bool result = right.IsNull() ? false : (left.value() > right.value());
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Double_greaterThan %s > %s\n",
|
||||
left.ToCString(), right.ToCString());
|
||||
OS::Print("Double_greaterThan %s > %s\n", left.ToCString(),
|
||||
right.ToCString());
|
||||
}
|
||||
return Bool::Get(result).raw();
|
||||
}
|
||||
@@ -163,8 +163,7 @@ DEFINE_NATIVE_ENTRY(Double_equal, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Double, right, arguments->NativeArgAt(1));
|
||||
bool result = right.IsNull() ? false : (left.value() == right.value());
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Double_equal %s == %s\n",
|
||||
left.ToCString(), right.ToCString());
|
||||
OS::Print("Double_equal %s == %s\n", left.ToCString(), right.ToCString());
|
||||
}
|
||||
return Bool::Get(result).raw();
|
||||
}
|
||||
@@ -245,8 +244,8 @@ DEFINE_NATIVE_ENTRY(Double_toStringAsFixed, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, fraction_digits, arguments->NativeArgAt(1));
|
||||
double d = arg.value();
|
||||
intptr_t fraction_digits_value = fraction_digits.Value();
|
||||
if (0 <= fraction_digits_value && fraction_digits_value <= 20
|
||||
&& kLowerBoundary < d && d < kUpperBoundary) {
|
||||
if (0 <= fraction_digits_value && fraction_digits_value <= 20 &&
|
||||
kLowerBoundary < d && d < kUpperBoundary) {
|
||||
return DoubleToStringAsFixed(d, static_cast<int>(fraction_digits_value));
|
||||
} else {
|
||||
Exceptions::ThrowArgumentError(String::Handle(
|
||||
@@ -262,8 +261,8 @@ DEFINE_NATIVE_ENTRY(Double_toStringAsExponential, 2) {
|
||||
double d = arg.value();
|
||||
intptr_t fraction_digits_value = fraction_digits.Value();
|
||||
if (-1 <= fraction_digits_value && fraction_digits_value <= 20) {
|
||||
return DoubleToStringAsExponential(
|
||||
d, static_cast<int>(fraction_digits_value));
|
||||
return DoubleToStringAsExponential(d,
|
||||
static_cast<int>(fraction_digits_value));
|
||||
} else {
|
||||
Exceptions::ThrowArgumentError(String::Handle(
|
||||
String::New("Illegal arguments to double.toStringAsExponential")));
|
||||
|
||||
@@ -26,8 +26,8 @@ static RawScript* FindScript(DartFrameIterator* iterator) {
|
||||
StackFrame* stack_frame = iterator->NextFrame();
|
||||
Code& code = Code::Handle();
|
||||
Function& func = Function::Handle();
|
||||
const Class& assert_error_class = Class::Handle(
|
||||
Library::LookupCoreClass(Symbols::AssertionError()));
|
||||
const Class& assert_error_class =
|
||||
Class::Handle(Library::LookupCoreClass(Symbols::AssertionError()));
|
||||
ASSERT(!assert_error_class.IsNull());
|
||||
bool hit_assertion_error = false;
|
||||
while (stack_frame != NULL) {
|
||||
@@ -84,8 +84,8 @@ DEFINE_NATIVE_ENTRY(AssertionError_throwNew, 2) {
|
||||
script.GetTokenLocation(assertion_end, &to_line, &to_column);
|
||||
// The snippet will extract the correct assertion code even if the source
|
||||
// is generated.
|
||||
args.SetAt(0, String::Handle(
|
||||
script.GetSnippet(from_line, from_column, to_line, to_column)));
|
||||
args.SetAt(0, String::Handle(script.GetSnippet(from_line, from_column,
|
||||
to_line, to_column)));
|
||||
|
||||
// Initialize location arguments starting at position 1.
|
||||
// Do not set a column if the source has been generated as it will be wrong.
|
||||
@@ -118,8 +118,8 @@ DEFINE_NATIVE_ENTRY(TypeError_throwNew, 5) {
|
||||
const String& dst_name = String::CheckedHandle(arguments->NativeArgAt(3));
|
||||
const String& error_msg = String::CheckedHandle(arguments->NativeArgAt(4));
|
||||
const AbstractType& src_type = AbstractType::Handle(src_value.GetType());
|
||||
Exceptions::CreateAndThrowTypeError(
|
||||
location, src_type, dst_type, dst_name, error_msg);
|
||||
Exceptions::CreateAndThrowTypeError(location, src_type, dst_type, dst_name,
|
||||
error_msg);
|
||||
UNREACHABLE();
|
||||
return Object::null();
|
||||
}
|
||||
|
||||
+12
-13
@@ -16,9 +16,8 @@ namespace dart {
|
||||
DEFINE_NATIVE_ENTRY(Function_apply, 2) {
|
||||
const Array& fun_arguments = Array::CheckedHandle(arguments->NativeArgAt(0));
|
||||
const Array& fun_arg_names = Array::CheckedHandle(arguments->NativeArgAt(1));
|
||||
const Array& fun_args_desc =
|
||||
Array::Handle(ArgumentsDescriptor::New(fun_arguments.Length(),
|
||||
fun_arg_names));
|
||||
const Array& fun_args_desc = Array::Handle(
|
||||
ArgumentsDescriptor::New(fun_arguments.Length(), fun_arg_names));
|
||||
const Object& result =
|
||||
Object::Handle(DartEntry::InvokeClosure(fun_arguments, fun_args_desc));
|
||||
if (result.IsError()) {
|
||||
@@ -29,8 +28,8 @@ DEFINE_NATIVE_ENTRY(Function_apply, 2) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(Closure_equals, 2) {
|
||||
const Closure& receiver = Closure::CheckedHandle(
|
||||
zone, arguments->NativeArgAt(0));
|
||||
const Closure& receiver =
|
||||
Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
GET_NATIVE_ARGUMENT(Instance, other, arguments->NativeArgAt(1));
|
||||
ASSERT(!other.IsNull());
|
||||
if (receiver.raw() == other.raw()) return Bool::True().raw();
|
||||
@@ -41,8 +40,8 @@ DEFINE_NATIVE_ENTRY(Closure_equals, 2) {
|
||||
ASSERT(!func_a.IsImplicitStaticClosureFunction());
|
||||
if (func_a.IsImplicitInstanceClosureFunction()) {
|
||||
const Context& context_a = Context::Handle(receiver.context());
|
||||
const Context& context_b = Context::Handle(
|
||||
Closure::Cast(other).context());
|
||||
const Context& context_b =
|
||||
Context::Handle(Closure::Cast(other).context());
|
||||
const Object& receiver_a = Object::Handle(context_a.At(0));
|
||||
const Object& receiver_b = Object::Handle(context_b.At(0));
|
||||
if (receiver_a.raw() == receiver_b.raw()) return Bool::True().raw();
|
||||
@@ -51,8 +50,8 @@ DEFINE_NATIVE_ENTRY(Closure_equals, 2) {
|
||||
func_b.IsImplicitInstanceClosureFunction()) {
|
||||
// TODO(rmacnak): Patch existing tears off during reload instead.
|
||||
const Context& context_a = Context::Handle(receiver.context());
|
||||
const Context& context_b = Context::Handle(
|
||||
Closure::Cast(other).context());
|
||||
const Context& context_b =
|
||||
Context::Handle(Closure::Cast(other).context());
|
||||
const Object& receiver_a = Object::Handle(context_a.At(0));
|
||||
const Object& receiver_b = Object::Handle(context_b.At(0));
|
||||
if ((receiver_a.raw() == receiver_b.raw()) &&
|
||||
@@ -67,8 +66,8 @@ DEFINE_NATIVE_ENTRY(Closure_equals, 2) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(Closure_hashCode, 1) {
|
||||
const Closure& receiver = Closure::CheckedHandle(
|
||||
zone, arguments->NativeArgAt(0));
|
||||
const Closure& receiver =
|
||||
Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
const Function& func = Function::Handle(receiver.function());
|
||||
// Hash together name, class name and signature.
|
||||
const Class& cls = Class::Handle(func.Owner());
|
||||
@@ -85,8 +84,8 @@ DEFINE_NATIVE_ENTRY(Closure_hashCode, 1) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(Closure_clone, 1) {
|
||||
const Closure& receiver = Closure::CheckedHandle(
|
||||
zone, arguments->NativeArgAt(0));
|
||||
const Closure& receiver =
|
||||
Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
const Function& func = Function::Handle(zone, receiver.function());
|
||||
const Context& ctx = Context::Handle(zone, receiver.context());
|
||||
Context& cloned_ctx =
|
||||
|
||||
@@ -17,11 +17,10 @@ DEFINE_NATIVE_ENTRY(GrowableList_allocate, 2) {
|
||||
TypeArguments::CheckedHandle(arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Array, data, arguments->NativeArgAt(1));
|
||||
if (data.Length() <= 0) {
|
||||
Exceptions::ThrowRangeError(
|
||||
"length",
|
||||
Integer::Handle(Integer::New(data.Length())),
|
||||
0, // This is the limit the user sees.
|
||||
Array::kMaxElements);
|
||||
Exceptions::ThrowRangeError("length",
|
||||
Integer::Handle(Integer::New(data.Length())),
|
||||
0, // This is the limit the user sees.
|
||||
Array::kMaxElements);
|
||||
}
|
||||
const GrowableObjectArray& new_array =
|
||||
GrowableObjectArray::Handle(GrowableObjectArray::New(data));
|
||||
|
||||
+30
-29
@@ -16,8 +16,10 @@
|
||||
|
||||
namespace dart {
|
||||
|
||||
DEFINE_FLAG(bool, trace_intrinsified_natives, false,
|
||||
"Report if any of the intrinsified natives are called");
|
||||
DEFINE_FLAG(bool,
|
||||
trace_intrinsified_natives,
|
||||
false,
|
||||
"Report if any of the intrinsified natives are called");
|
||||
|
||||
// Smi natives.
|
||||
|
||||
@@ -42,8 +44,8 @@ DEFINE_NATIVE_ENTRY(Integer_bitAndFromInteger, 2) {
|
||||
ASSERT(CheckInteger(right));
|
||||
ASSERT(CheckInteger(left));
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Integer_bitAndFromInteger %s & %s\n",
|
||||
right.ToCString(), left.ToCString());
|
||||
OS::Print("Integer_bitAndFromInteger %s & %s\n", right.ToCString(),
|
||||
left.ToCString());
|
||||
}
|
||||
const Integer& result = Integer::Handle(left.BitOp(Token::kBIT_AND, right));
|
||||
// A null result indicates that a bigint operation is required.
|
||||
@@ -57,8 +59,8 @@ DEFINE_NATIVE_ENTRY(Integer_bitOrFromInteger, 2) {
|
||||
ASSERT(CheckInteger(right));
|
||||
ASSERT(CheckInteger(left));
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Integer_bitOrFromInteger %s | %s\n",
|
||||
left.ToCString(), right.ToCString());
|
||||
OS::Print("Integer_bitOrFromInteger %s | %s\n", left.ToCString(),
|
||||
right.ToCString());
|
||||
}
|
||||
const Integer& result = Integer::Handle(left.BitOp(Token::kBIT_OR, right));
|
||||
// A null result indicates that a bigint operation is required.
|
||||
@@ -72,8 +74,8 @@ DEFINE_NATIVE_ENTRY(Integer_bitXorFromInteger, 2) {
|
||||
ASSERT(CheckInteger(right));
|
||||
ASSERT(CheckInteger(left));
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Integer_bitXorFromInteger %s ^ %s\n",
|
||||
left.ToCString(), right.ToCString());
|
||||
OS::Print("Integer_bitXorFromInteger %s ^ %s\n", left.ToCString(),
|
||||
right.ToCString());
|
||||
}
|
||||
const Integer& result = Integer::Handle(left.BitOp(Token::kBIT_XOR, right));
|
||||
// A null result indicates that a bigint operation is required.
|
||||
@@ -87,8 +89,8 @@ DEFINE_NATIVE_ENTRY(Integer_addFromInteger, 2) {
|
||||
ASSERT(CheckInteger(right_int));
|
||||
ASSERT(CheckInteger(left_int));
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Integer_addFromInteger %s + %s\n",
|
||||
left_int.ToCString(), right_int.ToCString());
|
||||
OS::Print("Integer_addFromInteger %s + %s\n", left_int.ToCString(),
|
||||
right_int.ToCString());
|
||||
}
|
||||
const Integer& result =
|
||||
Integer::Handle(left_int.ArithmeticOp(Token::kADD, right_int));
|
||||
@@ -103,8 +105,8 @@ DEFINE_NATIVE_ENTRY(Integer_subFromInteger, 2) {
|
||||
ASSERT(CheckInteger(right_int));
|
||||
ASSERT(CheckInteger(left_int));
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Integer_subFromInteger %s - %s\n",
|
||||
left_int.ToCString(), right_int.ToCString());
|
||||
OS::Print("Integer_subFromInteger %s - %s\n", left_int.ToCString(),
|
||||
right_int.ToCString());
|
||||
}
|
||||
const Integer& result =
|
||||
Integer::Handle(left_int.ArithmeticOp(Token::kSUB, right_int));
|
||||
@@ -119,8 +121,8 @@ DEFINE_NATIVE_ENTRY(Integer_mulFromInteger, 2) {
|
||||
ASSERT(CheckInteger(right_int));
|
||||
ASSERT(CheckInteger(left_int));
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Integer_mulFromInteger %s * %s\n",
|
||||
left_int.ToCString(), right_int.ToCString());
|
||||
OS::Print("Integer_mulFromInteger %s * %s\n", left_int.ToCString(),
|
||||
right_int.ToCString());
|
||||
}
|
||||
const Integer& result =
|
||||
Integer::Handle(left_int.ArithmeticOp(Token::kMUL, right_int));
|
||||
@@ -148,8 +150,8 @@ DEFINE_NATIVE_ENTRY(Integer_moduloFromInteger, 2) {
|
||||
ASSERT(CheckInteger(right_int));
|
||||
ASSERT(CheckInteger(left_int));
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Integer_moduloFromInteger %s mod %s\n",
|
||||
left_int.ToCString(), right_int.ToCString());
|
||||
OS::Print("Integer_moduloFromInteger %s mod %s\n", left_int.ToCString(),
|
||||
right_int.ToCString());
|
||||
}
|
||||
if (right_int.IsZero()) {
|
||||
// Should have been caught before calling into runtime.
|
||||
@@ -168,8 +170,8 @@ DEFINE_NATIVE_ENTRY(Integer_greaterThanFromInteger, 2) {
|
||||
ASSERT(CheckInteger(right));
|
||||
ASSERT(CheckInteger(left));
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Integer_greaterThanFromInteger %s > %s\n",
|
||||
left.ToCString(), right.ToCString());
|
||||
OS::Print("Integer_greaterThanFromInteger %s > %s\n", left.ToCString(),
|
||||
right.ToCString());
|
||||
}
|
||||
return Bool::Get(left.CompareWith(right) == 1).raw();
|
||||
}
|
||||
@@ -181,8 +183,8 @@ DEFINE_NATIVE_ENTRY(Integer_equalToInteger, 2) {
|
||||
ASSERT(CheckInteger(left));
|
||||
ASSERT(CheckInteger(right));
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Integer_equalToInteger %s == %s\n",
|
||||
left.ToCString(), right.ToCString());
|
||||
OS::Print("Integer_equalToInteger %s == %s\n", left.ToCString(),
|
||||
right.ToCString());
|
||||
}
|
||||
return Bool::Get(left.CompareWith(right) == 0).raw();
|
||||
}
|
||||
@@ -289,8 +291,8 @@ DEFINE_NATIVE_ENTRY(Smi_bitAndFromSmi, 2) {
|
||||
const Smi& left = Smi::CheckedHandle(arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, right, arguments->NativeArgAt(1));
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Smi_bitAndFromSmi %s & %s\n",
|
||||
left.ToCString(), right.ToCString());
|
||||
OS::Print("Smi_bitAndFromSmi %s & %s\n", left.ToCString(),
|
||||
right.ToCString());
|
||||
}
|
||||
const Smi& left_value = Smi::Cast(left);
|
||||
const Smi& right_value = Smi::Cast(right);
|
||||
@@ -303,25 +305,24 @@ DEFINE_NATIVE_ENTRY(Smi_shrFromInt, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
|
||||
ASSERT(CheckInteger(amount));
|
||||
ASSERT(CheckInteger(value));
|
||||
const Integer& result = Integer::Handle(
|
||||
ShiftOperationHelper(Token::kSHR, value, amount));
|
||||
const Integer& result =
|
||||
Integer::Handle(ShiftOperationHelper(Token::kSHR, value, amount));
|
||||
// A null result indicates that a bigint operation is required.
|
||||
return result.IsNull() ? result.raw() : result.AsValidInteger();
|
||||
}
|
||||
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(Smi_shlFromInt, 2) {
|
||||
const Smi& amount = Smi::CheckedHandle(arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
|
||||
ASSERT(CheckInteger(amount));
|
||||
ASSERT(CheckInteger(value));
|
||||
if (FLAG_trace_intrinsified_natives) {
|
||||
OS::Print("Smi_shlFromInt: %s << %s\n",
|
||||
value.ToCString(), amount.ToCString());
|
||||
OS::Print("Smi_shlFromInt: %s << %s\n", value.ToCString(),
|
||||
amount.ToCString());
|
||||
}
|
||||
const Integer& result = Integer::Handle(
|
||||
ShiftOperationHelper(Token::kSHL, value, amount));
|
||||
const Integer& result =
|
||||
Integer::Handle(ShiftOperationHelper(Token::kSHL, value, amount));
|
||||
// A null result indicates that a bigint operation is required.
|
||||
return result.IsNull() ? result.raw() : result.AsValidInteger();
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ class InvocationMirror : public AllStatic {
|
||||
kMethod = 0,
|
||||
kGetter = 1,
|
||||
kSetter = 2,
|
||||
kField = 3,
|
||||
kField = 3,
|
||||
kLocalVar = 4,
|
||||
kTypeShift = 0,
|
||||
kTypeBits = 3,
|
||||
@@ -32,7 +32,7 @@ class InvocationMirror : public AllStatic {
|
||||
// NoSuchMethodError for compile-time resolution failures.
|
||||
kDynamic = 0,
|
||||
kSuper = 1,
|
||||
kStatic = 2,
|
||||
kStatic = 2,
|
||||
kConstructor = 3,
|
||||
kTopLevel = 4,
|
||||
kCallShift = kTypeBits,
|
||||
|
||||
+37
-60
@@ -25,7 +25,9 @@
|
||||
|
||||
namespace dart {
|
||||
|
||||
DEFINE_FLAG(bool, i_like_slow_isolate_spawn, false,
|
||||
DEFINE_FLAG(bool,
|
||||
i_like_slow_isolate_spawn,
|
||||
false,
|
||||
"Block the parent thread when loading spawned isolates.");
|
||||
|
||||
static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) {
|
||||
@@ -60,8 +62,7 @@ DEFINE_NATIVE_ENTRY(CapabilityImpl_get_hashcode, 1) {
|
||||
|
||||
DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 1) {
|
||||
ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
|
||||
Dart_Port port_id =
|
||||
PortMap::CreatePort(isolate->message_handler());
|
||||
Dart_Port port_id = PortMap::CreatePort(isolate->message_handler());
|
||||
return ReceivePort::New(port_id, false /* not control port */);
|
||||
}
|
||||
|
||||
@@ -111,16 +112,16 @@ DEFINE_NATIVE_ENTRY(SendPortImpl_sendInternal_, 2) {
|
||||
const bool can_send_any_object = isolate->origin_id() == port.origin_id();
|
||||
|
||||
if (ApiObjectConverter::CanConvert(obj.raw())) {
|
||||
PortMap::PostMessage(new Message(
|
||||
destination_port_id, obj.raw(), Message::kNormalPriority));
|
||||
PortMap::PostMessage(
|
||||
new Message(destination_port_id, obj.raw(), Message::kNormalPriority));
|
||||
} else {
|
||||
uint8_t* data = NULL;
|
||||
MessageWriter writer(&data, &allocator, can_send_any_object);
|
||||
writer.WriteMessage(obj);
|
||||
|
||||
// TODO(turnidge): Throw an exception when the return value is false?
|
||||
PortMap::PostMessage(new Message(destination_port_id,
|
||||
data, writer.BytesWritten(),
|
||||
PortMap::PostMessage(new Message(destination_port_id, data,
|
||||
writer.BytesWritten(),
|
||||
Message::kNormalPriority));
|
||||
}
|
||||
return Object::null();
|
||||
@@ -154,14 +155,9 @@ class SpawnIsolateTask : public ThreadPool::Task {
|
||||
// Make a copy of the state's isolate flags and hand it to the callback.
|
||||
Dart_IsolateFlags api_flags = *(state_->isolate_flags());
|
||||
|
||||
Isolate* isolate = reinterpret_cast<Isolate*>(
|
||||
(callback)(state_->script_url(),
|
||||
state_->function_name(),
|
||||
state_->package_root(),
|
||||
state_->package_config(),
|
||||
&api_flags,
|
||||
state_->init_data(),
|
||||
&error));
|
||||
Isolate* isolate = reinterpret_cast<Isolate*>((callback)(
|
||||
state_->script_url(), state_->function_name(), state_->package_root(),
|
||||
state_->package_config(), &api_flags, state_->init_data(), &error));
|
||||
state_->DecrementSpawnCount();
|
||||
if (isolate == NULL) {
|
||||
ReportError(error);
|
||||
@@ -245,21 +241,12 @@ DEFINE_NATIVE_ENTRY(Isolate_spawnFunction, 10) {
|
||||
Dart_Port on_exit_port = onExit.IsNull() ? ILLEGAL_PORT : onExit.Id();
|
||||
Dart_Port on_error_port = onError.IsNull() ? ILLEGAL_PORT : onError.Id();
|
||||
|
||||
IsolateSpawnState* state =
|
||||
new IsolateSpawnState(port.Id(),
|
||||
isolate->origin_id(),
|
||||
isolate->init_callback_data(),
|
||||
String2UTF8(script_uri),
|
||||
func,
|
||||
message,
|
||||
isolate->spawn_count_monitor(),
|
||||
isolate->spawn_count(),
|
||||
utf8_package_root,
|
||||
utf8_package_config,
|
||||
paused.value(),
|
||||
fatal_errors,
|
||||
on_exit_port,
|
||||
on_error_port);
|
||||
IsolateSpawnState* state = new IsolateSpawnState(
|
||||
port.Id(), isolate->origin_id(), isolate->init_callback_data(),
|
||||
String2UTF8(script_uri), func, message,
|
||||
isolate->spawn_count_monitor(), isolate->spawn_count(),
|
||||
utf8_package_root, utf8_package_config, paused.value(), fatal_errors,
|
||||
on_exit_port, on_error_port);
|
||||
ThreadPool::Task* spawn_task = new SpawnIsolateTask(state);
|
||||
|
||||
isolate->IncrementSpawnCount();
|
||||
@@ -300,9 +287,9 @@ static const char* CanonicalizeUri(Thread* thread,
|
||||
if (handler != NULL) {
|
||||
TransitionVMToNative transition(thread);
|
||||
Dart_EnterScope();
|
||||
Dart_Handle handle = handler(Dart_kCanonicalizeUrl,
|
||||
Api::NewHandle(thread, library.raw()),
|
||||
Api::NewHandle(thread, uri.raw()));
|
||||
Dart_Handle handle =
|
||||
handler(Dart_kCanonicalizeUrl, Api::NewHandle(thread, library.raw()),
|
||||
Api::NewHandle(thread, uri.raw()));
|
||||
const Object& obj = Object::Handle(Api::UnwrapHandle(handle));
|
||||
if (obj.IsString()) {
|
||||
result = String2UTF8(String::Cast(obj));
|
||||
@@ -312,9 +299,10 @@ static const char* CanonicalizeUri(Thread* thread,
|
||||
*error = zone->PrintToString("Unable to canonicalize uri '%s': %s",
|
||||
uri.ToCString(), error_obj.ToErrorCString());
|
||||
} else {
|
||||
*error = zone->PrintToString("Unable to canonicalize uri '%s': "
|
||||
"library tag handler returned wrong type",
|
||||
uri.ToCString());
|
||||
*error = zone->PrintToString(
|
||||
"Unable to canonicalize uri '%s': "
|
||||
"library tag handler returned wrong type",
|
||||
uri.ToCString());
|
||||
}
|
||||
Dart_ExitScope();
|
||||
} else {
|
||||
@@ -348,7 +336,7 @@ DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 12) {
|
||||
if (Snapshot::IncludesCode(Dart::snapshot_kind())) {
|
||||
const Array& args = Array::Handle(Array::New(1));
|
||||
args.SetAt(0, String::Handle(String::New(
|
||||
"Isolate.spawnUri not supported under precompilation")));
|
||||
"Isolate.spawnUri not supported under precompilation")));
|
||||
Exceptions::ThrowByType(Exceptions::kUnsupported, args);
|
||||
UNREACHABLE();
|
||||
}
|
||||
@@ -372,21 +360,11 @@ DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 12) {
|
||||
Dart_Port on_exit_port = onExit.IsNull() ? ILLEGAL_PORT : onExit.Id();
|
||||
Dart_Port on_error_port = onError.IsNull() ? ILLEGAL_PORT : onError.Id();
|
||||
|
||||
IsolateSpawnState* state =
|
||||
new IsolateSpawnState(
|
||||
port.Id(),
|
||||
isolate->init_callback_data(),
|
||||
canonical_uri,
|
||||
utf8_package_root,
|
||||
utf8_package_config,
|
||||
args,
|
||||
message,
|
||||
isolate->spawn_count_monitor(),
|
||||
isolate->spawn_count(),
|
||||
paused.value(),
|
||||
fatal_errors,
|
||||
on_exit_port,
|
||||
on_error_port);
|
||||
IsolateSpawnState* state = new IsolateSpawnState(
|
||||
port.Id(), isolate->init_callback_data(), canonical_uri,
|
||||
utf8_package_root, utf8_package_config, args, message,
|
||||
isolate->spawn_count_monitor(), isolate->spawn_count(), paused.value(),
|
||||
fatal_errors, on_exit_port, on_error_port);
|
||||
|
||||
// If we were passed a value then override the default flags state for
|
||||
// checked mode.
|
||||
@@ -423,17 +401,17 @@ DEFINE_NATIVE_ENTRY(Isolate_spawnUri, 12) {
|
||||
DEFINE_NATIVE_ENTRY(Isolate_getPortAndCapabilitiesOfCurrentIsolate, 0) {
|
||||
const Array& result = Array::Handle(Array::New(3));
|
||||
result.SetAt(0, SendPort::Handle(SendPort::New(isolate->main_port())));
|
||||
result.SetAt(1, Capability::Handle(
|
||||
Capability::New(isolate->pause_capability())));
|
||||
result.SetAt(2, Capability::Handle(
|
||||
Capability::New(isolate->terminate_capability())));
|
||||
result.SetAt(
|
||||
1, Capability::Handle(Capability::New(isolate->pause_capability())));
|
||||
result.SetAt(
|
||||
2, Capability::Handle(Capability::New(isolate->terminate_capability())));
|
||||
return result.raw();
|
||||
}
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(Isolate_getCurrentRootUriStr, 0) {
|
||||
const Library& root_lib = Library::Handle(zone,
|
||||
isolate->object_store()->root_library());
|
||||
const Library& root_lib =
|
||||
Library::Handle(zone, isolate->object_store()->root_library());
|
||||
return root_lib.url();
|
||||
}
|
||||
|
||||
@@ -449,8 +427,7 @@ DEFINE_NATIVE_ENTRY(Isolate_sendOOB, 2) {
|
||||
MessageWriter writer(&data, &allocator, false);
|
||||
writer.WriteMessage(msg);
|
||||
|
||||
PortMap::PostMessage(new Message(port.Id(),
|
||||
data, writer.BytesWritten(),
|
||||
PortMap::PostMessage(new Message(port.Id(), data, writer.BytesWritten(),
|
||||
Message::kOOBPriority));
|
||||
return Object::null();
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
// 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.
|
||||
|
||||
// clang-format off
|
||||
|
||||
#include "{{INCLUDE}}" // NOLINT
|
||||
|
||||
// This file is used to generate the mapping of libraries which have
|
||||
|
||||
@@ -23,8 +23,7 @@ DEFINE_NATIVE_ENTRY(LinkedHashMap_getIndex, 1) {
|
||||
DEFINE_NATIVE_ENTRY(LinkedHashMap_setIndex, 2) {
|
||||
const LinkedHashMap& map =
|
||||
LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
|
||||
const TypedData& index =
|
||||
TypedData::CheckedHandle(arguments->NativeArgAt(1));
|
||||
const TypedData& index = TypedData::CheckedHandle(arguments->NativeArgAt(1));
|
||||
map.SetIndex(index);
|
||||
return Object::null();
|
||||
}
|
||||
@@ -40,8 +39,7 @@ DEFINE_NATIVE_ENTRY(LinkedHashMap_getData, 1) {
|
||||
DEFINE_NATIVE_ENTRY(LinkedHashMap_setData, 2) {
|
||||
const LinkedHashMap& map =
|
||||
LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
|
||||
const Array& data =
|
||||
Array::CheckedHandle(arguments->NativeArgAt(1));
|
||||
const Array& data = Array::CheckedHandle(arguments->NativeArgAt(1));
|
||||
map.SetData(data);
|
||||
return Object::null();
|
||||
}
|
||||
@@ -57,8 +55,7 @@ DEFINE_NATIVE_ENTRY(LinkedHashMap_getHashMask, 1) {
|
||||
DEFINE_NATIVE_ENTRY(LinkedHashMap_setHashMask, 2) {
|
||||
const LinkedHashMap& map =
|
||||
LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
|
||||
const Smi& hashMask =
|
||||
Smi::CheckedHandle(arguments->NativeArgAt(1));
|
||||
const Smi& hashMask = Smi::CheckedHandle(arguments->NativeArgAt(1));
|
||||
map.SetHashMask(hashMask.Value());
|
||||
return Object::null();
|
||||
}
|
||||
@@ -74,8 +71,7 @@ DEFINE_NATIVE_ENTRY(LinkedHashMap_getDeletedKeys, 1) {
|
||||
DEFINE_NATIVE_ENTRY(LinkedHashMap_setDeletedKeys, 2) {
|
||||
const LinkedHashMap& map =
|
||||
LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
|
||||
const Smi& deletedKeys =
|
||||
Smi::CheckedHandle(arguments->NativeArgAt(1));
|
||||
const Smi& deletedKeys = Smi::CheckedHandle(arguments->NativeArgAt(1));
|
||||
map.SetDeletedKeys(deletedKeys.Value());
|
||||
return Object::null();
|
||||
}
|
||||
@@ -91,8 +87,7 @@ DEFINE_NATIVE_ENTRY(LinkedHashMap_getUsedData, 1) {
|
||||
DEFINE_NATIVE_ENTRY(LinkedHashMap_setUsedData, 2) {
|
||||
const LinkedHashMap& map =
|
||||
LinkedHashMap::CheckedHandle(arguments->NativeArgAt(0));
|
||||
const Smi& usedData =
|
||||
Smi::CheckedHandle(arguments->NativeArgAt(1));
|
||||
const Smi& usedData = Smi::CheckedHandle(arguments->NativeArgAt(1));
|
||||
map.SetUsedData(usedData.Value());
|
||||
return Object::null();
|
||||
}
|
||||
|
||||
+8
-8
@@ -68,8 +68,8 @@ DEFINE_NATIVE_ENTRY(Math_log, 1) {
|
||||
DEFINE_NATIVE_ENTRY(Math_doublePow, 2) {
|
||||
const double operand =
|
||||
Double::CheckedHandle(arguments->NativeArgAt(0)).value();
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
Double, exponent_object, arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Double, exponent_object,
|
||||
arguments->NativeArgAt(1));
|
||||
const double exponent = exponent_object.value();
|
||||
return Double::New(pow(operand, exponent));
|
||||
}
|
||||
@@ -106,14 +106,14 @@ DEFINE_NATIVE_ENTRY(Random_nextState, 1) {
|
||||
uint64_t state = (A * state_lo) + state_hi;
|
||||
array.SetUint32(0, static_cast<uint32_t>(state));
|
||||
array.SetUint32(array.ElementSizeInBytes(),
|
||||
static_cast<uint32_t>(state >> 32));
|
||||
static_cast<uint32_t>(state >> 32));
|
||||
return Object::null();
|
||||
}
|
||||
|
||||
|
||||
RawTypedData* CreateRandomState(Zone* zone, uint64_t seed) {
|
||||
const TypedData& result = TypedData::Handle(
|
||||
zone, TypedData::New(kTypedDataUint32ArrayCid, 2));
|
||||
const TypedData& result =
|
||||
TypedData::Handle(zone, TypedData::New(kTypedDataUint32ArrayCid, 2));
|
||||
result.SetUint32(0, static_cast<uint32_t>(seed));
|
||||
result.SetUint32(result.ElementSizeInBytes(),
|
||||
static_cast<uint32_t>(seed >> 32));
|
||||
@@ -125,11 +125,11 @@ uint64_t mix64(uint64_t n) {
|
||||
// Thomas Wang 64-bit mix.
|
||||
// http://www.concentric.net/~Ttwang/tech/inthash.htm
|
||||
// via. http://web.archive.org/web/20071223173210/http://www.concentric.net/~Ttwang/tech/inthash.htm
|
||||
n = (~n) + (n << 21); // n = (n << 21) - n - 1;
|
||||
n = (~n) + (n << 21); // n = (n << 21) - n - 1;
|
||||
n = n ^ (n >> 24);
|
||||
n = n * 265; // n = (n + (n << 3)) + (n << 8);
|
||||
n = n * 265; // n = (n + (n << 3)) + (n << 8);
|
||||
n = n ^ (n >> 14);
|
||||
n = n * 21; // n = (n + (n << 2)) + (n << 4);
|
||||
n = n * 21; // n = (n + (n << 2)) + (n << 4);
|
||||
n = n ^ (n >> 28);
|
||||
n = n + (n << 31);
|
||||
return n;
|
||||
|
||||
+156
-244
@@ -24,18 +24,15 @@ namespace dart {
|
||||
#define PROPAGATE_IF_MALFORMED(type) \
|
||||
if (type.IsMalformed()) { \
|
||||
Exceptions::PropagateError(Error::Handle(type.error())); \
|
||||
} \
|
||||
}
|
||||
|
||||
static RawInstance* CreateMirror(const String& mirror_class_name,
|
||||
const Array& constructor_arguments) {
|
||||
const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary());
|
||||
const String& constructor_name = Symbols::Dot();
|
||||
|
||||
const Object& result = Object::Handle(
|
||||
DartLibraryCalls::InstanceCreate(mirrors_lib,
|
||||
mirror_class_name,
|
||||
constructor_name,
|
||||
constructor_arguments));
|
||||
const Object& result = Object::Handle(DartLibraryCalls::InstanceCreate(
|
||||
mirrors_lib, mirror_class_name, constructor_name, constructor_arguments));
|
||||
ASSERT(!result.IsError());
|
||||
return Instance::Cast(result).raw();
|
||||
}
|
||||
@@ -53,8 +50,8 @@ static void ThrowNoSuchMethod(const Instance& receiver,
|
||||
const Array& argument_names,
|
||||
const InvocationMirror::Call call,
|
||||
const InvocationMirror::Type type) {
|
||||
const Smi& invocation_type = Smi::Handle(Smi::New(
|
||||
InvocationMirror::EncodeType(call, type)));
|
||||
const Smi& invocation_type =
|
||||
Smi::Handle(Smi::New(InvocationMirror::EncodeType(call, type)));
|
||||
|
||||
const Array& args = Array::Handle(Array::New(6));
|
||||
args.SetAt(0, receiver);
|
||||
@@ -73,12 +70,12 @@ static void ThrowNoSuchMethod(const Instance& receiver,
|
||||
}
|
||||
|
||||
const Library& libcore = Library::Handle(Library::CoreLibrary());
|
||||
const Class& NoSuchMethodError = Class::Handle(
|
||||
libcore.LookupClass(Symbols::NoSuchMethodError()));
|
||||
const Class& NoSuchMethodError =
|
||||
Class::Handle(libcore.LookupClass(Symbols::NoSuchMethodError()));
|
||||
const Function& throwNew = Function::Handle(
|
||||
NoSuchMethodError.LookupFunctionAllowPrivate(Symbols::ThrowNew()));
|
||||
const Object& result = Object::Handle(
|
||||
DartEntry::InvokeFunction(throwNew, args));
|
||||
const Object& result =
|
||||
Object::Handle(DartEntry::InvokeFunction(throwNew, args));
|
||||
ASSERT(result.IsError());
|
||||
Exceptions::PropagateError(Error::Cast(result));
|
||||
UNREACHABLE();
|
||||
@@ -98,8 +95,8 @@ static void EnsureConstructorsAreCompiled(const Function& func) {
|
||||
UNREACHABLE();
|
||||
}
|
||||
if (!func.HasCode()) {
|
||||
const Error& error = Error::Handle(
|
||||
zone, Compiler::CompileFunction(thread, func));
|
||||
const Error& error =
|
||||
Error::Handle(zone, Compiler::CompileFunction(thread, func));
|
||||
if (!error.IsNull()) {
|
||||
Exceptions::PropagateError(error);
|
||||
UNREACHABLE();
|
||||
@@ -111,8 +108,8 @@ static RawInstance* CreateParameterMirrorList(const Function& func,
|
||||
const Instance& owner_mirror) {
|
||||
HANDLESCOPE(Thread::Current());
|
||||
const intptr_t implicit_param_count = func.NumImplicitParameters();
|
||||
const intptr_t non_implicit_param_count = func.NumParameters() -
|
||||
implicit_param_count;
|
||||
const intptr_t non_implicit_param_count =
|
||||
func.NumParameters() - implicit_param_count;
|
||||
const intptr_t index_of_first_optional_param =
|
||||
non_implicit_param_count - func.NumOptionalParameters();
|
||||
const intptr_t index_of_first_named_param =
|
||||
@@ -178,11 +175,11 @@ static RawInstance* CreateParameterMirrorList(const Function& func,
|
||||
name ^= func.ParameterNameAt(implicit_param_count + i);
|
||||
if (has_extra_parameter_info) {
|
||||
is_final ^= param_descriptor.At(i * Parser::kParameterEntrySize +
|
||||
Parser::kParameterIsFinalOffset);
|
||||
Parser::kParameterIsFinalOffset);
|
||||
default_value = param_descriptor.At(i * Parser::kParameterEntrySize +
|
||||
Parser::kParameterDefaultValueOffset);
|
||||
Parser::kParameterDefaultValueOffset);
|
||||
metadata = param_descriptor.At(i * Parser::kParameterEntrySize +
|
||||
Parser::kParameterMetadataOffset);
|
||||
Parser::kParameterMetadataOffset);
|
||||
}
|
||||
ASSERT(default_value.IsNull() || default_value.IsInstance());
|
||||
|
||||
@@ -278,15 +275,15 @@ static RawInstance* CreateMethodMirror(const Function& func,
|
||||
|
||||
intptr_t kind_flags = 0;
|
||||
kind_flags |= (func.is_abstract() << Mirrors::kAbstract);
|
||||
kind_flags |= (func.IsGetterFunction() << Mirrors::kGetter);
|
||||
kind_flags |= (func.IsSetterFunction() << Mirrors::kSetter);
|
||||
kind_flags |= (func.IsGetterFunction() << Mirrors::kGetter);
|
||||
kind_flags |= (func.IsSetterFunction() << Mirrors::kSetter);
|
||||
bool is_ctor = (func.kind() == RawFunction::kConstructor);
|
||||
kind_flags |= (is_ctor << Mirrors::kConstructor);
|
||||
kind_flags |= (is_ctor << Mirrors::kConstructor);
|
||||
kind_flags |= ((is_ctor && func.is_const()) << Mirrors::kConstCtor);
|
||||
kind_flags |= ((is_ctor && func.IsGenerativeConstructor())
|
||||
<< Mirrors::kGenerativeCtor);
|
||||
kind_flags |= ((is_ctor && func.is_redirecting())
|
||||
<< Mirrors::kRedirectingCtor);
|
||||
kind_flags |=
|
||||
((is_ctor && func.IsGenerativeConstructor()) << Mirrors::kGenerativeCtor);
|
||||
kind_flags |=
|
||||
((is_ctor && func.is_redirecting()) << Mirrors::kRedirectingCtor);
|
||||
kind_flags |= ((is_ctor && func.IsFactory()) << Mirrors::kFactoryCtor);
|
||||
kind_flags |= (func.is_external() << Mirrors::kExternal);
|
||||
args.SetAt(5, Smi::Handle(Smi::New(kind_flags)));
|
||||
@@ -364,10 +361,7 @@ static RawInstance* CreateLibraryMirror(Thread* thread, const Library& lib) {
|
||||
args.SetAt(1, str);
|
||||
str = lib.url();
|
||||
const char* censored_libraries[] = {
|
||||
"dart:_builtin",
|
||||
"dart:_blink",
|
||||
"dart:_vmservice",
|
||||
NULL,
|
||||
"dart:_builtin", "dart:_blink", "dart:_vmservice", NULL,
|
||||
};
|
||||
for (intptr_t i = 0; censored_libraries[i] != NULL; i++) {
|
||||
if (str.Equals(censored_libraries[i])) {
|
||||
@@ -378,8 +372,8 @@ static RawInstance* CreateLibraryMirror(Thread* thread, const Library& lib) {
|
||||
if (str.Equals("dart:io")) {
|
||||
// Hack around dart:io being loaded into non-service isolates in Dartium.
|
||||
Isolate* isolate = thread->isolate();
|
||||
const GrowableObjectArray& libraries = GrowableObjectArray::Handle(
|
||||
zone, isolate->object_store()->libraries());
|
||||
const GrowableObjectArray& libraries =
|
||||
GrowableObjectArray::Handle(zone, isolate->object_store()->libraries());
|
||||
Library& other_lib = Library::Handle(zone);
|
||||
String& other_uri = String::Handle(zone);
|
||||
for (intptr_t i = 0; i < libraries.Length(); i++) {
|
||||
@@ -483,8 +477,8 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_libraryDependencies, 2) {
|
||||
for (intptr_t i = 0; i < ports.Length(); i++) {
|
||||
ns ^= ports.At(i);
|
||||
if (!ns.IsNull()) {
|
||||
dep = CreateLibraryDependencyMirror(
|
||||
thread, lib_mirror, ns, prefix, true, false);
|
||||
dep = CreateLibraryDependencyMirror(thread, lib_mirror, ns, prefix, true,
|
||||
false);
|
||||
if (!dep.IsNull()) {
|
||||
deps.Add(dep);
|
||||
}
|
||||
@@ -495,8 +489,8 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_libraryDependencies, 2) {
|
||||
ports = lib.exports();
|
||||
for (intptr_t i = 0; i < ports.Length(); i++) {
|
||||
ns ^= ports.At(i);
|
||||
dep = CreateLibraryDependencyMirror(
|
||||
thread, lib_mirror, ns, prefix, false, false);
|
||||
dep = CreateLibraryDependencyMirror(thread, lib_mirror, ns, prefix, false,
|
||||
false);
|
||||
if (!dep.IsNull()) {
|
||||
deps.Add(dep);
|
||||
}
|
||||
@@ -513,8 +507,8 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_libraryDependencies, 2) {
|
||||
for (intptr_t i = 0; i < ports.Length(); i++) {
|
||||
ns ^= ports.At(i);
|
||||
if (!ns.IsNull()) {
|
||||
dep = CreateLibraryDependencyMirror(
|
||||
thread, lib_mirror, ns, prefix, true, prefix.is_deferred_load());
|
||||
dep = CreateLibraryDependencyMirror(thread, lib_mirror, ns, prefix,
|
||||
true, prefix.is_deferred_load());
|
||||
if (!dep.IsNull()) {
|
||||
deps.Add(dep);
|
||||
}
|
||||
@@ -541,8 +535,8 @@ static RawInstance* CreateTypeMirror(const AbstractType& type) {
|
||||
if (type.IsFunctionType()) {
|
||||
const Class& scope_class = Class::Handle(Type::Cast(type).type_class());
|
||||
if (scope_class.IsTypedefClass()) {
|
||||
return CreateTypedefMirror(scope_class,
|
||||
type, Bool::False(), Object::null_instance());
|
||||
return CreateTypedefMirror(scope_class, type, Bool::False(),
|
||||
Object::null_instance());
|
||||
} else {
|
||||
return CreateFunctionTypeMirror(type);
|
||||
}
|
||||
@@ -577,8 +571,8 @@ static RawInstance* CreateIsolateMirror() {
|
||||
Thread* thread = Thread::Current();
|
||||
Isolate* isolate = thread->isolate();
|
||||
const String& debug_name = String::Handle(String::New(isolate->name()));
|
||||
const Library& root_library = Library::Handle(thread->zone(),
|
||||
isolate->object_store()->root_library());
|
||||
const Library& root_library =
|
||||
Library::Handle(thread->zone(), isolate->object_store()->root_library());
|
||||
const Instance& root_library_mirror =
|
||||
Instance::Handle(CreateLibraryMirror(thread, root_library));
|
||||
|
||||
@@ -594,21 +588,21 @@ static void VerifyMethodKindShifts() {
|
||||
Thread* thread = Thread::Current();
|
||||
Zone* zone = thread->zone();
|
||||
const Library& lib = Library::Handle(zone, Library::MirrorsLibrary());
|
||||
const Class& cls = Class::Handle(zone,
|
||||
lib.LookupClassAllowPrivate(Symbols::_LocalMethodMirror()));
|
||||
const Class& cls = Class::Handle(
|
||||
zone, lib.LookupClassAllowPrivate(Symbols::_LocalMethodMirror()));
|
||||
const Error& error = Error::Handle(zone, cls.EnsureIsFinalized(thread));
|
||||
ASSERT(error.IsNull());
|
||||
|
||||
Field& field = Field::Handle();
|
||||
Smi& value = Smi::Handle();
|
||||
|
||||
#define CHECK_KIND_SHIFT(name) \
|
||||
field = cls.LookupField(String::Handle(String::New(#name))); \
|
||||
ASSERT(!field.IsNull()); \
|
||||
value ^= field.StaticValue(); \
|
||||
ASSERT(value.Value() == Mirrors::name);
|
||||
#define CHECK_KIND_SHIFT(name) \
|
||||
field = cls.LookupField(String::Handle(String::New(#name))); \
|
||||
ASSERT(!field.IsNull()); \
|
||||
value ^= field.StaticValue(); \
|
||||
ASSERT(value.Value() == Mirrors::name);
|
||||
MIRRORS_KIND_SHIFT_LIST(CHECK_KIND_SHIFT)
|
||||
#undef CHECK_KIND_SHIFT
|
||||
#undef CHECK_KIND_SHIFT
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -628,27 +622,21 @@ static RawInstance* ReturnResult(const Object& result) {
|
||||
|
||||
// Invoke the function, or noSuchMethod if it is null. Propagate any unhandled
|
||||
// exceptions. Wrap and propagate any compilation errors.
|
||||
static RawInstance* InvokeDynamicFunction(
|
||||
const Instance& receiver,
|
||||
const Function& function,
|
||||
const String& target_name,
|
||||
const Array& args,
|
||||
const Array& args_descriptor_array) {
|
||||
static RawInstance* InvokeDynamicFunction(const Instance& receiver,
|
||||
const Function& function,
|
||||
const String& target_name,
|
||||
const Array& args,
|
||||
const Array& args_descriptor_array) {
|
||||
// Note "args" is already the internal arguments with the receiver as the
|
||||
// first element.
|
||||
Object& result = Object::Handle();
|
||||
ArgumentsDescriptor args_descriptor(args_descriptor_array);
|
||||
if (function.IsNull() ||
|
||||
!function.is_reflectable() ||
|
||||
if (function.IsNull() || !function.is_reflectable() ||
|
||||
!function.AreValidArguments(args_descriptor, NULL)) {
|
||||
result = DartEntry::InvokeNoSuchMethod(receiver,
|
||||
target_name,
|
||||
args,
|
||||
result = DartEntry::InvokeNoSuchMethod(receiver, target_name, args,
|
||||
args_descriptor_array);
|
||||
} else {
|
||||
result = DartEntry::InvokeFunction(function,
|
||||
args,
|
||||
args_descriptor_array);
|
||||
result = DartEntry::InvokeFunction(function, args, args_descriptor_array);
|
||||
}
|
||||
return ReturnResult(result);
|
||||
}
|
||||
@@ -661,8 +649,7 @@ static RawInstance* InvokeLibraryGetter(const Library& library,
|
||||
// The getter function may either be in the library or in the field's owner
|
||||
// class, depending on whether it was an actual getter, or an uninitialized
|
||||
// field.
|
||||
const Field& field = Field::Handle(
|
||||
library.LookupLocalField(getter_name));
|
||||
const Field& field = Field::Handle(library.LookupLocalField(getter_name));
|
||||
Function& getter = Function::Handle();
|
||||
if (field.IsNull()) {
|
||||
// No field found. Check for a getter in the lib.
|
||||
@@ -698,13 +685,9 @@ static RawInstance* InvokeLibraryGetter(const Library& library,
|
||||
}
|
||||
|
||||
if (throw_nsm_if_absent) {
|
||||
ThrowNoSuchMethod(Instance::null_instance(),
|
||||
getter_name,
|
||||
getter,
|
||||
Object::null_array(),
|
||||
Object::null_array(),
|
||||
InvocationMirror::kTopLevel,
|
||||
InvocationMirror::kGetter);
|
||||
ThrowNoSuchMethod(Instance::null_instance(), getter_name, getter,
|
||||
Object::null_array(), Object::null_array(),
|
||||
InvocationMirror::kTopLevel, InvocationMirror::kGetter);
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
@@ -719,13 +702,12 @@ static RawInstance* InvokeClassGetter(const Class& klass,
|
||||
const String& getter_name,
|
||||
const bool throw_nsm_if_absent) {
|
||||
// Note static fields do not have implicit getters.
|
||||
const Field& field =
|
||||
Field::Handle(klass.LookupStaticField(getter_name));
|
||||
const Field& field = Field::Handle(klass.LookupStaticField(getter_name));
|
||||
if (field.IsNull() || field.IsUninitialized()) {
|
||||
const String& internal_getter_name = String::Handle(
|
||||
Field::GetterName(getter_name));
|
||||
Function& getter = Function::Handle(
|
||||
klass.LookupStaticFunction(internal_getter_name));
|
||||
const String& internal_getter_name =
|
||||
String::Handle(Field::GetterName(getter_name));
|
||||
Function& getter =
|
||||
Function::Handle(klass.LookupStaticFunction(internal_getter_name));
|
||||
|
||||
if (getter.IsNull() || !getter.is_reflectable()) {
|
||||
if (getter.IsNull()) {
|
||||
@@ -738,13 +720,9 @@ static RawInstance* InvokeClassGetter(const Class& klass,
|
||||
}
|
||||
}
|
||||
if (throw_nsm_if_absent) {
|
||||
ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
|
||||
getter_name,
|
||||
getter,
|
||||
Object::null_array(),
|
||||
Object::null_array(),
|
||||
InvocationMirror::kStatic,
|
||||
InvocationMirror::kGetter);
|
||||
ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), getter_name,
|
||||
getter, Object::null_array(), Object::null_array(),
|
||||
InvocationMirror::kStatic, InvocationMirror::kGetter);
|
||||
UNREACHABLE();
|
||||
}
|
||||
// Fall through case: Indicate that we didn't find any function or field
|
||||
@@ -791,8 +769,8 @@ static RawAbstractType* InstantiateType(const AbstractType& type,
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(MirrorSystem_libraries, 0) {
|
||||
const GrowableObjectArray& libraries = GrowableObjectArray::Handle(
|
||||
zone, isolate->object_store()->libraries());
|
||||
const GrowableObjectArray& libraries =
|
||||
GrowableObjectArray::Handle(zone, isolate->object_store()->libraries());
|
||||
|
||||
const intptr_t num_libraries = libraries.Length();
|
||||
const GrowableObjectArray& library_mirrors = GrowableObjectArray::Handle(
|
||||
@@ -829,8 +807,7 @@ DEFINE_NATIVE_ENTRY(Mirrors_makeLocalClassMirror, 1) {
|
||||
Exceptions::ThrowArgumentError(type);
|
||||
UNREACHABLE();
|
||||
}
|
||||
return CreateClassMirror(cls,
|
||||
AbstractType::Handle(cls.DeclarationType()),
|
||||
return CreateClassMirror(cls, AbstractType::Handle(cls.DeclarationType()),
|
||||
Bool::True(), // is_declaration
|
||||
Object::null_instance());
|
||||
}
|
||||
@@ -899,8 +876,7 @@ DEFINE_NATIVE_ENTRY(DeclarationMirror_metadata, 1) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(FunctionTypeMirror_call_method, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance,
|
||||
owner_mirror,
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror,
|
||||
arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
|
||||
// TODO(rmacnak): Return get:call() method on class _Closure instead?
|
||||
@@ -921,8 +897,7 @@ DEFINE_NATIVE_ENTRY(FunctionTypeMirror_parameters, 2) {
|
||||
|
||||
DEFINE_NATIVE_ENTRY(FunctionTypeMirror_return_type, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(AbstractType,
|
||||
instantiator,
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, instantiator,
|
||||
arguments->NativeArgAt(1));
|
||||
const Function& func = Function::Handle(ref.GetFunctionReferent());
|
||||
ASSERT(!func.IsNull());
|
||||
@@ -1011,8 +986,7 @@ DEFINE_NATIVE_ENTRY(ClassMirror_mixin, 1) {
|
||||
|
||||
DEFINE_NATIVE_ENTRY(ClassMirror_mixin_instantiated, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, type, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(AbstractType,
|
||||
instantiator,
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(AbstractType, instantiator,
|
||||
arguments->NativeArgAt(1));
|
||||
PROPAGATE_IF_MALFORMED(type);
|
||||
ASSERT(type.IsFinalized());
|
||||
@@ -1027,11 +1001,9 @@ DEFINE_NATIVE_ENTRY(ClassMirror_mixin_instantiated, 2) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(ClassMirror_members, 3) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance,
|
||||
owner_mirror,
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror,
|
||||
arguments->NativeArgAt(0));
|
||||
GET_NATIVE_ARGUMENT(AbstractType,
|
||||
owner_instantiator,
|
||||
GET_NATIVE_ARGUMENT(AbstractType, owner_instantiator,
|
||||
arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(2));
|
||||
const Class& klass = Class::Handle(ref.GetClassReferent());
|
||||
@@ -1065,10 +1037,10 @@ DEFINE_NATIVE_ENTRY(ClassMirror_members, 3) {
|
||||
func ^= functions.At(i);
|
||||
if (func.is_reflectable() &&
|
||||
(func.kind() == RawFunction::kRegularFunction ||
|
||||
func.kind() == RawFunction::kGetterFunction ||
|
||||
func.kind() == RawFunction::kSetterFunction)) {
|
||||
member_mirror = CreateMethodMirror(func, owner_mirror,
|
||||
owner_instantiator);
|
||||
func.kind() == RawFunction::kGetterFunction ||
|
||||
func.kind() == RawFunction::kSetterFunction)) {
|
||||
member_mirror =
|
||||
CreateMethodMirror(func, owner_mirror, owner_instantiator);
|
||||
member_mirrors.Add(member_mirror);
|
||||
}
|
||||
}
|
||||
@@ -1078,11 +1050,9 @@ DEFINE_NATIVE_ENTRY(ClassMirror_members, 3) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(ClassMirror_constructors, 3) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance,
|
||||
owner_mirror,
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror,
|
||||
arguments->NativeArgAt(0));
|
||||
GET_NATIVE_ARGUMENT(AbstractType,
|
||||
owner_instantiator,
|
||||
GET_NATIVE_ARGUMENT(AbstractType, owner_instantiator,
|
||||
arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(2));
|
||||
const Class& klass = Class::Handle(ref.GetClassReferent());
|
||||
@@ -1096,15 +1066,15 @@ DEFINE_NATIVE_ENTRY(ClassMirror_constructors, 3) {
|
||||
const intptr_t num_functions = functions.Length();
|
||||
|
||||
Instance& constructor_mirror = Instance::Handle();
|
||||
const GrowableObjectArray& constructor_mirrors = GrowableObjectArray::Handle(
|
||||
GrowableObjectArray::New(num_functions));
|
||||
const GrowableObjectArray& constructor_mirrors =
|
||||
GrowableObjectArray::Handle(GrowableObjectArray::New(num_functions));
|
||||
|
||||
Function& func = Function::Handle();
|
||||
for (intptr_t i = 0; i < num_functions; i++) {
|
||||
func ^= functions.At(i);
|
||||
if (func.is_reflectable() && func.kind() == RawFunction::kConstructor) {
|
||||
constructor_mirror = CreateMethodMirror(func, owner_mirror,
|
||||
owner_instantiator);
|
||||
constructor_mirror =
|
||||
CreateMethodMirror(func, owner_mirror, owner_instantiator);
|
||||
constructor_mirrors.Add(constructor_mirror);
|
||||
}
|
||||
}
|
||||
@@ -1114,8 +1084,7 @@ DEFINE_NATIVE_ENTRY(ClassMirror_constructors, 3) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(LibraryMirror_members, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance,
|
||||
owner_mirror,
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, owner_mirror,
|
||||
arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
|
||||
const Library& library = Library::Handle(ref.GetLibraryReferent());
|
||||
@@ -1139,8 +1108,7 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_members, 2) {
|
||||
// mixin applications.
|
||||
if (!klass.IsDynamicClass() && !klass.IsMixinApplication()) {
|
||||
type = klass.DeclarationType();
|
||||
member_mirror = CreateClassMirror(klass,
|
||||
type,
|
||||
member_mirror = CreateClassMirror(klass, type,
|
||||
Bool::True(), // is_declaration
|
||||
owner_mirror);
|
||||
member_mirrors.Add(member_mirror);
|
||||
@@ -1155,10 +1123,10 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_members, 2) {
|
||||
const Function& func = Function::Cast(entry);
|
||||
if (func.is_reflectable() &&
|
||||
(func.kind() == RawFunction::kRegularFunction ||
|
||||
func.kind() == RawFunction::kGetterFunction ||
|
||||
func.kind() == RawFunction::kSetterFunction)) {
|
||||
member_mirror = CreateMethodMirror(func, owner_mirror,
|
||||
AbstractType::Handle());
|
||||
func.kind() == RawFunction::kGetterFunction ||
|
||||
func.kind() == RawFunction::kSetterFunction)) {
|
||||
member_mirror =
|
||||
CreateMethodMirror(func, owner_mirror, AbstractType::Handle());
|
||||
member_mirrors.Add(member_mirror);
|
||||
}
|
||||
}
|
||||
@@ -1222,8 +1190,7 @@ DEFINE_NATIVE_ENTRY(TypeVariableMirror_owner, 1) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(TypeParameter, param, arguments->NativeArgAt(0));
|
||||
const Class& owner = Class::Handle(param.parameterized_class());
|
||||
const AbstractType& type = AbstractType::Handle(owner.DeclarationType());
|
||||
return CreateClassMirror(owner,
|
||||
type,
|
||||
return CreateClassMirror(owner, type,
|
||||
Bool::True(), // is_declaration
|
||||
Instance::null_instance());
|
||||
}
|
||||
@@ -1259,10 +1226,8 @@ DEFINE_NATIVE_ENTRY(Mirrors_evalInLibraryWithPrivateKey, 2) {
|
||||
}
|
||||
}
|
||||
ASSERT(!ctxt_library.IsNull());
|
||||
const Object& result =
|
||||
Object::Handle(ctxt_library.Evaluate(expression,
|
||||
Array::empty_array(),
|
||||
Array::empty_array()));
|
||||
const Object& result = Object::Handle(ctxt_library.Evaluate(
|
||||
expression, Array::empty_array(), Array::empty_array()));
|
||||
if (result.IsError()) {
|
||||
Exceptions::PropagateError(Error::Cast(result));
|
||||
UNREACHABLE();
|
||||
@@ -1285,8 +1250,7 @@ DEFINE_NATIVE_ENTRY(TypedefMirror_declaration, 1) {
|
||||
ASSERT(type.IsFunctionType());
|
||||
const Class& cls = Class::Handle(type.type_class());
|
||||
ASSERT(cls.IsTypedefClass());
|
||||
return CreateTypedefMirror(cls,
|
||||
AbstractType::Handle(cls.DeclarationType()),
|
||||
return CreateTypedefMirror(cls, AbstractType::Handle(cls.DeclarationType()),
|
||||
Bool::True(), // is_declaration
|
||||
Object::null_instance());
|
||||
}
|
||||
@@ -1296,14 +1260,14 @@ DEFINE_NATIVE_ENTRY(InstanceMirror_invoke, 5) {
|
||||
// because this native is an instance method in order to be polymorphic
|
||||
// with its cousins.
|
||||
GET_NATIVE_ARGUMENT(Instance, reflectee, arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
String, function_name, arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(String, function_name,
|
||||
arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
|
||||
|
||||
Class& klass = Class::Handle(reflectee.clazz());
|
||||
Function& function = Function::Handle(zone,
|
||||
Resolver::ResolveDynamicAnyArgs(zone, klass, function_name));
|
||||
Function& function = Function::Handle(
|
||||
zone, Resolver::ResolveDynamicAnyArgs(zone, klass, function_name));
|
||||
|
||||
const Array& args_descriptor =
|
||||
Array::Handle(zone, ArgumentsDescriptor::New(args.Length(), arg_names));
|
||||
@@ -1321,12 +1285,9 @@ DEFINE_NATIVE_ENTRY(InstanceMirror_invoke, 5) {
|
||||
getter_args.SetAt(0, reflectee);
|
||||
const Array& getter_args_descriptor =
|
||||
Array::Handle(zone, ArgumentsDescriptor::New(getter_args.Length()));
|
||||
const Instance& getter_result = Instance::Handle(zone,
|
||||
InvokeDynamicFunction(reflectee,
|
||||
function,
|
||||
getter_name,
|
||||
getter_args,
|
||||
getter_args_descriptor));
|
||||
const Instance& getter_result = Instance::Handle(
|
||||
zone, InvokeDynamicFunction(reflectee, function, getter_name,
|
||||
getter_args, getter_args_descriptor));
|
||||
// Replace the closure as the receiver in the arguments list.
|
||||
args.SetAt(0, getter_result);
|
||||
// Call the closure.
|
||||
@@ -1341,10 +1302,7 @@ DEFINE_NATIVE_ENTRY(InstanceMirror_invoke, 5) {
|
||||
}
|
||||
|
||||
// Found an ordinary method.
|
||||
return InvokeDynamicFunction(reflectee,
|
||||
function,
|
||||
function_name,
|
||||
args,
|
||||
return InvokeDynamicFunction(reflectee, function, function_name, args,
|
||||
args_descriptor);
|
||||
}
|
||||
|
||||
@@ -1357,17 +1315,17 @@ DEFINE_NATIVE_ENTRY(InstanceMirror_invokeGetter, 3) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(String, getter_name, arguments->NativeArgAt(2));
|
||||
Class& klass = Class::Handle(reflectee.clazz());
|
||||
|
||||
const String& internal_getter_name = String::Handle(
|
||||
Field::GetterName(getter_name));
|
||||
Function& function = Function::Handle(zone,
|
||||
Resolver::ResolveDynamicAnyArgs(zone, klass, internal_getter_name));
|
||||
const String& internal_getter_name =
|
||||
String::Handle(Field::GetterName(getter_name));
|
||||
Function& function = Function::Handle(
|
||||
zone, Resolver::ResolveDynamicAnyArgs(zone, klass, internal_getter_name));
|
||||
|
||||
// Check for method extraction when method extractors are not created.
|
||||
if (function.IsNull() && !FLAG_lazy_dispatchers) {
|
||||
function = Resolver::ResolveDynamicAnyArgs(zone, klass, getter_name);
|
||||
if (!function.IsNull()) {
|
||||
const Function& closure_function =
|
||||
Function::Handle(zone, function.ImplicitClosureFunction());
|
||||
Function::Handle(zone, function.ImplicitClosureFunction());
|
||||
return closure_function.ImplicitInstanceClosure(reflectee);
|
||||
}
|
||||
}
|
||||
@@ -1379,10 +1337,7 @@ DEFINE_NATIVE_ENTRY(InstanceMirror_invokeGetter, 3) {
|
||||
Array::Handle(zone, ArgumentsDescriptor::New(args.Length()));
|
||||
|
||||
// InvokeDynamic invokes NoSuchMethod if the provided function is null.
|
||||
return InvokeDynamicFunction(reflectee,
|
||||
function,
|
||||
internal_getter_name,
|
||||
args,
|
||||
return InvokeDynamicFunction(reflectee, function, internal_getter_name, args,
|
||||
args_descriptor);
|
||||
}
|
||||
|
||||
@@ -1398,8 +1353,8 @@ DEFINE_NATIVE_ENTRY(InstanceMirror_invokeSetter, 4) {
|
||||
const Class& klass = Class::Handle(zone, reflectee.clazz());
|
||||
const String& internal_setter_name =
|
||||
String::Handle(zone, Field::SetterName(setter_name));
|
||||
const Function& setter = Function::Handle(zone,
|
||||
Resolver::ResolveDynamicAnyArgs(zone, klass, internal_setter_name));
|
||||
const Function& setter = Function::Handle(
|
||||
zone, Resolver::ResolveDynamicAnyArgs(zone, klass, internal_setter_name));
|
||||
|
||||
const int kNumArgs = 2;
|
||||
const Array& args = Array::Handle(zone, Array::New(kNumArgs));
|
||||
@@ -1408,10 +1363,7 @@ DEFINE_NATIVE_ENTRY(InstanceMirror_invokeSetter, 4) {
|
||||
const Array& args_descriptor =
|
||||
Array::Handle(zone, ArgumentsDescriptor::New(args.Length()));
|
||||
|
||||
return InvokeDynamicFunction(reflectee,
|
||||
setter,
|
||||
internal_setter_name,
|
||||
args,
|
||||
return InvokeDynamicFunction(reflectee, setter, internal_setter_name, args,
|
||||
args_descriptor);
|
||||
}
|
||||
|
||||
@@ -1449,8 +1401,7 @@ DEFINE_NATIVE_ENTRY(ClosureMirror_function, 1) {
|
||||
instantiator = Type::New(cls, arguments, TokenPosition::kNoSource);
|
||||
instantiator.SetIsFinalized();
|
||||
}
|
||||
return CreateMethodMirror(function,
|
||||
Instance::null_instance(),
|
||||
return CreateMethodMirror(function, Instance::null_instance(),
|
||||
instantiator);
|
||||
}
|
||||
return Instance::null();
|
||||
@@ -1463,8 +1414,8 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invoke, 5) {
|
||||
// with its cousins.
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
|
||||
const Class& klass = Class::Handle(ref.GetClassReferent());
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
String, function_name, arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(String, function_name,
|
||||
arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
|
||||
|
||||
@@ -1474,8 +1425,8 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invoke, 5) {
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
Function& function = Function::Handle(
|
||||
klass.LookupStaticFunction(function_name));
|
||||
Function& function =
|
||||
Function::Handle(klass.LookupStaticFunction(function_name));
|
||||
|
||||
if (function.IsNull()) {
|
||||
// Didn't find a method: try to find a getter and invoke call on its result.
|
||||
@@ -1499,8 +1450,8 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invoke, 5) {
|
||||
call_args.SetAt(i + 1, temp);
|
||||
}
|
||||
call_args.SetAt(0, getter_result);
|
||||
const Array& call_args_descriptor_array =
|
||||
Array::Handle(ArgumentsDescriptor::New(call_args.Length(), arg_names));
|
||||
const Array& call_args_descriptor_array = Array::Handle(
|
||||
ArgumentsDescriptor::New(call_args.Length(), arg_names));
|
||||
// Call the closure.
|
||||
const Object& call_result = Object::Handle(
|
||||
DartEntry::InvokeClosure(call_args, call_args_descriptor_array));
|
||||
@@ -1517,15 +1468,10 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invoke, 5) {
|
||||
|
||||
ArgumentsDescriptor args_descriptor(args_descriptor_array);
|
||||
|
||||
if (function.IsNull() ||
|
||||
!function.AreValidArguments(args_descriptor, NULL) ||
|
||||
if (function.IsNull() || !function.AreValidArguments(args_descriptor, NULL) ||
|
||||
!function.is_reflectable()) {
|
||||
ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
|
||||
function_name,
|
||||
function,
|
||||
args,
|
||||
arg_names,
|
||||
InvocationMirror::kStatic,
|
||||
ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()), function_name,
|
||||
function, args, arg_names, InvocationMirror::kStatic,
|
||||
InvocationMirror::kMethod);
|
||||
UNREACHABLE();
|
||||
}
|
||||
@@ -1572,11 +1518,10 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invokeSetter, 4) {
|
||||
}
|
||||
|
||||
// Check for real fields and user-defined setters.
|
||||
const Field& field =
|
||||
Field::Handle(klass.LookupStaticField(setter_name));
|
||||
const Field& field = Field::Handle(klass.LookupStaticField(setter_name));
|
||||
Function& setter = Function::Handle();
|
||||
const String& internal_setter_name = String::Handle(
|
||||
Field::SetterName(setter_name));
|
||||
const String& internal_setter_name =
|
||||
String::Handle(Field::SetterName(setter_name));
|
||||
|
||||
if (field.IsNull()) {
|
||||
setter = klass.LookupStaticFunction(internal_setter_name);
|
||||
@@ -1587,18 +1532,14 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invokeSetter, 4) {
|
||||
|
||||
if (setter.IsNull() || !setter.is_reflectable()) {
|
||||
ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
|
||||
internal_setter_name,
|
||||
setter,
|
||||
args,
|
||||
Object::null_array(),
|
||||
InvocationMirror::kStatic,
|
||||
internal_setter_name, setter, args,
|
||||
Object::null_array(), InvocationMirror::kStatic,
|
||||
InvocationMirror::kSetter);
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
// Invoke the setter and return the result.
|
||||
Object& result = Object::Handle(
|
||||
DartEntry::InvokeFunction(setter, args));
|
||||
Object& result = Object::Handle(DartEntry::InvokeFunction(setter, args));
|
||||
if (result.IsError()) {
|
||||
Exceptions::PropagateError(Error::Cast(result));
|
||||
UNREACHABLE();
|
||||
@@ -1612,12 +1553,8 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invokeSetter, 4) {
|
||||
args.SetAt(0, value);
|
||||
|
||||
ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
|
||||
internal_setter_name,
|
||||
setter,
|
||||
args,
|
||||
Object::null_array(),
|
||||
InvocationMirror::kStatic,
|
||||
InvocationMirror::kSetter);
|
||||
internal_setter_name, setter, args, Object::null_array(),
|
||||
InvocationMirror::kStatic, InvocationMirror::kSetter);
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
@@ -1630,8 +1567,8 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invokeConstructor, 5) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(0));
|
||||
const Class& klass = Class::Handle(ref.GetClassReferent());
|
||||
GET_NATIVE_ARGUMENT(Type, type, arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
String, constructor_name, arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(String, constructor_name,
|
||||
arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Array, explicit_args, arguments->NativeArgAt(3));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
|
||||
|
||||
@@ -1655,18 +1592,15 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invokeConstructor, 5) {
|
||||
external_constructor_name = internal_constructor_name.raw();
|
||||
}
|
||||
|
||||
Function& lookup_constructor = Function::Handle(
|
||||
klass.LookupFunction(internal_constructor_name));
|
||||
Function& lookup_constructor =
|
||||
Function::Handle(klass.LookupFunction(internal_constructor_name));
|
||||
|
||||
if (lookup_constructor.IsNull() ||
|
||||
(lookup_constructor.kind() != RawFunction::kConstructor) ||
|
||||
!lookup_constructor.is_reflectable()) {
|
||||
ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
|
||||
external_constructor_name,
|
||||
lookup_constructor,
|
||||
explicit_args,
|
||||
arg_names,
|
||||
InvocationMirror::kConstructor,
|
||||
external_constructor_name, lookup_constructor,
|
||||
explicit_args, arg_names, InvocationMirror::kConstructor,
|
||||
InvocationMirror::kMethod);
|
||||
UNREACHABLE();
|
||||
}
|
||||
@@ -1730,19 +1664,15 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invokeConstructor, 5) {
|
||||
}
|
||||
|
||||
const Array& args_descriptor_array =
|
||||
Array::Handle(ArgumentsDescriptor::New(args.Length(),
|
||||
arg_names));
|
||||
Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
|
||||
|
||||
ArgumentsDescriptor args_descriptor(args_descriptor_array);
|
||||
if (!redirected_constructor.AreValidArguments(args_descriptor, NULL) ||
|
||||
!redirected_constructor.is_reflectable()) {
|
||||
external_constructor_name = redirected_constructor.name();
|
||||
ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
|
||||
external_constructor_name,
|
||||
redirected_constructor,
|
||||
explicit_args,
|
||||
arg_names,
|
||||
InvocationMirror::kConstructor,
|
||||
external_constructor_name, redirected_constructor,
|
||||
explicit_args, arg_names, InvocationMirror::kConstructor,
|
||||
InvocationMirror::kMethod);
|
||||
UNREACHABLE();
|
||||
}
|
||||
@@ -1766,10 +1696,8 @@ DEFINE_NATIVE_ENTRY(ClassMirror_invokeConstructor, 5) {
|
||||
}
|
||||
|
||||
// Invoke the constructor and return the new object.
|
||||
const Object& result =
|
||||
Object::Handle(DartEntry::InvokeFunction(redirected_constructor,
|
||||
args,
|
||||
args_descriptor_array));
|
||||
const Object& result = Object::Handle(DartEntry::InvokeFunction(
|
||||
redirected_constructor, args, args_descriptor_array));
|
||||
if (result.IsError()) {
|
||||
Exceptions::PropagateError(Error::Cast(result));
|
||||
UNREACHABLE();
|
||||
@@ -1792,13 +1720,13 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_invoke, 5) {
|
||||
// with its cousins.
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(MirrorReference, ref, arguments->NativeArgAt(1));
|
||||
const Library& library = Library::Handle(ref.GetLibraryReferent());
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
String, function_name, arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(String, function_name,
|
||||
arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(3));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
|
||||
|
||||
Function& function = Function::Handle(
|
||||
library.LookupLocalFunction(function_name));
|
||||
Function& function =
|
||||
Function::Handle(library.LookupLocalFunction(function_name));
|
||||
|
||||
if (function.IsNull()) {
|
||||
// Didn't find a method: try to find a getter and invoke call on its result.
|
||||
@@ -1831,15 +1759,10 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_invoke, 5) {
|
||||
Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
|
||||
ArgumentsDescriptor args_descriptor(args_descriptor_array);
|
||||
|
||||
if (function.IsNull() ||
|
||||
!function.AreValidArguments(args_descriptor, NULL) ||
|
||||
if (function.IsNull() || !function.AreValidArguments(args_descriptor, NULL) ||
|
||||
!function.is_reflectable()) {
|
||||
ThrowNoSuchMethod(Instance::null_instance(),
|
||||
function_name,
|
||||
function,
|
||||
args,
|
||||
arg_names,
|
||||
InvocationMirror::kTopLevel,
|
||||
ThrowNoSuchMethod(Instance::null_instance(), function_name, function, args,
|
||||
arg_names, InvocationMirror::kTopLevel,
|
||||
InvocationMirror::kMethod);
|
||||
UNREACHABLE();
|
||||
}
|
||||
@@ -1877,8 +1800,7 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 4) {
|
||||
// To access a top-level we may need to use the Field or the
|
||||
// setter Function. The setter function may either be in the
|
||||
// library or in the field's owner class, depending.
|
||||
const Field& field = Field::Handle(
|
||||
library.LookupLocalField(setter_name));
|
||||
const Field& field = Field::Handle(library.LookupLocalField(setter_name));
|
||||
Function& setter = Function::Handle();
|
||||
const String& internal_setter_name =
|
||||
String::Handle(Field::SetterName(setter_name));
|
||||
@@ -1891,19 +1813,15 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 4) {
|
||||
args.SetAt(0, value);
|
||||
|
||||
if (setter.IsNull() || !setter.is_reflectable()) {
|
||||
ThrowNoSuchMethod(Instance::null_instance(),
|
||||
internal_setter_name,
|
||||
setter,
|
||||
args,
|
||||
Object::null_array(),
|
||||
InvocationMirror::kTopLevel,
|
||||
ThrowNoSuchMethod(Instance::null_instance(), internal_setter_name, setter,
|
||||
args, Object::null_array(), InvocationMirror::kTopLevel,
|
||||
InvocationMirror::kSetter);
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
// Invoke the setter and return the result.
|
||||
const Object& result = Object::Handle(
|
||||
DartEntry::InvokeFunction(setter, args));
|
||||
const Object& result =
|
||||
Object::Handle(DartEntry::InvokeFunction(setter, args));
|
||||
if (result.IsError()) {
|
||||
Exceptions::PropagateError(Error::Cast(result));
|
||||
UNREACHABLE();
|
||||
@@ -1916,12 +1834,8 @@ DEFINE_NATIVE_ENTRY(LibraryMirror_invokeSetter, 4) {
|
||||
const Array& args = Array::Handle(Array::New(kNumArgs));
|
||||
args.SetAt(0, value);
|
||||
|
||||
ThrowNoSuchMethod(Instance::null_instance(),
|
||||
internal_setter_name,
|
||||
setter,
|
||||
args,
|
||||
Object::null_array(),
|
||||
InvocationMirror::kTopLevel,
|
||||
ThrowNoSuchMethod(Instance::null_instance(), internal_setter_name, setter,
|
||||
args, Object::null_array(), InvocationMirror::kTopLevel,
|
||||
InvocationMirror::kSetter);
|
||||
UNREACHABLE();
|
||||
}
|
||||
@@ -1936,8 +1850,8 @@ DEFINE_NATIVE_ENTRY(MethodMirror_owner, 2) {
|
||||
GET_NATIVE_ARGUMENT(AbstractType, instantiator, arguments->NativeArgAt(1));
|
||||
const Function& func = Function::Handle(ref.GetFunctionReferent());
|
||||
if (func.IsNonImplicitClosureFunction()) {
|
||||
return CreateMethodMirror(Function::Handle(
|
||||
func.parent_function()), Object::null_instance(), instantiator);
|
||||
return CreateMethodMirror(Function::Handle(func.parent_function()),
|
||||
Object::null_instance(), instantiator);
|
||||
}
|
||||
const Class& owner = Class::Handle(func.Owner());
|
||||
if (owner.IsTopLevel()) {
|
||||
@@ -2012,10 +1926,8 @@ DEFINE_NATIVE_ENTRY(DeclarationMirror_location, 1) {
|
||||
} else if (decl.IsClass()) {
|
||||
const Class& cls = Class::Cast(decl);
|
||||
const bool is_typedef = cls.IsTypedefClass();
|
||||
if (cls.is_synthesized_class() &&
|
||||
!is_typedef &&
|
||||
!cls.is_mixin_app_alias() &&
|
||||
!cls.is_enum_class()) {
|
||||
if (cls.is_synthesized_class() && !is_typedef &&
|
||||
!cls.is_mixin_app_alias() && !cls.is_enum_class()) {
|
||||
return Instance::null(); // Synthetic.
|
||||
}
|
||||
script = cls.script();
|
||||
|
||||
+13
-13
@@ -11,22 +11,22 @@ namespace dart {
|
||||
|
||||
class Mirrors : public AllStatic {
|
||||
public:
|
||||
#define MIRRORS_KIND_SHIFT_LIST(V) \
|
||||
V(kAbstract) \
|
||||
V(kGetter) \
|
||||
V(kSetter) \
|
||||
V(kConstructor) \
|
||||
V(kConstCtor) \
|
||||
V(kGenerativeCtor) \
|
||||
V(kRedirectingCtor) \
|
||||
V(kFactoryCtor) \
|
||||
V(kExternal) \
|
||||
#define MIRRORS_KIND_SHIFT_LIST(V) \
|
||||
V(kAbstract) \
|
||||
V(kGetter) \
|
||||
V(kSetter) \
|
||||
V(kConstructor) \
|
||||
V(kConstCtor) \
|
||||
V(kGenerativeCtor) \
|
||||
V(kRedirectingCtor) \
|
||||
V(kFactoryCtor) \
|
||||
V(kExternal)
|
||||
|
||||
// These offsets much be kept in sync with those in mirrors_impl.dart.
|
||||
enum KindShifts {
|
||||
#define DEFINE_KIND_SHIFT_ENUM(name) name,
|
||||
MIRRORS_KIND_SHIFT_LIST(DEFINE_KIND_SHIFT_ENUM)
|
||||
#undef DEFINE_KIND_SHIFT_ENUM
|
||||
#define DEFINE_KIND_SHIFT_ENUM(name) name,
|
||||
MIRRORS_KIND_SHIFT_LIST(DEFINE_KIND_SHIFT_ENUM)
|
||||
#undef DEFINE_KIND_SHIFT_ENUM
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
+25
-28
@@ -73,8 +73,8 @@ DEFINE_NATIVE_ENTRY(Object_noSuchMethod, 6) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(String, member_name, arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, invocation_type, arguments->NativeArgAt(3));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, func_args, arguments->NativeArgAt(4));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
Instance, func_named_args, arguments->NativeArgAt(5));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, func_named_args,
|
||||
arguments->NativeArgAt(5));
|
||||
const Array& dart_arguments = Array::Handle(Array::New(6));
|
||||
dart_arguments.SetAt(0, instance);
|
||||
dart_arguments.SetAt(1, member_name);
|
||||
@@ -176,9 +176,8 @@ DEFINE_NATIVE_ENTRY(Object_instanceOf, 4) {
|
||||
ASSERT(!type.IsMalformed());
|
||||
ASSERT(!type.IsMalbounded());
|
||||
Error& bound_error = Error::Handle(zone, Error::null());
|
||||
const bool is_instance_of = instance.IsInstanceOf(type,
|
||||
instantiator_type_arguments,
|
||||
&bound_error);
|
||||
const bool is_instance_of =
|
||||
instance.IsInstanceOf(type, instantiator_type_arguments, &bound_error);
|
||||
if (FLAG_trace_type_checks) {
|
||||
const char* result_str = is_instance_of ? "true" : "false";
|
||||
OS::Print("Native Object.instanceOf: result %s\n", result_str);
|
||||
@@ -198,11 +197,11 @@ DEFINE_NATIVE_ENTRY(Object_instanceOf, 4) {
|
||||
StackFrame* caller_frame = iterator.NextFrame();
|
||||
ASSERT(caller_frame != NULL);
|
||||
const TokenPosition location = caller_frame->GetTokenPos();
|
||||
String& bound_error_message = String::Handle(
|
||||
zone, String::New(bound_error.ToErrorCString()));
|
||||
Exceptions::CreateAndThrowTypeError(
|
||||
location, AbstractType::Handle(zone), AbstractType::Handle(zone),
|
||||
Symbols::Empty(), bound_error_message);
|
||||
String& bound_error_message =
|
||||
String::Handle(zone, String::New(bound_error.ToErrorCString()));
|
||||
Exceptions::CreateAndThrowTypeError(location, AbstractType::Handle(zone),
|
||||
AbstractType::Handle(zone),
|
||||
Symbols::Empty(), bound_error_message);
|
||||
UNREACHABLE();
|
||||
}
|
||||
return Bool::Get(negate.value() ? !is_instance_of : is_instance_of).raw();
|
||||
@@ -221,20 +220,19 @@ DEFINE_NATIVE_ENTRY(Object_simpleInstanceOf, 2) {
|
||||
ASSERT(!type.IsMalformed());
|
||||
ASSERT(!type.IsMalbounded());
|
||||
Error& bound_error = Error::Handle(zone, Error::null());
|
||||
const bool is_instance_of = instance.IsInstanceOf(type,
|
||||
instantiator_type_arguments,
|
||||
&bound_error);
|
||||
const bool is_instance_of =
|
||||
instance.IsInstanceOf(type, instantiator_type_arguments, &bound_error);
|
||||
if (!is_instance_of && !bound_error.IsNull()) {
|
||||
// Throw a dynamic type error only if the instanceof test fails.
|
||||
DartFrameIterator iterator;
|
||||
StackFrame* caller_frame = iterator.NextFrame();
|
||||
ASSERT(caller_frame != NULL);
|
||||
const TokenPosition location = caller_frame->GetTokenPos();
|
||||
String& bound_error_message = String::Handle(
|
||||
zone, String::New(bound_error.ToErrorCString()));
|
||||
Exceptions::CreateAndThrowTypeError(
|
||||
location, AbstractType::Handle(zone), AbstractType::Handle(zone),
|
||||
Symbols::Empty(), bound_error_message);
|
||||
String& bound_error_message =
|
||||
String::Handle(zone, String::New(bound_error.ToErrorCString()));
|
||||
Exceptions::CreateAndThrowTypeError(location, AbstractType::Handle(zone),
|
||||
AbstractType::Handle(zone),
|
||||
Symbols::Empty(), bound_error_message);
|
||||
UNREACHABLE();
|
||||
}
|
||||
return Bool::Get(is_instance_of).raw();
|
||||
@@ -314,9 +312,8 @@ DEFINE_NATIVE_ENTRY(Object_as, 3) {
|
||||
if (instance.IsNull()) {
|
||||
return instance.raw();
|
||||
}
|
||||
const bool is_instance_of = instance.IsInstanceOf(type,
|
||||
instantiator_type_arguments,
|
||||
&bound_error);
|
||||
const bool is_instance_of =
|
||||
instance.IsInstanceOf(type, instantiator_type_arguments, &bound_error);
|
||||
if (FLAG_trace_type_checks) {
|
||||
const char* result_str = is_instance_of ? "true" : "false";
|
||||
OS::Print("Object.as: result %s\n", result_str);
|
||||
@@ -339,21 +336,21 @@ DEFINE_NATIVE_ENTRY(Object_as, 3) {
|
||||
AbstractType::Handle(zone, instance.GetType());
|
||||
if (!type.IsInstantiated()) {
|
||||
// Instantiate type before reporting the error.
|
||||
type = type.InstantiateFrom(instantiator_type_arguments, NULL,
|
||||
NULL, NULL, Heap::kNew);
|
||||
type = type.InstantiateFrom(instantiator_type_arguments, NULL, NULL, NULL,
|
||||
Heap::kNew);
|
||||
// Note that the instantiated type may be malformed.
|
||||
}
|
||||
if (bound_error.IsNull()) {
|
||||
Exceptions::CreateAndThrowTypeError(
|
||||
location, instance_type, type,
|
||||
Symbols::InTypeCast(), Object::null_string());
|
||||
Exceptions::CreateAndThrowTypeError(location, instance_type, type,
|
||||
Symbols::InTypeCast(),
|
||||
Object::null_string());
|
||||
} else {
|
||||
ASSERT(isolate->type_checks());
|
||||
const String& bound_error_message =
|
||||
String::Handle(zone, String::New(bound_error.ToErrorCString()));
|
||||
Exceptions::CreateAndThrowTypeError(
|
||||
location, instance_type, AbstractType::Handle(zone),
|
||||
Symbols::Empty(), bound_error_message);
|
||||
location, instance_type, AbstractType::Handle(zone), Symbols::Empty(),
|
||||
bound_error_message);
|
||||
}
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
@@ -20,10 +20,10 @@ DECLARE_FLAG(bool, trace_irregexp);
|
||||
DEFINE_NATIVE_ENTRY(RegExp_factory, 4) {
|
||||
ASSERT(TypeArguments::CheckedHandle(arguments->NativeArgAt(0)).IsNull());
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(String, pattern, arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
Instance, handle_multi_line, arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
Instance, handle_case_sensitive, arguments->NativeArgAt(3));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, handle_multi_line,
|
||||
arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, handle_case_sensitive,
|
||||
arguments->NativeArgAt(3));
|
||||
bool ignore_case = handle_case_sensitive.raw() != Bool::True().raw();
|
||||
bool multi_line = handle_multi_line.raw() == Bool::True().raw();
|
||||
|
||||
@@ -36,10 +36,7 @@ DEFINE_NATIVE_ENTRY(RegExp_factory, 4) {
|
||||
}
|
||||
|
||||
// Create a RegExp object containing only the initial parameters.
|
||||
return RegExpEngine::CreateRegExp(thread,
|
||||
pattern,
|
||||
multi_line,
|
||||
ignore_case);
|
||||
return RegExpEngine::CreateRegExp(thread, pattern, multi_line, ignore_case);
|
||||
}
|
||||
|
||||
|
||||
|
||||
+15
-24
@@ -13,8 +13,8 @@ namespace dart {
|
||||
|
||||
static void ThrowMaskRangeException(int64_t m) {
|
||||
if ((m < 0) || (m > 255)) {
|
||||
Exceptions::ThrowRangeError(
|
||||
"mask", Integer::Handle(Integer::New(m)), 0, 255);
|
||||
Exceptions::ThrowRangeError("mask", Integer::Handle(Integer::New(m)), 0,
|
||||
255);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,8 +95,7 @@ DEFINE_NATIVE_ENTRY(Float32x4_sub, 2) {
|
||||
|
||||
DEFINE_NATIVE_ENTRY(Float32x4_mul, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other,
|
||||
arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
|
||||
float _x = self.x() * other.x();
|
||||
float _y = self.y() * other.y();
|
||||
float _z = self.z() * other.z();
|
||||
@@ -277,7 +276,7 @@ DEFINE_NATIVE_ENTRY(Float32x4_shuffle, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(1));
|
||||
int64_t m = mask.AsInt64Value();
|
||||
ThrowMaskRangeException(m);
|
||||
float data[4] = { self.x(), self.y(), self.z(), self.w() };
|
||||
float data[4] = {self.x(), self.y(), self.z(), self.w()};
|
||||
float _x = data[m & 0x3];
|
||||
float _y = data[(m >> 2) & 0x3];
|
||||
float _z = data[(m >> 4) & 0x3];
|
||||
@@ -292,8 +291,8 @@ DEFINE_NATIVE_ENTRY(Float32x4_shuffleMix, 3) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(2));
|
||||
int64_t m = mask.AsInt64Value();
|
||||
ThrowMaskRangeException(m);
|
||||
float data[4] = { self.x(), self.y(), self.z(), self.w() };
|
||||
float other_data[4] = { other.x(), other.y(), other.z(), other.w() };
|
||||
float data[4] = {self.x(), self.y(), self.z(), self.w()};
|
||||
float other_data[4] = {other.x(), other.y(), other.z(), other.w()};
|
||||
float _x = data[m & 0x3];
|
||||
float _y = data[(m >> 2) & 0x3];
|
||||
float _z = other_data[(m >> 4) & 0x3];
|
||||
@@ -348,8 +347,7 @@ DEFINE_NATIVE_ENTRY(Float32x4_setW, 2) {
|
||||
|
||||
DEFINE_NATIVE_ENTRY(Float32x4_min, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other,
|
||||
arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
|
||||
float _x = self.x() < other.x() ? self.x() : other.x();
|
||||
float _y = self.y() < other.y() ? self.y() : other.y();
|
||||
float _z = self.z() < other.z() ? self.z() : other.z();
|
||||
@@ -360,8 +358,7 @@ DEFINE_NATIVE_ENTRY(Float32x4_min, 2) {
|
||||
|
||||
DEFINE_NATIVE_ENTRY(Float32x4_max, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, self, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other,
|
||||
arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float32x4, other, arguments->NativeArgAt(1));
|
||||
float _x = self.x() > other.x() ? self.x() : other.x();
|
||||
float _y = self.y() > other.y() ? self.y() : other.y();
|
||||
float _z = self.z() > other.z() ? self.z() : other.z();
|
||||
@@ -522,7 +519,7 @@ DEFINE_NATIVE_ENTRY(Int32x4_shuffle, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(1));
|
||||
int64_t m = mask.AsInt64Value();
|
||||
ThrowMaskRangeException(m);
|
||||
int32_t data[4] = { self.x(), self.y(), self.z(), self.w() };
|
||||
int32_t data[4] = {self.x(), self.y(), self.z(), self.w()};
|
||||
int32_t _x = data[m & 0x3];
|
||||
int32_t _y = data[(m >> 2) & 0x3];
|
||||
int32_t _z = data[(m >> 4) & 0x3];
|
||||
@@ -537,8 +534,8 @@ DEFINE_NATIVE_ENTRY(Int32x4_shuffleMix, 3) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Integer, mask, arguments->NativeArgAt(2));
|
||||
int64_t m = mask.AsInt64Value();
|
||||
ThrowMaskRangeException(m);
|
||||
int32_t data[4] = { self.x(), self.y(), self.z(), self.w() };
|
||||
int32_t zw_data[4] = { zw.x(), zw.y(), zw.z(), zw.w() };
|
||||
int32_t data[4] = {self.x(), self.y(), self.z(), self.w()};
|
||||
int32_t zw_data[4] = {zw.x(), zw.y(), zw.z(), zw.w()};
|
||||
int32_t _x = data[m & 0x3];
|
||||
int32_t _y = data[(m >> 2) & 0x3];
|
||||
int32_t _z = zw_data[(m >> 4) & 0x3];
|
||||
@@ -672,12 +669,8 @@ DEFINE_NATIVE_ENTRY(Int32x4_setFlagW, 2) {
|
||||
union float32_int32 {
|
||||
float f;
|
||||
int32_t u;
|
||||
float32_int32(float v) {
|
||||
f = v;
|
||||
}
|
||||
float32_int32(int32_t v) {
|
||||
u = v;
|
||||
}
|
||||
float32_int32(float v) { f = v; }
|
||||
float32_int32(int32_t v) { u = v; }
|
||||
};
|
||||
|
||||
|
||||
@@ -854,8 +847,7 @@ DEFINE_NATIVE_ENTRY(Float64x2_setY, 2) {
|
||||
|
||||
DEFINE_NATIVE_ENTRY(Float64x2_min, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other,
|
||||
arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
|
||||
double _x = self.x() < other.x() ? self.x() : other.x();
|
||||
double _y = self.y() < other.y() ? self.y() : other.y();
|
||||
return Float64x2::New(_x, _y);
|
||||
@@ -864,8 +856,7 @@ DEFINE_NATIVE_ENTRY(Float64x2_min, 2) {
|
||||
|
||||
DEFINE_NATIVE_ENTRY(Float64x2_max, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, self, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other,
|
||||
arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Float64x2, other, arguments->NativeArgAt(1));
|
||||
double _x = self.x() > other.x() ? self.x() : other.x();
|
||||
double _y = self.y() > other.y() ? self.y() : other.y();
|
||||
return Float64x2::New(_x, _y);
|
||||
|
||||
@@ -46,8 +46,8 @@ const Stacktrace& GetCurrentStacktrace(int skip_frames) {
|
||||
const Array& code_array = Array::Handle(Array::MakeArray(code_list));
|
||||
const Array& pc_offset_array =
|
||||
Array::Handle(Array::MakeArray(pc_offset_list));
|
||||
const Stacktrace& stacktrace = Stacktrace::Handle(
|
||||
Stacktrace::New(code_array, pc_offset_array));
|
||||
const Stacktrace& stacktrace =
|
||||
Stacktrace::Handle(Stacktrace::New(code_array, pc_offset_array));
|
||||
return stacktrace;
|
||||
}
|
||||
|
||||
|
||||
+43
-53
@@ -91,8 +91,8 @@ DEFINE_NATIVE_ENTRY(StringBase_createFromCodePoints, 3) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(StringBase_substringUnchecked, 3) {
|
||||
const String& receiver = String::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
const String& receiver =
|
||||
String::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, start_obj, arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, end_obj, arguments->NativeArgAt(2));
|
||||
|
||||
@@ -102,10 +102,10 @@ DEFINE_NATIVE_ENTRY(StringBase_substringUnchecked, 3) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Return the bitwise-or of all characters in the slice from start to end.
|
||||
static uint16_t CharacterLimit(const String& string,
|
||||
intptr_t start, intptr_t end) {
|
||||
intptr_t start,
|
||||
intptr_t end) {
|
||||
ASSERT(string.IsTwoByteString() || string.IsExternalTwoByteString());
|
||||
// Maybe do loop unrolling, and handle two uint16_t in a single uint32_t
|
||||
// operation.
|
||||
@@ -164,10 +164,9 @@ static bool CheckSlicesOneByte(const String& base,
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(StringBase_joinReplaceAllResult, 4) {
|
||||
const String& base = String::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(GrowableObjectArray,
|
||||
matches_growable, arguments->NativeArgAt(1));
|
||||
const String& base = String::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(GrowableObjectArray, matches_growable,
|
||||
arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, length_obj, arguments->NativeArgAt(2));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Bool, is_onebyte_obj, arguments->NativeArgAt(3));
|
||||
|
||||
@@ -219,12 +218,9 @@ DEFINE_NATIVE_ENTRY(StringBase_joinReplaceAllResult, 4) {
|
||||
}
|
||||
}
|
||||
if (slice_length > 0) {
|
||||
if (0 <= slice_start &&
|
||||
slice_start + slice_length <= base_length &&
|
||||
if (0 <= slice_start && slice_start + slice_length <= base_length &&
|
||||
write_index + slice_length <= length) {
|
||||
String::Copy(result, write_index,
|
||||
base, slice_start,
|
||||
slice_length);
|
||||
String::Copy(result, write_index, base, slice_start, slice_length);
|
||||
write_index += slice_length;
|
||||
continue;
|
||||
}
|
||||
@@ -253,8 +249,8 @@ DEFINE_NATIVE_ENTRY(StringBase_joinReplaceAllResult, 4) {
|
||||
}
|
||||
|
||||
DEFINE_NATIVE_ENTRY(OneByteString_substringUnchecked, 3) {
|
||||
const String& receiver = String::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
const String& receiver =
|
||||
String::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
ASSERT(receiver.IsOneByteString());
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, start_obj, arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, end_obj, arguments->NativeArgAt(2));
|
||||
@@ -267,31 +263,26 @@ DEFINE_NATIVE_ENTRY(OneByteString_substringUnchecked, 3) {
|
||||
|
||||
// This is high-performance code.
|
||||
DEFINE_NATIVE_ENTRY(OneByteString_splitWithCharCode, 2) {
|
||||
const String& receiver = String::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
const String& receiver =
|
||||
String::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
ASSERT(receiver.IsOneByteString());
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, smi_split_code, arguments->NativeArgAt(1));
|
||||
const intptr_t len = receiver.Length();
|
||||
const intptr_t split_code = smi_split_code.Value();
|
||||
const GrowableObjectArray& result = GrowableObjectArray::Handle(
|
||||
zone,
|
||||
GrowableObjectArray::New(16, Heap::kNew));
|
||||
zone, GrowableObjectArray::New(16, Heap::kNew));
|
||||
String& str = String::Handle(zone);
|
||||
intptr_t start = 0;
|
||||
intptr_t i = 0;
|
||||
for (; i < len; i++) {
|
||||
if (split_code == OneByteString::CharAt(receiver, i)) {
|
||||
str = OneByteString::SubStringUnchecked(receiver,
|
||||
start,
|
||||
(i - start),
|
||||
str = OneByteString::SubStringUnchecked(receiver, start, (i - start),
|
||||
Heap::kNew);
|
||||
result.Add(str);
|
||||
start = i + 1;
|
||||
}
|
||||
}
|
||||
str = OneByteString::SubStringUnchecked(receiver,
|
||||
start,
|
||||
(i - start),
|
||||
str = OneByteString::SubStringUnchecked(receiver, start, (i - start),
|
||||
Heap::kNew);
|
||||
result.Add(str);
|
||||
return result.raw();
|
||||
@@ -305,8 +296,7 @@ DEFINE_NATIVE_ENTRY(OneByteString_allocate, 1) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(OneByteString_allocateFromOneByteList, 3) {
|
||||
Instance& list = Instance::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
Instance& list = Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, start_obj, arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, end_obj, arguments->NativeArgAt(2));
|
||||
|
||||
@@ -409,8 +399,7 @@ DEFINE_NATIVE_ENTRY(ExternalOneByteString_getCid, 0) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(TwoByteString_allocateFromTwoByteList, 3) {
|
||||
Instance& list = Instance::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
Instance& list = Instance::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, start_obj, arguments->NativeArgAt(1));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, end_obj, arguments->NativeArgAt(2));
|
||||
|
||||
@@ -451,8 +440,8 @@ DEFINE_NATIVE_ENTRY(TwoByteString_allocateFromTwoByteList, 3) {
|
||||
if (end > Smi::Value(TypedDataView::Length(list))) {
|
||||
Exceptions::ThrowArgumentError(end_obj);
|
||||
}
|
||||
const Instance& data_obj = Instance::Handle(zone,
|
||||
TypedDataView::Data(list));
|
||||
const Instance& data_obj =
|
||||
Instance::Handle(zone, TypedDataView::Data(list));
|
||||
intptr_t data_offset = Smi::Value(TypedDataView::OffsetInBytes(list));
|
||||
if (data_obj.IsTypedData()) {
|
||||
const TypedData& array = TypedData::Cast(data_obj);
|
||||
@@ -468,8 +457,8 @@ DEFINE_NATIVE_ENTRY(TwoByteString_allocateFromTwoByteList, 3) {
|
||||
if (end > array.Length()) {
|
||||
Exceptions::ThrowArgumentError(end_obj);
|
||||
}
|
||||
const String& string = String::Handle(zone,
|
||||
TwoByteString::New(length, space));
|
||||
const String& string =
|
||||
String::Handle(zone, TwoByteString::New(length, space));
|
||||
for (int i = 0; i < length; i++) {
|
||||
intptr_t value =
|
||||
Smi::Value(reinterpret_cast<RawSmi*>(array.At(start + i)));
|
||||
@@ -481,8 +470,8 @@ DEFINE_NATIVE_ENTRY(TwoByteString_allocateFromTwoByteList, 3) {
|
||||
if (end > array.Length()) {
|
||||
Exceptions::ThrowArgumentError(end_obj);
|
||||
}
|
||||
const String& string = String::Handle(zone,
|
||||
TwoByteString::New(length, space));
|
||||
const String& string =
|
||||
String::Handle(zone, TwoByteString::New(length, space));
|
||||
for (int i = 0; i < length; i++) {
|
||||
intptr_t value =
|
||||
Smi::Value(reinterpret_cast<RawSmi*>(array.At(start + i)));
|
||||
@@ -496,8 +485,8 @@ DEFINE_NATIVE_ENTRY(TwoByteString_allocateFromTwoByteList, 3) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(String_getHashCode, 1) {
|
||||
const String& receiver = String::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
const String& receiver =
|
||||
String::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
intptr_t hash_val = receiver.Hash();
|
||||
ASSERT(hash_val > 0);
|
||||
ASSERT(Smi::IsValid(hash_val));
|
||||
@@ -506,8 +495,8 @@ DEFINE_NATIVE_ENTRY(String_getHashCode, 1) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(String_getLength, 1) {
|
||||
const String& receiver = String::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
const String& receiver =
|
||||
String::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
return Smi::New(receiver.Length());
|
||||
}
|
||||
|
||||
@@ -527,8 +516,8 @@ static uint16_t StringValueAt(const String& str, const Integer& index) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(String_charAt, 2) {
|
||||
const String& receiver = String::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
const String& receiver =
|
||||
String::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1));
|
||||
uint16_t value = StringValueAt(receiver, index);
|
||||
return Symbols::FromCharCode(thread, static_cast<int32_t>(value));
|
||||
@@ -537,8 +526,8 @@ DEFINE_NATIVE_ENTRY(String_charAt, 2) {
|
||||
|
||||
// Returns the 16-bit UTF-16 code unit at the given index.
|
||||
DEFINE_NATIVE_ENTRY(String_codeUnitAt, 2) {
|
||||
const String& receiver = String::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
const String& receiver =
|
||||
String::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1));
|
||||
uint16_t value = StringValueAt(receiver, index);
|
||||
return Smi::New(static_cast<intptr_t>(value));
|
||||
@@ -546,24 +535,24 @@ DEFINE_NATIVE_ENTRY(String_codeUnitAt, 2) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(String_concat, 2) {
|
||||
const String& receiver = String::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
const String& receiver =
|
||||
String::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(String, b, arguments->NativeArgAt(1));
|
||||
return String::Concat(receiver, b);
|
||||
}
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(String_toLowerCase, 1) {
|
||||
const String& receiver = String::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
const String& receiver =
|
||||
String::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
ASSERT(!receiver.IsNull());
|
||||
return String::ToLowerCase(receiver);
|
||||
}
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(String_toUpperCase, 1) {
|
||||
const String& receiver = String::CheckedHandle(zone,
|
||||
arguments->NativeArgAt(0));
|
||||
const String& receiver =
|
||||
String::CheckedHandle(zone, arguments->NativeArgAt(0));
|
||||
ASSERT(!receiver.IsNull());
|
||||
return String::ToUpperCase(receiver);
|
||||
}
|
||||
@@ -586,7 +575,7 @@ DEFINE_NATIVE_ENTRY(String_concatRange, 3) {
|
||||
} else if (argument.IsGrowableObjectArray()) {
|
||||
const GrowableObjectArray& g_array = GrowableObjectArray::Cast(argument);
|
||||
strings = g_array.data();
|
||||
length = g_array.Length();
|
||||
length = g_array.Length();
|
||||
} else {
|
||||
Exceptions::ThrowArgumentError(argument);
|
||||
}
|
||||
@@ -614,9 +603,10 @@ DEFINE_NATIVE_ENTRY(StringBuffer_createStringFromUint16Array, 3) {
|
||||
if (length_value < 0 || length_value > array_length) {
|
||||
Exceptions::ThrowRangeError("length", length, 0, array_length);
|
||||
}
|
||||
const String& result = isLatin1.value()
|
||||
? String::Handle(OneByteString::New(length_value, Heap::kNew))
|
||||
: String::Handle(TwoByteString::New(length_value, Heap::kNew));
|
||||
const String& result =
|
||||
isLatin1.value()
|
||||
? String::Handle(OneByteString::New(length_value, Heap::kNew))
|
||||
: String::Handle(TwoByteString::New(length_value, Heap::kNew));
|
||||
NoSafepointScope no_safepoint;
|
||||
|
||||
uint16_t* data_position = reinterpret_cast<uint16_t*>(codeUnits.DataAddr(0));
|
||||
|
||||
+30
-50
@@ -85,32 +85,26 @@ DEFINE_NATIVE_ENTRY(Timeline_reportTaskEvent, 6) {
|
||||
// Convert phase to a C string and perform a sanity check.
|
||||
const char* phase_string = phase.ToCString();
|
||||
ASSERT(phase_string != NULL);
|
||||
ASSERT((phase_string[0] == 'n') ||
|
||||
(phase_string[0] == 'b') ||
|
||||
ASSERT((phase_string[0] == 'n') || (phase_string[0] == 'b') ||
|
||||
(phase_string[0] == 'e'));
|
||||
ASSERT(phase_string[1] == '\0');
|
||||
char* json = OS::SCreate(zone,
|
||||
"{\"name\":\"%s\",\"cat\":\"%s\",\"tid\":%" Pd64 ",\"pid\":%" Pd64 ","
|
||||
"\"ts\":%" Pd64 ",\"ph\":\"%s\",\"id\":%" Pd64 ", \"args\":%s}",
|
||||
name.ToCString(),
|
||||
category.ToCString(),
|
||||
tid,
|
||||
pid,
|
||||
start.AsInt64Value(),
|
||||
phase_string,
|
||||
id.AsInt64Value(),
|
||||
args.ToCString());
|
||||
char* json = OS::SCreate(
|
||||
zone, "{\"name\":\"%s\",\"cat\":\"%s\",\"tid\":%" Pd64 ",\"pid\":%" Pd64
|
||||
","
|
||||
"\"ts\":%" Pd64 ",\"ph\":\"%s\",\"id\":%" Pd64 ", \"args\":%s}",
|
||||
name.ToCString(), category.ToCString(), tid, pid, start.AsInt64Value(),
|
||||
phase_string, id.AsInt64Value(), args.ToCString());
|
||||
|
||||
switch (phase_string[0]) {
|
||||
case 'n':
|
||||
event->AsyncInstant("", id.AsInt64Value(), start.AsInt64Value());
|
||||
break;
|
||||
break;
|
||||
case 'b':
|
||||
event->AsyncBegin("", id.AsInt64Value(), start.AsInt64Value());
|
||||
break;
|
||||
break;
|
||||
case 'e':
|
||||
event->AsyncEnd("", id.AsInt64Value(), start.AsInt64Value());
|
||||
break;
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
@@ -156,36 +150,25 @@ DEFINE_NATIVE_ENTRY(Timeline_reportCompleteEvent, 5) {
|
||||
char* json = NULL;
|
||||
|
||||
if ((start_cpu.AsInt64Value() != -1) && (end_cpu != -1)) {
|
||||
json = OS::SCreate(zone,
|
||||
"{\"name\":\"%s\",\"cat\":\"%s\",\"tid\":%" Pd64 ",\"pid\":%" Pd64 ","
|
||||
"\"ts\":%" Pd64 ",\"ph\":\"X\",\"dur\":%" Pd64 ","
|
||||
"\"tdur\":%" Pd64 ",\"args\":%s}",
|
||||
name.ToCString(),
|
||||
category.ToCString(),
|
||||
tid,
|
||||
pid,
|
||||
start.AsInt64Value(),
|
||||
duration,
|
||||
duration_cpu,
|
||||
args.ToCString());
|
||||
json = OS::SCreate(
|
||||
zone, "{\"name\":\"%s\",\"cat\":\"%s\",\"tid\":%" Pd64 ",\"pid\":%" Pd64
|
||||
","
|
||||
"\"ts\":%" Pd64 ",\"ph\":\"X\",\"dur\":%" Pd64
|
||||
","
|
||||
"\"tdur\":%" Pd64 ",\"args\":%s}",
|
||||
name.ToCString(), category.ToCString(), tid, pid, start.AsInt64Value(),
|
||||
duration, duration_cpu, args.ToCString());
|
||||
} else {
|
||||
json = OS::SCreate(zone,
|
||||
"{\"name\":\"%s\",\"cat\":\"%s\",\"tid\":%" Pd64 ",\"pid\":%" Pd64 ","
|
||||
"\"ts\":%" Pd64 ",\"ph\":\"X\",\"dur\":%" Pd64 ",\"args\":%s}",
|
||||
name.ToCString(),
|
||||
category.ToCString(),
|
||||
tid,
|
||||
pid,
|
||||
start.AsInt64Value(),
|
||||
duration,
|
||||
args.ToCString());
|
||||
json = OS::SCreate(
|
||||
zone, "{\"name\":\"%s\",\"cat\":\"%s\",\"tid\":%" Pd64 ",\"pid\":%" Pd64
|
||||
","
|
||||
"\"ts\":%" Pd64 ",\"ph\":\"X\",\"dur\":%" Pd64 ",\"args\":%s}",
|
||||
name.ToCString(), category.ToCString(), tid, pid, start.AsInt64Value(),
|
||||
duration, args.ToCString());
|
||||
}
|
||||
ASSERT(json != NULL);
|
||||
|
||||
event->Duration("",
|
||||
start.AsInt64Value(),
|
||||
end,
|
||||
start_cpu.AsInt64Value(),
|
||||
event->Duration("", start.AsInt64Value(), end, start_cpu.AsInt64Value(),
|
||||
end_cpu);
|
||||
// json was allocated in the zone and a copy will be stored in event.
|
||||
event->CompleteWithPreSerializedJSON(json);
|
||||
@@ -220,14 +203,11 @@ DEFINE_NATIVE_ENTRY(Timeline_reportInstantEvent, 4) {
|
||||
ASSERT(os_thread != NULL);
|
||||
int64_t tid = OSThread::ThreadIdToIntPtr(os_thread->trace_id());
|
||||
|
||||
char* json = OS::SCreate(zone,
|
||||
"{\"name\":\"%s\",\"cat\":\"%s\",\"tid\":%" Pd64 ",\"pid\":%" Pd64 ","
|
||||
"\"ts\":%" Pd64 ",\"ph\":\"I\",\"args\":%s}",
|
||||
name.ToCString(),
|
||||
category.ToCString(),
|
||||
tid,
|
||||
pid,
|
||||
start.AsInt64Value(),
|
||||
char* json = OS::SCreate(
|
||||
zone, "{\"name\":\"%s\",\"cat\":\"%s\",\"tid\":%" Pd64 ",\"pid\":%" Pd64
|
||||
","
|
||||
"\"ts\":%" Pd64 ",\"ph\":\"I\",\"args\":%s}",
|
||||
name.ToCString(), category.ToCString(), tid, pid, start.AsInt64Value(),
|
||||
args.ToCString());
|
||||
|
||||
event->Instant("", start.AsInt64Value());
|
||||
|
||||
+92
-93
@@ -22,10 +22,9 @@ static void RangeCheck(intptr_t offset_in_bytes,
|
||||
if (!Utils::RangeCheck(offset_in_bytes, access_size, length_in_bytes)) {
|
||||
const intptr_t index =
|
||||
(offset_in_bytes + access_size) / element_size_in_bytes;
|
||||
const intptr_t length =
|
||||
length_in_bytes / element_size_in_bytes;
|
||||
Exceptions::ThrowRangeError(
|
||||
"index", Integer::Handle(Integer::New(index)), 0, length);
|
||||
const intptr_t length = length_in_bytes / element_size_in_bytes;
|
||||
Exceptions::ThrowRangeError("index", Integer::Handle(Integer::New(index)),
|
||||
0, length);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,8 +33,7 @@ static void RangeCheck(intptr_t offset_in_bytes,
|
||||
static void LengthCheck(intptr_t len, intptr_t max) {
|
||||
if (len < 0 || len > max) {
|
||||
const String& error = String::Handle(String::NewFormatted(
|
||||
"Length (%" Pd ") of object must be in range [0..%" Pd "]",
|
||||
len, max));
|
||||
"Length (%" Pd ") of object must be in range [0..%" Pd "]", len, max));
|
||||
Exceptions::ThrowArgumentError(error);
|
||||
}
|
||||
}
|
||||
@@ -44,8 +42,8 @@ static void LengthCheck(intptr_t len, intptr_t max) {
|
||||
DEFINE_NATIVE_ENTRY(TypedData_length, 1) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0));
|
||||
if (instance.IsTypedData()) {
|
||||
const TypedData& array = TypedData::Cast(instance);
|
||||
return Smi::New(array.Length());
|
||||
const TypedData& array = TypedData::Cast(instance);
|
||||
return Smi::New(array.Length());
|
||||
}
|
||||
if (instance.IsExternalTypedData()) {
|
||||
const ExternalTypedData& array = ExternalTypedData::Cast(instance);
|
||||
@@ -59,8 +57,10 @@ DEFINE_NATIVE_ENTRY(TypedData_length, 1) {
|
||||
|
||||
|
||||
template <typename DstType, typename SrcType>
|
||||
static RawBool* CopyData(const Instance& dst, const Instance& src,
|
||||
const Smi& dst_start, const Smi& src_start,
|
||||
static RawBool* CopyData(const Instance& dst,
|
||||
const Instance& src,
|
||||
const Smi& dst_start,
|
||||
const Smi& src_start,
|
||||
const Smi& length,
|
||||
bool clamped) {
|
||||
const DstType& dst_array = DstType::Cast(dst);
|
||||
@@ -68,18 +68,17 @@ static RawBool* CopyData(const Instance& dst, const Instance& src,
|
||||
const intptr_t dst_offset_in_bytes = dst_start.Value();
|
||||
const intptr_t src_offset_in_bytes = src_start.Value();
|
||||
const intptr_t length_in_bytes = length.Value();
|
||||
ASSERT(Utils::RangeCheck(
|
||||
src_offset_in_bytes, length_in_bytes, src_array.LengthInBytes()));
|
||||
ASSERT(Utils::RangeCheck(
|
||||
dst_offset_in_bytes, length_in_bytes, dst_array.LengthInBytes()));
|
||||
ASSERT(Utils::RangeCheck(src_offset_in_bytes, length_in_bytes,
|
||||
src_array.LengthInBytes()));
|
||||
ASSERT(Utils::RangeCheck(dst_offset_in_bytes, length_in_bytes,
|
||||
dst_array.LengthInBytes()));
|
||||
if (clamped) {
|
||||
TypedData::ClampedCopy<DstType, SrcType>(dst_array, dst_offset_in_bytes,
|
||||
src_array, src_offset_in_bytes,
|
||||
length_in_bytes);
|
||||
} else {
|
||||
TypedData::Copy<DstType, SrcType>(dst_array, dst_offset_in_bytes,
|
||||
src_array, src_offset_in_bytes,
|
||||
length_in_bytes);
|
||||
TypedData::Copy<DstType, SrcType>(dst_array, dst_offset_in_bytes, src_array,
|
||||
src_offset_in_bytes, length_in_bytes);
|
||||
}
|
||||
return Bool::True().raw();
|
||||
}
|
||||
@@ -132,8 +131,8 @@ DEFINE_NATIVE_ENTRY(TypedData_setRange, 7) {
|
||||
const bool needs_clamping = IsClamped(to_cid) && !IsUint8(from_cid);
|
||||
if (dst.IsTypedData()) {
|
||||
if (src.IsTypedData()) {
|
||||
return CopyData<TypedData, TypedData>(
|
||||
dst, src, dst_start, src_start, length, needs_clamping);
|
||||
return CopyData<TypedData, TypedData>(dst, src, dst_start, src_start,
|
||||
length, needs_clamping);
|
||||
} else if (src.IsExternalTypedData()) {
|
||||
return CopyData<TypedData, ExternalTypedData>(
|
||||
dst, src, dst_start, src_start, length, needs_clamping);
|
||||
@@ -158,83 +157,79 @@ DEFINE_NATIVE_ENTRY(TypedData_setRange, 7) {
|
||||
// on whether the underlying architecture is 32-bit or 64-bit.
|
||||
// Argument 0 is type arguments and is ignored.
|
||||
#define TYPED_DATA_NEW(name) \
|
||||
DEFINE_NATIVE_ENTRY(TypedData_##name##_new, 2) { \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(1)); \
|
||||
intptr_t cid = kTypedData##name##Cid; \
|
||||
intptr_t len = length.Value(); \
|
||||
intptr_t max = TypedData::MaxElements(cid); \
|
||||
LengthCheck(len, max); \
|
||||
return TypedData::New(cid, len); \
|
||||
} \
|
||||
DEFINE_NATIVE_ENTRY(TypedData_##name##_new, 2) { \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, length, arguments->NativeArgAt(1)); \
|
||||
intptr_t cid = kTypedData##name##Cid; \
|
||||
intptr_t len = length.Value(); \
|
||||
intptr_t max = TypedData::MaxElements(cid); \
|
||||
LengthCheck(len, max); \
|
||||
return TypedData::New(cid, len); \
|
||||
}
|
||||
|
||||
|
||||
#define TYPED_DATA_NEW_NATIVE(name) \
|
||||
TYPED_DATA_NEW(name) \
|
||||
#define TYPED_DATA_NEW_NATIVE(name) TYPED_DATA_NEW(name)
|
||||
|
||||
|
||||
CLASS_LIST_TYPED_DATA(TYPED_DATA_NEW_NATIVE)
|
||||
|
||||
#define TYPED_DATA_GETTER(getter, object, ctor, access_size) \
|
||||
DEFINE_NATIVE_ENTRY(TypedData_##getter, 2) { \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, arguments->NativeArgAt(1)); \
|
||||
if (instance.IsTypedData()) { \
|
||||
const TypedData& array = TypedData::Cast(instance); \
|
||||
RangeCheck(offsetInBytes.Value(), access_size, \
|
||||
array.LengthInBytes(), access_size); \
|
||||
return object::ctor(array.getter(offsetInBytes.Value())); \
|
||||
} \
|
||||
if (instance.IsExternalTypedData()) { \
|
||||
const ExternalTypedData& array = ExternalTypedData::Cast(instance); \
|
||||
RangeCheck(offsetInBytes.Value(), access_size, \
|
||||
array.LengthInBytes(), access_size); \
|
||||
return object::ctor(array.getter(offsetInBytes.Value())); \
|
||||
} \
|
||||
const String& error = String::Handle(String::NewFormatted( \
|
||||
"Expected a TypedData object but found %s", instance.ToCString())); \
|
||||
Exceptions::ThrowArgumentError(error); \
|
||||
return object::null(); \
|
||||
} \
|
||||
|
||||
|
||||
#define TYPED_DATA_SETTER(setter, \
|
||||
object, \
|
||||
get_object_value, \
|
||||
access_size, \
|
||||
access_type) \
|
||||
DEFINE_NATIVE_ENTRY(TypedData_##setter, 3) { \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, arguments->NativeArgAt(0)); \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, arguments->NativeArgAt(1)); \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(object, value, arguments->NativeArgAt(2)); \
|
||||
if (instance.IsTypedData()) { \
|
||||
const TypedData& array = TypedData::Cast(instance); \
|
||||
RangeCheck(offsetInBytes.Value(), access_size, \
|
||||
array.LengthInBytes(), access_size); \
|
||||
array.setter(offsetInBytes.Value(), \
|
||||
static_cast<access_type>(value.get_object_value())); \
|
||||
} else if (instance.IsExternalTypedData()) { \
|
||||
const ExternalTypedData& array = ExternalTypedData::Cast(instance); \
|
||||
RangeCheck(offsetInBytes.Value(), access_size, \
|
||||
array.LengthInBytes(), access_size); \
|
||||
array.setter(offsetInBytes.Value(), \
|
||||
static_cast<access_type>(value.get_object_value())); \
|
||||
} else { \
|
||||
DEFINE_NATIVE_ENTRY(TypedData_##getter, 2) { \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, \
|
||||
arguments->NativeArgAt(0)); \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, \
|
||||
arguments->NativeArgAt(1)); \
|
||||
if (instance.IsTypedData()) { \
|
||||
const TypedData& array = TypedData::Cast(instance); \
|
||||
RangeCheck(offsetInBytes.Value(), access_size, array.LengthInBytes(), \
|
||||
access_size); \
|
||||
return object::ctor(array.getter(offsetInBytes.Value())); \
|
||||
} \
|
||||
if (instance.IsExternalTypedData()) { \
|
||||
const ExternalTypedData& array = ExternalTypedData::Cast(instance); \
|
||||
RangeCheck(offsetInBytes.Value(), access_size, array.LengthInBytes(), \
|
||||
access_size); \
|
||||
return object::ctor(array.getter(offsetInBytes.Value())); \
|
||||
} \
|
||||
const String& error = String::Handle(String::NewFormatted( \
|
||||
"Expected a TypedData object but found %s", instance.ToCString())); \
|
||||
Exceptions::ThrowArgumentError(error); \
|
||||
} \
|
||||
return Object::null(); \
|
||||
}
|
||||
return object::null(); \
|
||||
}
|
||||
|
||||
#define TYPED_DATA_NATIVES(type_name, \
|
||||
object, \
|
||||
ctor, \
|
||||
get_object_value, \
|
||||
access_size, \
|
||||
access_type) \
|
||||
|
||||
#define TYPED_DATA_SETTER(setter, object, get_object_value, access_size, \
|
||||
access_type) \
|
||||
DEFINE_NATIVE_ENTRY(TypedData_##setter, 3) { \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, instance, \
|
||||
arguments->NativeArgAt(0)); \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Smi, offsetInBytes, \
|
||||
arguments->NativeArgAt(1)); \
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(object, value, arguments->NativeArgAt(2)); \
|
||||
if (instance.IsTypedData()) { \
|
||||
const TypedData& array = TypedData::Cast(instance); \
|
||||
RangeCheck(offsetInBytes.Value(), access_size, array.LengthInBytes(), \
|
||||
access_size); \
|
||||
array.setter(offsetInBytes.Value(), \
|
||||
static_cast<access_type>(value.get_object_value())); \
|
||||
} else if (instance.IsExternalTypedData()) { \
|
||||
const ExternalTypedData& array = ExternalTypedData::Cast(instance); \
|
||||
RangeCheck(offsetInBytes.Value(), access_size, array.LengthInBytes(), \
|
||||
access_size); \
|
||||
array.setter(offsetInBytes.Value(), \
|
||||
static_cast<access_type>(value.get_object_value())); \
|
||||
} else { \
|
||||
const String& error = String::Handle(String::NewFormatted( \
|
||||
"Expected a TypedData object but found %s", instance.ToCString())); \
|
||||
Exceptions::ThrowArgumentError(error); \
|
||||
} \
|
||||
return Object::null(); \
|
||||
}
|
||||
|
||||
#define TYPED_DATA_NATIVES(type_name, object, ctor, get_object_value, \
|
||||
access_size, access_type) \
|
||||
TYPED_DATA_GETTER(Get##type_name, object, ctor, access_size) \
|
||||
TYPED_DATA_SETTER(Set##type_name, object, \
|
||||
get_object_value, access_size, access_type) \
|
||||
TYPED_DATA_SETTER(Set##type_name, object, get_object_value, access_size, \
|
||||
access_type)
|
||||
|
||||
TYPED_DATA_NATIVES(Int8, Integer, New, AsTruncatedUint32Value, 1, int8_t)
|
||||
TYPED_DATA_NATIVES(Uint8, Integer, New, AsTruncatedUint32Value, 1, uint8_t)
|
||||
@@ -243,11 +238,15 @@ TYPED_DATA_NATIVES(Uint16, Integer, New, AsTruncatedUint32Value, 2, uint16_t)
|
||||
TYPED_DATA_NATIVES(Int32, Integer, New, AsTruncatedUint32Value, 4, int32_t)
|
||||
TYPED_DATA_NATIVES(Uint32, Integer, New, AsTruncatedUint32Value, 4, uint32_t)
|
||||
TYPED_DATA_NATIVES(Int64, Integer, New, AsTruncatedInt64Value, 8, int64_t)
|
||||
TYPED_DATA_NATIVES(
|
||||
Uint64, Integer, NewFromUint64, AsTruncatedInt64Value, 8, uint64_t)
|
||||
TYPED_DATA_NATIVES(Uint64,
|
||||
Integer,
|
||||
NewFromUint64,
|
||||
AsTruncatedInt64Value,
|
||||
8,
|
||||
uint64_t)
|
||||
TYPED_DATA_NATIVES(Float32, Double, New, value, 4, float)
|
||||
TYPED_DATA_NATIVES(Float64, Double, New, value, 8, double)
|
||||
TYPED_DATA_NATIVES(Float32x4, Float32x4, New, value, 16, simd128_value_t)
|
||||
TYPED_DATA_NATIVES(Float32x4, Float32x4, New, value, 16, simd128_value_t)
|
||||
TYPED_DATA_NATIVES(Int32x4, Int32x4, New, value, 16, simd128_value_t)
|
||||
TYPED_DATA_NATIVES(Float64x2, Float64x2, New, value, 16, simd128_value_t)
|
||||
|
||||
@@ -344,11 +343,11 @@ DEFINE_NATIVE_ENTRY(ByteData_ToEndianFloat32, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Bool, little_endian, arguments->NativeArgAt(1));
|
||||
float value = host_value.value();
|
||||
if (little_endian.value()) {
|
||||
value = bit_cast<float>(
|
||||
Utils::HostToLittleEndian32(bit_cast<uint32_t>(value)));
|
||||
value =
|
||||
bit_cast<float>(Utils::HostToLittleEndian32(bit_cast<uint32_t>(value)));
|
||||
} else {
|
||||
value = bit_cast<float>(
|
||||
Utils::HostToBigEndian32(bit_cast<uint32_t>(value)));
|
||||
value =
|
||||
bit_cast<float>(Utils::HostToBigEndian32(bit_cast<uint32_t>(value)));
|
||||
}
|
||||
return Double::New(value);
|
||||
}
|
||||
@@ -362,8 +361,8 @@ DEFINE_NATIVE_ENTRY(ByteData_ToEndianFloat64, 2) {
|
||||
value = bit_cast<double>(
|
||||
Utils::HostToLittleEndian64(bit_cast<uint64_t>(value)));
|
||||
} else {
|
||||
value = bit_cast<double>(
|
||||
Utils::HostToBigEndian64(bit_cast<uint64_t>(value)));
|
||||
value =
|
||||
bit_cast<double>(Utils::HostToBigEndian64(bit_cast<uint64_t>(value)));
|
||||
}
|
||||
return Double::New(value);
|
||||
}
|
||||
|
||||
+18
-33
@@ -68,12 +68,11 @@ class RegisterRunningIsolatesVisitor : public IsolateVisitor {
|
||||
args.SetAt(0, port_int);
|
||||
args.SetAt(1, send_port);
|
||||
args.SetAt(2, name);
|
||||
const Object& r = Object::Handle(
|
||||
DartEntry::InvokeFunction(register_function_, args));
|
||||
const Object& r =
|
||||
Object::Handle(DartEntry::InvokeFunction(register_function_, args));
|
||||
if (FLAG_trace_service) {
|
||||
OS::Print("vm-service: Isolate %s %" Pd64 " registered.\n",
|
||||
name.ToCString(),
|
||||
port_id);
|
||||
name.ToCString(), port_id);
|
||||
}
|
||||
ASSERT(!r.IsError());
|
||||
}
|
||||
@@ -92,8 +91,8 @@ DEFINE_NATIVE_ENTRY(VMService_SendIsolateServiceMessage, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Array, message, arguments->NativeArgAt(1));
|
||||
|
||||
// Set the type of the OOB message.
|
||||
message.SetAt(0, Smi::Handle(thread->zone(),
|
||||
Smi::New(Message::kServiceOOBMsg)));
|
||||
message.SetAt(0,
|
||||
Smi::Handle(thread->zone(), Smi::New(Message::kServiceOOBMsg)));
|
||||
|
||||
// Serialize message.
|
||||
uint8_t* data = NULL;
|
||||
@@ -102,8 +101,7 @@ DEFINE_NATIVE_ENTRY(VMService_SendIsolateServiceMessage, 2) {
|
||||
|
||||
// TODO(turnidge): Throw an exception when the return value is false?
|
||||
bool result = PortMap::PostMessage(
|
||||
new Message(sp.Id(), data, writer.BytesWritten(),
|
||||
Message::kOOBPriority));
|
||||
new Message(sp.Id(), data, writer.BytesWritten(), Message::kOOBPriority));
|
||||
return Bool::Get(result).raw();
|
||||
}
|
||||
|
||||
@@ -223,21 +221,13 @@ class TarArchive {
|
||||
}
|
||||
}
|
||||
|
||||
char* NextFilename() {
|
||||
return filenames_.RemoveLast();
|
||||
}
|
||||
char* NextFilename() { return filenames_.RemoveLast(); }
|
||||
|
||||
uint8_t* NextContent() {
|
||||
return contents_.RemoveLast();
|
||||
}
|
||||
uint8_t* NextContent() { return contents_.RemoveLast(); }
|
||||
|
||||
intptr_t NextContentLength() {
|
||||
return content_lengths_.RemoveLast();
|
||||
}
|
||||
intptr_t NextContentLength() { return content_lengths_.RemoveLast(); }
|
||||
|
||||
bool HasMore() const {
|
||||
return filenames_.length() > 0;
|
||||
}
|
||||
bool HasMore() const { return filenames_.length() > 0; }
|
||||
|
||||
intptr_t Length() const { return filenames_.length(); }
|
||||
|
||||
@@ -266,9 +256,7 @@ class TarArchive {
|
||||
kTarXglType = 'g',
|
||||
};
|
||||
|
||||
bool HasNext() const {
|
||||
return !EndOfArchive();
|
||||
}
|
||||
bool HasNext() const { return !EndOfArchive(); }
|
||||
|
||||
bool Next(char** filename, uint8_t** data, intptr_t* data_length) {
|
||||
intptr_t startOfBlock = rs_.Position();
|
||||
@@ -404,8 +392,8 @@ DEFINE_NATIVE_ENTRY(VMService_DecodeAssets, 1) {
|
||||
Dart_TypedData_Type typ;
|
||||
void* bytes;
|
||||
intptr_t length;
|
||||
Dart_Handle err = Dart_TypedDataAcquireData(
|
||||
data_handle, &typ, &bytes, &length);
|
||||
Dart_Handle err =
|
||||
Dart_TypedDataAcquireData(data_handle, &typ, &bytes, &length);
|
||||
ASSERT(!Dart_IsError(err));
|
||||
|
||||
TarArchive archive(reinterpret_cast<uint8_t*>(bytes), length);
|
||||
@@ -426,17 +414,15 @@ DEFINE_NATIVE_ENTRY(VMService_DecodeAssets, 1) {
|
||||
intptr_t contents_length = archive.NextContentLength();
|
||||
|
||||
Dart_Handle dart_filename = Dart_NewExternalLatin1String(
|
||||
reinterpret_cast<uint8_t*>(filename),
|
||||
strlen(filename),
|
||||
filename,
|
||||
reinterpret_cast<uint8_t*>(filename), strlen(filename), filename,
|
||||
FilenameFinalizer);
|
||||
ASSERT(!Dart_IsError(dart_filename));
|
||||
|
||||
Dart_Handle dart_contents = Dart_NewExternalTypedData(
|
||||
Dart_TypedData_kUint8, contents, contents_length);
|
||||
ASSERT(!Dart_IsError(dart_contents));
|
||||
Dart_NewWeakPersistentHandle(
|
||||
dart_contents, contents, contents_length, ContentsFinalizer);
|
||||
Dart_NewWeakPersistentHandle(dart_contents, contents, contents_length,
|
||||
ContentsFinalizer);
|
||||
|
||||
Dart_ListSetAt(result_list, idx, dart_filename);
|
||||
Dart_ListSetAt(result_list, (idx + 1), dart_contents);
|
||||
@@ -449,7 +435,6 @@ DEFINE_NATIVE_ENTRY(VMService_DecodeAssets, 1) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(VMService_spawnUriNotify, 2) {
|
||||
#ifndef PRODUCT
|
||||
if (!FLAG_support_service) {
|
||||
@@ -469,8 +454,8 @@ DEFINE_NATIVE_ENTRY(VMService_spawnUriNotify, 2) {
|
||||
// There is no isolate at the control port anymore. Must have
|
||||
// died already.
|
||||
ServiceEvent spawn_event(NULL, ServiceEvent::kIsolateSpawn);
|
||||
const String& error = String::Handle(String::New(
|
||||
"spawned isolate exited before notification completed"));
|
||||
const String& error = String::Handle(
|
||||
String::New("spawned isolate exited before notification completed"));
|
||||
spawn_event.set_spawn_token(&token);
|
||||
spawn_event.set_spawn_error(&error);
|
||||
Service::HandleEvent(&spawn_event);
|
||||
|
||||
@@ -21,22 +21,22 @@ DEFINE_NATIVE_ENTRY(WeakProperty_new, 2) {
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(WeakProperty_getKey, 1) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
WeakProperty, weak_property, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(WeakProperty, weak_property,
|
||||
arguments->NativeArgAt(0));
|
||||
return weak_property.key();
|
||||
}
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(WeakProperty_getValue, 1) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
WeakProperty, weak_property, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(WeakProperty, weak_property,
|
||||
arguments->NativeArgAt(0));
|
||||
return weak_property.value();
|
||||
}
|
||||
|
||||
|
||||
DEFINE_NATIVE_ENTRY(WeakProperty_setValue, 2) {
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(
|
||||
WeakProperty, weak_property, arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(WeakProperty, weak_property,
|
||||
arguments->NativeArgAt(0));
|
||||
GET_NON_NULL_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(1));
|
||||
weak_property.set_value(value);
|
||||
return Object::null();
|
||||
|
||||
Reference in New Issue
Block a user