Chromium Code Reviews| Index: runtime/vm/compiler.cc |
| =================================================================== |
| --- runtime/vm/compiler.cc (revision 26007) |
| +++ runtime/vm/compiler.cc (working copy) |
| @@ -854,7 +854,57 @@ |
| return error.raw(); |
| } |
| +static RawPatchClass* MakeTempPatchClass(const Class& cls, |
| + const String& expr) { |
| + String& src = String::Handle(String::New("() => ")); |
| + src = String::Concat(src, expr); |
| + src = String::Concat(src, Symbols::Semicolon()); |
| + Script& script = Script::Handle(); |
| + script = Script::New(Symbols::Empty(), src, RawScript::kSourceTag); |
| + // In order to tokenize the source, we need to get the key to mangle |
| + // private names from the library from which the object's class |
| + // originates. |
| + const Library& lib = Library::Handle(cls.library()); |
| + ASSERT(!lib.IsNull()); |
| + const String& lib_key = String::Handle(lib.private_key()); |
| + script.Tokenize(lib_key); |
| + const String& src_class_name = String::Handle(Symbols::New(":internal")); |
| + const Class& src_class = Class::Handle( |
| + Class::New(src_class_name, script, Scanner::kDummyTokenIndex)); |
| + src_class.set_is_finalized(); |
| + src_class.set_library(lib); |
| + return PatchClass::New(cls, src_class); |
| +} |
| + |
| + |
| +RawObject* Compiler::Evaluate(const Instance& obj, const String& expr) { |
|
hausner
2013/08/14 23:54:09
Should this functionality be here in class Compile
Ivan Posva
2013/08/19 21:32:18
Could you add Evaluate on the Instance C++ class?
hausner
2013/08/19 22:47:38
Done.
|
| + const Class& obj_cls = Class::Handle(obj.clazz()); |
| + const PatchClass& temp_class = |
| + PatchClass::Handle(MakeTempPatchClass(obj_cls, expr)); |
| + const String& eval_func_name = String::Handle(Symbols::New(":eval")); |
| + const Function& eval_func = |
| + Function::Handle(Function::New(eval_func_name, |
| + RawFunction::kRegularFunction, |
| + false, // Not static. |
| + false, // Not const. |
| + false, // Not abstract. |
| + false, // Not external. |
| + temp_class, |
| + 0)); |
| + eval_func.set_result_type(Type::Handle(Type::DynamicType())); |
| + eval_func.set_num_fixed_parameters(1); |
| + eval_func.SetNumOptionalParameters(0, true); |
| + eval_func.set_is_optimizable(false); |
| + |
| + const Array& args = Array::Handle(Array::New(1)); |
| + args.SetAt(0, obj); |
| + const Object& result = |
| + Object::Handle(DartEntry::InvokeFunction(eval_func, args)); |
| + return result.raw(); |
| +} |
| + |
| + |
| RawObject* Compiler::ExecuteOnce(SequenceNode* fragment) { |
| Isolate* isolate = Isolate::Current(); |
| LongJump* base = isolate->long_jump_base(); |