| OLD | NEW | 
|---|
| 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 5370 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5381       break; | 5381       break; | 
| 5382     case RawFunction::kMethodExtractor: | 5382     case RawFunction::kMethodExtractor: | 
| 5383       return "kMethodExtractor"; | 5383       return "kMethodExtractor"; | 
| 5384       break; | 5384       break; | 
| 5385     case RawFunction::kNoSuchMethodDispatcher: | 5385     case RawFunction::kNoSuchMethodDispatcher: | 
| 5386       return "kNoSuchMethodDispatcher"; | 5386       return "kNoSuchMethodDispatcher"; | 
| 5387       break; | 5387       break; | 
| 5388     case RawFunction::kInvokeFieldDispatcher: | 5388     case RawFunction::kInvokeFieldDispatcher: | 
| 5389       return "kInvokeFieldDispatcher"; | 5389       return "kInvokeFieldDispatcher"; | 
| 5390       break; | 5390       break; | 
|  | 5391     case RawFunction::kIrregexpFunction: | 
|  | 5392       return "kIrregexpFunction"; | 
|  | 5393       break; | 
| 5391     default: | 5394     default: | 
| 5392       UNREACHABLE(); | 5395       UNREACHABLE(); | 
| 5393       return NULL; | 5396       return NULL; | 
| 5394   } | 5397   } | 
| 5395 } | 5398 } | 
| 5396 | 5399 | 
| 5397 | 5400 | 
| 5398 void Function::SetRedirectionType(const Type& type) const { | 5401 void Function::SetRedirectionType(const Type& type) const { | 
| 5399   ASSERT(IsFactory()); | 5402   ASSERT(IsFactory()); | 
| 5400   Object& obj = Object::Handle(raw_ptr()->data_); | 5403   Object& obj = Object::Handle(raw_ptr()->data_); | 
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5466   StorePointer(&raw_ptr()->name_, value.raw()); | 5469   StorePointer(&raw_ptr()->name_, value.raw()); | 
| 5467 } | 5470 } | 
| 5468 | 5471 | 
| 5469 | 5472 | 
| 5470 void Function::set_owner(const Object& value) const { | 5473 void Function::set_owner(const Object& value) const { | 
| 5471   ASSERT(!value.IsNull()); | 5474   ASSERT(!value.IsNull()); | 
| 5472   StorePointer(&raw_ptr()->owner_, value.raw()); | 5475   StorePointer(&raw_ptr()->owner_, value.raw()); | 
| 5473 } | 5476 } | 
| 5474 | 5477 | 
| 5475 | 5478 | 
|  | 5479 RawJSRegExp* Function::regexp() const { | 
|  | 5480   ASSERT(kind() == RawFunction::kIrregexpFunction); | 
|  | 5481   const Object& obj = Object::Handle(raw_ptr()->data_); | 
|  | 5482   return JSRegExp::Cast(obj).raw(); | 
|  | 5483 } | 
|  | 5484 | 
|  | 5485 | 
|  | 5486 void Function::set_regexp(const JSRegExp& value) const { | 
|  | 5487   ASSERT(kind() == RawFunction::kIrregexpFunction); | 
|  | 5488   ASSERT(raw_ptr()->data_ == Object::null()); | 
|  | 5489   set_data(value); | 
|  | 5490 } | 
|  | 5491 | 
|  | 5492 | 
|  | 5493 void Function::set_regexp_cid(intptr_t regexp_cid) const { | 
|  | 5494     ASSERT((regexp_cid == kIllegalCid) || | 
|  | 5495            (kind() == RawFunction::kIrregexpFunction)); | 
|  | 5496     ASSERT((regexp_cid == kIllegalCid) || | 
|  | 5497            RawObject::IsStringClassId(regexp_cid)); | 
|  | 5498     StoreNonPointer(&raw_ptr()->regexp_cid_, regexp_cid); | 
|  | 5499 } | 
|  | 5500 | 
|  | 5501 | 
| 5476 void Function::set_result_type(const AbstractType& value) const { | 5502 void Function::set_result_type(const AbstractType& value) const { | 
| 5477   ASSERT(!value.IsNull()); | 5503   ASSERT(!value.IsNull()); | 
| 5478   StorePointer(&raw_ptr()->result_type_, value.raw()); | 5504   StorePointer(&raw_ptr()->result_type_, value.raw()); | 
| 5479 } | 5505 } | 
| 5480 | 5506 | 
| 5481 | 5507 | 
| 5482 RawAbstractType* Function::ParameterTypeAt(intptr_t index) const { | 5508 RawAbstractType* Function::ParameterTypeAt(intptr_t index) const { | 
| 5483   const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types_); | 5509   const Array& parameter_types = Array::Handle(raw_ptr()->parameter_types_); | 
| 5484   return AbstractType::RawCast(parameter_types.At(index)); | 5510   return AbstractType::RawCast(parameter_types.At(index)); | 
| 5485 } | 5511 } | 
| (...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6146   result.set_is_async_closure(false); | 6172   result.set_is_async_closure(false); | 
| 6147   result.set_always_inline(false); | 6173   result.set_always_inline(false); | 
| 6148   result.set_is_polymorphic_target(false); | 6174   result.set_is_polymorphic_target(false); | 
| 6149   result.set_owner(owner); | 6175   result.set_owner(owner); | 
| 6150   result.set_token_pos(token_pos); | 6176   result.set_token_pos(token_pos); | 
| 6151   result.set_end_token_pos(token_pos); | 6177   result.set_end_token_pos(token_pos); | 
| 6152   result.set_num_fixed_parameters(0); | 6178   result.set_num_fixed_parameters(0); | 
| 6153   result.set_num_optional_parameters(0); | 6179   result.set_num_optional_parameters(0); | 
| 6154   result.set_usage_counter(0); | 6180   result.set_usage_counter(0); | 
| 6155   result.set_deoptimization_counter(0); | 6181   result.set_deoptimization_counter(0); | 
|  | 6182   result.set_regexp_cid(kIllegalCid); | 
| 6156   result.set_optimized_instruction_count(0); | 6183   result.set_optimized_instruction_count(0); | 
| 6157   result.set_optimized_call_site_count(0); | 6184   result.set_optimized_call_site_count(0); | 
| 6158   result.set_is_optimizable(is_native ? false : true); | 6185   result.set_is_optimizable(is_native ? false : true); | 
| 6159   result.set_is_inlinable(true); | 6186   result.set_is_inlinable(true); | 
| 6160   result.set_allows_hoisting_check_class(true); | 6187   result.set_allows_hoisting_check_class(true); | 
| 6161   result.set_allows_bounds_check_generalization(true); | 6188   result.set_allows_bounds_check_generalization(true); | 
| 6162   StubCode* stub_code = Isolate::Current()->stub_code(); | 6189   StubCode* stub_code = Isolate::Current()->stub_code(); | 
| 6163   result.SetInstructions(Code::Handle(stub_code->LazyCompile_entry()->code())); | 6190   result.SetInstructions(Code::Handle(stub_code->LazyCompile_entry()->code())); | 
| 6164   if (kind == RawFunction::kClosureFunction) { | 6191   if (kind == RawFunction::kClosureFunction) { | 
| 6165     const ClosureData& data = ClosureData::Handle(ClosureData::New()); | 6192     const ClosureData& data = ClosureData::Handle(ClosureData::New()); | 
| 6166     result.set_data(data); | 6193     result.set_data(data); | 
| 6167   } | 6194   } | 
| 6168 | 6195 | 
| 6169   return result.raw(); | 6196   return result.raw(); | 
| 6170 } | 6197 } | 
| 6171 | 6198 | 
| 6172 | 6199 | 
| 6173 RawFunction* Function::Clone(const Class& new_owner) const { | 6200 RawFunction* Function::Clone(const Class& new_owner) const { | 
| 6174   ASSERT(!IsConstructor()); | 6201   ASSERT(!IsConstructor()); | 
| 6175   Function& clone = Function::Handle(); | 6202   Function& clone = Function::Handle(); | 
| 6176   clone ^= Object::Clone(*this, Heap::kOld); | 6203   clone ^= Object::Clone(*this, Heap::kOld); | 
| 6177   const Class& origin = Class::Handle(this->origin()); | 6204   const Class& origin = Class::Handle(this->origin()); | 
| 6178   const PatchClass& clone_owner = | 6205   const PatchClass& clone_owner = | 
| 6179       PatchClass::Handle(PatchClass::New(new_owner, origin)); | 6206       PatchClass::Handle(PatchClass::New(new_owner, origin)); | 
| 6180   clone.set_owner(clone_owner); | 6207   clone.set_owner(clone_owner); | 
| 6181   clone.ClearCode(); | 6208   clone.ClearCode(); | 
| 6182   clone.set_usage_counter(0); | 6209   clone.set_usage_counter(0); | 
| 6183   clone.set_deoptimization_counter(0); | 6210   clone.set_deoptimization_counter(0); | 
|  | 6211   clone.set_regexp_cid(kIllegalCid); | 
| 6184   clone.set_optimized_instruction_count(0); | 6212   clone.set_optimized_instruction_count(0); | 
| 6185   clone.set_optimized_call_site_count(0); | 6213   clone.set_optimized_call_site_count(0); | 
| 6186   clone.set_ic_data_array(Array::Handle()); | 6214   clone.set_ic_data_array(Array::Handle()); | 
| 6187   if (new_owner.NumTypeParameters() > 0) { | 6215   if (new_owner.NumTypeParameters() > 0) { | 
| 6188     // Adjust uninstantiated types to refer to type parameters of the new owner. | 6216     // Adjust uninstantiated types to refer to type parameters of the new owner. | 
| 6189     AbstractType& type = AbstractType::Handle(clone.result_type()); | 6217     AbstractType& type = AbstractType::Handle(clone.result_type()); | 
| 6190     type ^= type.CloneUninstantiated(new_owner); | 6218     type ^= type.CloneUninstantiated(new_owner); | 
| 6191     clone.set_result_type(type); | 6219     clone.set_result_type(type); | 
| 6192     const intptr_t num_params = clone.NumParameters(); | 6220     const intptr_t num_params = clone.NumParameters(); | 
| 6193     Array& array = Array::Handle(clone.parameter_types()); | 6221     Array& array = Array::Handle(clone.parameter_types()); | 
| (...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6741       break; | 6769       break; | 
| 6742     case RawFunction::kMethodExtractor: | 6770     case RawFunction::kMethodExtractor: | 
| 6743       kind_str = " method-extractor"; | 6771       kind_str = " method-extractor"; | 
| 6744       break; | 6772       break; | 
| 6745     case RawFunction::kNoSuchMethodDispatcher: | 6773     case RawFunction::kNoSuchMethodDispatcher: | 
| 6746       kind_str = " no-such-method-dispatcher"; | 6774       kind_str = " no-such-method-dispatcher"; | 
| 6747       break; | 6775       break; | 
| 6748     case RawFunction::kInvokeFieldDispatcher: | 6776     case RawFunction::kInvokeFieldDispatcher: | 
| 6749       kind_str = "invoke-field-dispatcher"; | 6777       kind_str = "invoke-field-dispatcher"; | 
| 6750       break; | 6778       break; | 
|  | 6779     case RawFunction::kIrregexpFunction: | 
|  | 6780       kind_str = "irregexp-function"; | 
|  | 6781       break; | 
| 6751     default: | 6782     default: | 
| 6752       UNREACHABLE(); | 6783       UNREACHABLE(); | 
| 6753   } | 6784   } | 
| 6754   const char* kFormat = "Function '%s':%s%s%s%s."; | 6785   const char* kFormat = "Function '%s':%s%s%s%s."; | 
| 6755   const char* function_name = String::Handle(name()).ToCString(); | 6786   const char* function_name = String::Handle(name()).ToCString(); | 
| 6756   intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, | 6787   intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, | 
| 6757                              static_str, abstract_str, kind_str, const_str) + 1; | 6788                              static_str, abstract_str, kind_str, const_str) + 1; | 
| 6758   char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 6789   char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 
| 6759   OS::SNPrint(chars, len, kFormat, function_name, | 6790   OS::SNPrint(chars, len, kFormat, function_name, | 
| 6760               static_str, abstract_str, kind_str, const_str); | 6791               static_str, abstract_str, kind_str, const_str); | 
| (...skipping 13323 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 20084   chars[total_len] = '\0'; | 20115   chars[total_len] = '\0'; | 
| 20085   return chars; | 20116   return chars; | 
| 20086 } | 20117 } | 
| 20087 | 20118 | 
| 20088 | 20119 | 
| 20089 void JSRegExp::set_pattern(const String& pattern) const { | 20120 void JSRegExp::set_pattern(const String& pattern) const { | 
| 20090   StorePointer(&raw_ptr()->pattern_, pattern.raw()); | 20121   StorePointer(&raw_ptr()->pattern_, pattern.raw()); | 
| 20091 } | 20122 } | 
| 20092 | 20123 | 
| 20093 | 20124 | 
|  | 20125 void JSRegExp::set_function(intptr_t cid, const Function& value) const { | 
|  | 20126   StorePointer(FunctionAddr(cid), value.raw()); | 
|  | 20127 } | 
|  | 20128 | 
|  | 20129 | 
| 20094 void JSRegExp::set_num_bracket_expressions(intptr_t value) const { | 20130 void JSRegExp::set_num_bracket_expressions(intptr_t value) const { | 
| 20095   StoreSmi(&raw_ptr()->num_bracket_expressions_, Smi::New(value)); | 20131   StoreSmi(&raw_ptr()->num_bracket_expressions_, Smi::New(value)); | 
| 20096 } | 20132 } | 
| 20097 | 20133 | 
| 20098 | 20134 | 
| 20099 RawJSRegExp* JSRegExp::New(intptr_t len, Heap::Space space) { | 20135 RawJSRegExp* JSRegExp::New(intptr_t len, Heap::Space space) { | 
| 20100   if (len < 0 || len > kMaxElements) { | 20136   if (len < 0 || len > kMaxElements) { | 
| 20101     // This should be caught before we reach here. | 20137     // This should be caught before we reach here. | 
| 20102     FATAL1("Fatal error in JSRegexp::New: invalid len %" Pd "\n", len); | 20138     FATAL1("Fatal error in JSRegexp::New: invalid len %" Pd "\n", len); | 
| 20103   } | 20139   } | 
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 20420   return tag_label.ToCString(); | 20456   return tag_label.ToCString(); | 
| 20421 } | 20457 } | 
| 20422 | 20458 | 
| 20423 | 20459 | 
| 20424 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 20460 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 
| 20425   Instance::PrintJSONImpl(stream, ref); | 20461   Instance::PrintJSONImpl(stream, ref); | 
| 20426 } | 20462 } | 
| 20427 | 20463 | 
| 20428 | 20464 | 
| 20429 }  // namespace dart | 20465 }  // namespace dart | 
| OLD | NEW | 
|---|