Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(814)

Side by Side Diff: runtime/vm/object.cc

Issue 249533003: Support evaluation of expressions in context of a stack frame (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/service.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 2631 matching lines...) Expand 10 before | Expand all | Expand 10 after
2642 } 2642 }
2643 SetFields(new_list); 2643 SetFields(new_list);
2644 2644
2645 // The functions and fields in the patch class are no longer needed. 2645 // The functions and fields in the patch class are no longer needed.
2646 patch.SetFunctions(Object::empty_array()); 2646 patch.SetFunctions(Object::empty_array());
2647 patch.SetFields(Object::empty_array()); 2647 patch.SetFields(Object::empty_array());
2648 return true; 2648 return true;
2649 } 2649 }
2650 2650
2651 2651
2652 static RawString* BuildClosureSource(const Array& formal_params,
2653 const String& expr) {
2654 const GrowableObjectArray& src_pieces =
2655 GrowableObjectArray::Handle(GrowableObjectArray::New());
2656 String& piece = String::Handle();
2657 src_pieces.Add(Symbols::LParen());
2658 // Add formal parameters.
2659 intptr_t num_formals = formal_params.Length();
2660 for (intptr_t i = 0; i < num_formals; i++) {
2661 if (i > 0) {
2662 src_pieces.Add(Symbols::CommaSpace());
2663 }
2664 piece ^= formal_params.At(i);
2665 src_pieces.Add(piece);
2666 }
2667 src_pieces.Add(Symbols::RParenArrow());
2668 src_pieces.Add(expr);
2669 src_pieces.Add(Symbols::Semicolon());
2670 return String::ConcatAll(Array::Handle(Array::MakeArray(src_pieces)));
2671 }
2672
2673
2652 static RawPatchClass* MakeTempPatchClass(const Class& cls, 2674 static RawPatchClass* MakeTempPatchClass(const Class& cls,
2653 const String& expr) { 2675 const String& expr,
2654 String& src = String::Handle(String::New("() => ")); 2676 const Array& formal_params) {
2655 src = String::Concat(src, expr); 2677 const String& func_src =
2656 src = String::Concat(src, Symbols::Semicolon()); 2678 String::Handle(BuildClosureSource(formal_params, expr));
2657 Script& script = Script::Handle(); 2679 Script& script = Script::Handle();
2658 script = Script::New(Symbols::Empty(), src, RawScript::kSourceTag); 2680 script = Script::New(Symbols::Empty(), func_src, RawScript::kSourceTag);
2659 // In order to tokenize the source, we need to get the key to mangle 2681 // In order to tokenize the source, we need to get the key to mangle
2660 // private names from the library from which the object's class 2682 // private names from the library from which the object's class
2661 // originates. 2683 // originates.
2662 const Library& lib = Library::Handle(cls.library()); 2684 const Library& lib = Library::Handle(cls.library());
2663 ASSERT(!lib.IsNull()); 2685 ASSERT(!lib.IsNull());
2664 const String& lib_key = String::Handle(lib.private_key()); 2686 const String& lib_key = String::Handle(lib.private_key());
2665 script.Tokenize(lib_key); 2687 script.Tokenize(lib_key);
2666 2688
2667 const String& src_class_name = String::Handle(Symbols::New(":internal")); 2689 const String& src_class_name = String::Handle(Symbols::New(":internal"));
2668 const Class& src_class = Class::Handle( 2690 const Class& src_class = Class::Handle(
2669 Class::New(src_class_name, script, Scanner::kNoSourcePos)); 2691 Class::New(src_class_name, script, Scanner::kNoSourcePos));
2670 src_class.set_is_finalized(); 2692 src_class.set_is_finalized();
2671 src_class.set_library(lib); 2693 src_class.set_library(lib);
2672 return PatchClass::New(cls, src_class); 2694 return PatchClass::New(cls, src_class);
2673 } 2695 }
2674 2696
2675 2697
2676 RawObject* Class::Evaluate(const String& expr) const { 2698 RawObject* Class::Evaluate(const String& expr,
2699 const Array& param_names,
2700 const Array& param_values) const {
2677 const PatchClass& temp_class = 2701 const PatchClass& temp_class =
2678 PatchClass::Handle(MakeTempPatchClass(*this, expr)); 2702 PatchClass::Handle(MakeTempPatchClass(*this, expr, param_names));
2679 const String& eval_func_name = String::Handle(Symbols::New(":eval")); 2703 const String& eval_func_name = String::Handle(Symbols::New(":eval"));
2680 const Function& eval_func = 2704 const Function& eval_func =
2681 Function::Handle(Function::New(eval_func_name, 2705 Function::Handle(Function::New(eval_func_name,
2682 RawFunction::kRegularFunction, 2706 RawFunction::kRegularFunction,
2683 true, // Static. 2707 true, // Static.
2684 false, // Not const. 2708 false, // Not const.
2685 false, // Not abstract. 2709 false, // Not abstract.
2686 false, // Not external. 2710 false, // Not external.
2687 false, // Not native. 2711 false, // Not native.
2688 temp_class, 2712 temp_class,
2689 0)); 2713 0));
2690 eval_func.set_result_type(Type::Handle(Type::DynamicType())); 2714 eval_func.set_result_type(Type::Handle(Type::DynamicType()));
2691 eval_func.set_num_fixed_parameters(0); 2715 eval_func.set_num_fixed_parameters(param_names.Length());
2692 eval_func.SetNumOptionalParameters(0, true); 2716 eval_func.SetNumOptionalParameters(0, true);
2693 eval_func.SetIsOptimizable(false); 2717 eval_func.SetIsOptimizable(false);
2694 2718
2695 const Array& args = Array::Handle(Array::New(0));
2696 const Object& result = 2719 const Object& result =
2697 Object::Handle(DartEntry::InvokeFunction(eval_func, args)); 2720 Object::Handle(DartEntry::InvokeFunction(eval_func, param_values));
2698 return result.raw(); 2721 return result.raw();
2699 } 2722 }
2700 2723
2701 2724
2702 // Ensure that top level parsing of the class has been done. 2725 // Ensure that top level parsing of the class has been done.
2703 RawError* Class::EnsureIsFinalized(Isolate* isolate) const { 2726 RawError* Class::EnsureIsFinalized(Isolate* isolate) const {
2704 // Finalized classes have already been parsed. 2727 // Finalized classes have already been parsed.
2705 if (is_finalized()) { 2728 if (is_finalized()) {
2706 return Error::null(); 2729 return Error::null();
2707 } 2730 }
(...skipping 6277 matching lines...) Expand 10 before | Expand all | Expand 10 after
8985 isolate->object_store()->set_root_library(Library::Handle()); 9008 isolate->object_store()->set_root_library(Library::Handle());
8986 9009
8987 // Hook up predefined classes without setting their library pointers. These 9010 // Hook up predefined classes without setting their library pointers. These
8988 // classes are coming from the VM isolate, and are shared between multiple 9011 // classes are coming from the VM isolate, and are shared between multiple
8989 // isolates so setting their library pointers would be wrong. 9012 // isolates so setting their library pointers would be wrong.
8990 const Class& cls = Class::Handle(Object::dynamic_class()); 9013 const Class& cls = Class::Handle(Object::dynamic_class());
8991 core_lib.AddObject(cls, String::Handle(cls.Name())); 9014 core_lib.AddObject(cls, String::Handle(cls.Name()));
8992 } 9015 }
8993 9016
8994 9017
8995 RawObject* Library::Evaluate(const String& expr) const { 9018 RawObject* Library::Evaluate(const String& expr,
9019 const Array& param_names,
9020 const Array& param_values) const {
8996 // Make a fake top-level class and evaluate the expression 9021 // Make a fake top-level class and evaluate the expression
8997 // as a static function of the class. 9022 // as a static function of the class.
8998 Script& script = Script::Handle(); 9023 Script& script = Script::Handle();
8999 script = Script::New(Symbols::Empty(), 9024 script = Script::New(Symbols::Empty(),
9000 Symbols::Empty(), 9025 Symbols::Empty(),
9001 RawScript::kSourceTag); 9026 RawScript::kSourceTag);
9002 Class& temp_class = 9027 Class& temp_class =
9003 Class::Handle(Class::New(Symbols::TopLevel(), script, 0)); 9028 Class::Handle(Class::New(Symbols::TopLevel(), script, 0));
9004 temp_class.set_library(*this); 9029 temp_class.set_library(*this);
9005 temp_class.set_is_finalized(); 9030 temp_class.set_is_finalized();
9006 return temp_class.Evaluate(expr); 9031 return temp_class.Evaluate(expr, param_names, param_values);
9007 } 9032 }
9008 9033
9009 9034
9010 void Library::InitNativeWrappersLibrary(Isolate* isolate) { 9035 void Library::InitNativeWrappersLibrary(Isolate* isolate) {
9011 static const int kNumNativeWrappersClasses = 4; 9036 static const int kNumNativeWrappersClasses = 4;
9012 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); 9037 ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10);
9013 const String& native_flds_lib_url = Symbols::DartNativeWrappers(); 9038 const String& native_flds_lib_url = Symbols::DartNativeWrappers();
9014 const Library& native_flds_lib = Library::Handle( 9039 const Library& native_flds_lib = Library::Handle(
9015 Library::NewLibraryHelper(native_flds_lib_url, false)); 9040 Library::NewLibraryHelper(native_flds_lib_url, false));
9016 native_flds_lib.Register(); 9041 native_flds_lib.Register();
(...skipping 3387 matching lines...) Expand 10 before | Expand all | Expand 10 after
12404 12429
12405 void UnwindError::PrintToJSONStream(JSONStream* stream, bool ref) const { 12430 void UnwindError::PrintToJSONStream(JSONStream* stream, bool ref) const {
12406 JSONObject jsobj(stream); 12431 JSONObject jsobj(stream);
12407 jsobj.AddProperty("type", "Error"); 12432 jsobj.AddProperty("type", "Error");
12408 jsobj.AddProperty("id", ""); 12433 jsobj.AddProperty("id", "");
12409 jsobj.AddProperty("kind", JSONType(false)); 12434 jsobj.AddProperty("kind", JSONType(false));
12410 jsobj.AddProperty("message", ToErrorCString()); 12435 jsobj.AddProperty("message", ToErrorCString());
12411 } 12436 }
12412 12437
12413 12438
12414 RawObject* Instance::Evaluate(const String& expr) const { 12439 RawObject* Instance::Evaluate(const String& expr,
12440 const Array& param_names,
12441 const Array& param_values) const {
12415 const Class& cls = Class::Handle(clazz()); 12442 const Class& cls = Class::Handle(clazz());
12416 const PatchClass& temp_class = 12443 const PatchClass& temp_class = PatchClass::Handle(
12417 PatchClass::Handle(MakeTempPatchClass(cls, expr)); 12444 MakeTempPatchClass(cls, expr, param_names));
12418 const String& eval_func_name = String::Handle(Symbols::New(":eval")); 12445 const String& eval_func_name = String::Handle(Symbols::New(":eval"));
12419 const Function& eval_func = 12446 const Function& eval_func =
12420 Function::Handle(Function::New(eval_func_name, 12447 Function::Handle(Function::New(eval_func_name,
12421 RawFunction::kRegularFunction, 12448 RawFunction::kRegularFunction,
12422 false, // Not static. 12449 false, // Not static.
12423 false, // Not const. 12450 false, // Not const.
12424 false, // Not abstract. 12451 false, // Not abstract.
12425 false, // Not external. 12452 false, // Not external.
12426 false, // Not native. 12453 false, // Not native.
12427 temp_class, 12454 temp_class,
12428 0)); 12455 0));
12429 eval_func.set_result_type(Type::Handle(Type::DynamicType())); 12456 eval_func.set_result_type(Type::Handle(Type::DynamicType()));
12430 eval_func.set_num_fixed_parameters(1); 12457 eval_func.set_num_fixed_parameters(1 + param_values.Length());
12431 eval_func.SetNumOptionalParameters(0, true); 12458 eval_func.SetNumOptionalParameters(0, true);
12432 eval_func.SetIsOptimizable(false); 12459 eval_func.SetIsOptimizable(false);
12433 12460
12434 const Array& args = Array::Handle(Array::New(1)); 12461 const Array& args = Array::Handle(Array::New(1 + param_values.Length()));
12462 Object& param = Object::Handle();
12435 args.SetAt(0, *this); 12463 args.SetAt(0, *this);
12464 for (intptr_t i = 0; i < param_values.Length(); i++) {
12465 param = param_values.At(i);
12466 args.SetAt(i + 1, param);
12467 }
12436 const Object& result = 12468 const Object& result =
12437 Object::Handle(DartEntry::InvokeFunction(eval_func, args)); 12469 Object::Handle(DartEntry::InvokeFunction(eval_func, args));
12438 return result.raw(); 12470 return result.raw();
12439 } 12471 }
12440 12472
12441 12473
12442 12474
12443 bool Instance::Equals(const Instance& other) const { 12475 bool Instance::Equals(const Instance& other) const {
12444 if (this->raw() == other.raw()) { 12476 if (this->raw() == other.raw()) {
12445 return true; // "===". 12477 return true; // "===".
(...skipping 6085 matching lines...) Expand 10 before | Expand all | Expand 10 after
18531 return tag_label.ToCString(); 18563 return tag_label.ToCString();
18532 } 18564 }
18533 18565
18534 18566
18535 void UserTag::PrintToJSONStream(JSONStream* stream, bool ref) const { 18567 void UserTag::PrintToJSONStream(JSONStream* stream, bool ref) const {
18536 Instance::PrintToJSONStream(stream, ref); 18568 Instance::PrintToJSONStream(stream, ref);
18537 } 18569 }
18538 18570
18539 18571
18540 } // namespace dart 18572 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698