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

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

Issue 3003583002: [VM, Precompiler] PoC Obfuscator (Closed)
Patch Set: Fix bad refactoring in NewAtomicRename Created 3 years, 4 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
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_store.h » ('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/become.h" 10 #include "vm/become.h"
(...skipping 7435 matching lines...) Expand 10 before | Expand all | Expand 10 after
7446 ICData& ic_data = ICData::Handle(); 7446 ICData& ic_data = ICData::Handle();
7447 for (intptr_t i = 1; i < array.Length(); i++) { 7447 for (intptr_t i = 1; i < array.Length(); i++) {
7448 ic_data ^= array.At(i); 7448 ic_data ^= array.At(i);
7449 if (ic_data.deopt_id() == deopt_id) { 7449 if (ic_data.deopt_id() == deopt_id) {
7450 ic_data.AddDeoptReason(reason); 7450 ic_data.AddDeoptReason(reason);
7451 } 7451 }
7452 } 7452 }
7453 } 7453 }
7454 7454
7455 bool Function::CheckSourceFingerprint(const char* prefix, int32_t fp) const { 7455 bool Function::CheckSourceFingerprint(const char* prefix, int32_t fp) const {
7456 if ((kernel_offset() <= 0) && (SourceFingerprint() != fp)) { 7456 if (!Isolate::Current()->obfuscate() && (kernel_offset() <= 0) &&
7457 (SourceFingerprint() != fp)) {
7457 const bool recalculatingFingerprints = false; 7458 const bool recalculatingFingerprints = false;
7458 if (recalculatingFingerprints) { 7459 if (recalculatingFingerprints) {
7459 // This output can be copied into a file, then used with sed 7460 // This output can be copied into a file, then used with sed
7460 // to replace the old values. 7461 // to replace the old values.
7461 // sed -i.bak -f /tmp/newkeys runtime/vm/method_recognizer.h 7462 // sed -i.bak -f /tmp/newkeys runtime/vm/method_recognizer.h
7462 THR_Print("s/0x%08x/0x%08x/\n", fp, SourceFingerprint()); 7463 THR_Print("s/0x%08x/0x%08x/\n", fp, SourceFingerprint());
7463 } else { 7464 } else {
7464 THR_Print( 7465 THR_Print(
7465 "FP mismatch while recognizing method %s:" 7466 "FP mismatch while recognizing method %s:"
7466 " expecting 0x%08x found 0x%08x\n", 7467 " expecting 0x%08x found 0x%08x\n",
(...skipping 1182 matching lines...) Expand 10 before | Expand all | Expand 10 after
8649 }; 8650 };
8650 typedef UnorderedHashMap<CompressedTokenTraits> CompressedTokenMap; 8651 typedef UnorderedHashMap<CompressedTokenTraits> CompressedTokenMap;
8651 8652
8652 // Helper class for creation of compressed token stream data. 8653 // Helper class for creation of compressed token stream data.
8653 class CompressedTokenStreamData : public Scanner::TokenCollector { 8654 class CompressedTokenStreamData : public Scanner::TokenCollector {
8654 public: 8655 public:
8655 static const intptr_t kInitialBufferSize = 16 * KB; 8656 static const intptr_t kInitialBufferSize = 16 * KB;
8656 static const bool kPrintTokenObjects = false; 8657 static const bool kPrintTokenObjects = false;
8657 8658
8658 CompressedTokenStreamData(const GrowableObjectArray& ta, 8659 CompressedTokenStreamData(const GrowableObjectArray& ta,
8659 CompressedTokenMap* map) 8660 CompressedTokenMap* map,
8661 Obfuscator* obfuscator)
8660 : buffer_(NULL), 8662 : buffer_(NULL),
8661 stream_(&buffer_, Reallocate, kInitialBufferSize), 8663 stream_(&buffer_, Reallocate, kInitialBufferSize),
8662 token_objects_(ta), 8664 token_objects_(ta),
8663 tokens_(map), 8665 tokens_(map),
8666 str_(String::Handle()),
8664 value_(Object::Handle()), 8667 value_(Object::Handle()),
8665 fresh_index_smi_(Smi::Handle()), 8668 fresh_index_smi_(Smi::Handle()),
8666 num_tokens_collected_(0) {} 8669 num_tokens_collected_(0),
8670 obfuscator_(obfuscator) {}
8667 virtual ~CompressedTokenStreamData() {} 8671 virtual ~CompressedTokenStreamData() {}
8668 8672
8669 virtual void AddToken(const Scanner::TokenDescriptor& token) { 8673 virtual void AddToken(const Scanner::TokenDescriptor& token) {
8670 if (token.kind == Token::kIDENT) { // Identifier token. 8674 if (token.kind == Token::kIDENT) { // Identifier token.
8671 AddIdentToken(*token.literal); 8675 AddIdentToken(*token.literal);
8676 } else if (token.kind == Token::kINTERPOL_VAR) {
8677 str_ = token.literal->raw();
8678 str_ = obfuscator_->Rename(str_);
8679
8680 Scanner::TokenDescriptor token_copy = token;
8681 token_copy.literal = &str_;
8682 AddLiteralToken(token_copy);
8672 } else if (Token::NeedsLiteralToken(token.kind)) { // Literal token. 8683 } else if (Token::NeedsLiteralToken(token.kind)) { // Literal token.
8673 AddLiteralToken(token); 8684 AddLiteralToken(token);
8674 } else { // Keyword, pseudo keyword etc. 8685 } else { // Keyword, pseudo keyword etc.
8675 ASSERT(token.kind < Token::kNumTokens); 8686 ASSERT(token.kind < Token::kNumTokens);
8676 AddSimpleToken(token.kind); 8687 AddSimpleToken(token.kind);
8677 } 8688 }
8678 num_tokens_collected_++; 8689 num_tokens_collected_++;
8679 } 8690 }
8680 8691
8681 // Return the compressed token stream. 8692 // Return the compressed token stream.
8682 uint8_t* GetStream() const { return buffer_; } 8693 uint8_t* GetStream() const { return buffer_; }
8683 8694
8684 // Return the compressed token stream length. 8695 // Return the compressed token stream length.
8685 intptr_t Length() const { return stream_.bytes_written(); } 8696 intptr_t Length() const { return stream_.bytes_written(); }
8686 8697
8687 intptr_t NumTokens() const { return num_tokens_collected_; } 8698 intptr_t NumTokens() const { return num_tokens_collected_; }
8688 8699
8689 private: 8700 private:
8690 // Add an IDENT token into the stream and the token hash map. 8701 // Add an IDENT token into the stream and the token hash map.
8691 void AddIdentToken(const String& ident) { 8702 void AddIdentToken(const String& ident) {
8692 ASSERT(ident.IsSymbol()); 8703 ASSERT(ident.IsSymbol());
8693 const intptr_t fresh_index = token_objects_.Length(); 8704 const intptr_t fresh_index = token_objects_.Length();
8705 str_ = ident.raw();
8706 str_ = obfuscator_->Rename(str_);
8694 fresh_index_smi_ = Smi::New(fresh_index); 8707 fresh_index_smi_ = Smi::New(fresh_index);
8695 intptr_t index = Smi::Value( 8708 intptr_t index = Smi::Value(
8696 Smi::RawCast(tokens_->InsertOrGetValue(ident, fresh_index_smi_))); 8709 Smi::RawCast(tokens_->InsertOrGetValue(ident, fresh_index_smi_)));
8697 if (index == fresh_index) { 8710 if (index == fresh_index) {
8698 token_objects_.Add(ident); 8711 token_objects_.Add(str_);
8699 if (kPrintTokenObjects) { 8712 if (kPrintTokenObjects) {
8700 int iid = Isolate::Current()->main_port() % 1024; 8713 int iid = Isolate::Current()->main_port() % 1024;
8701 OS::Print("ident %03x %p <%s>\n", iid, ident.raw(), 8714 OS::Print("%03x ident <%s -> %s>\n", iid, ident.ToCString(),
8702 ident.ToCString()); 8715 str_.ToCString());
8703 } 8716 }
8704 } 8717 }
8705 WriteIndex(index); 8718 WriteIndex(index);
8706 } 8719 }
8707 8720
8708 // Add a LITERAL token into the stream and the token hash map. 8721 // Add a LITERAL token into the stream and the token hash map.
8709 void AddLiteralToken(const Scanner::TokenDescriptor& descriptor) { 8722 void AddLiteralToken(const Scanner::TokenDescriptor& descriptor) {
8710 ASSERT(descriptor.literal->IsSymbol()); 8723 ASSERT(descriptor.literal->IsSymbol());
8711 bool is_present = false; 8724 bool is_present = false;
8712 value_ = tokens_->GetOrNull(descriptor, &is_present); 8725 value_ = tokens_->GetOrNull(descriptor, &is_present);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
8755 intptr_t old_size, 8768 intptr_t old_size,
8756 intptr_t new_size) { 8769 intptr_t new_size) {
8757 void* new_ptr = ::realloc(reinterpret_cast<void*>(ptr), new_size); 8770 void* new_ptr = ::realloc(reinterpret_cast<void*>(ptr), new_size);
8758 return reinterpret_cast<uint8_t*>(new_ptr); 8771 return reinterpret_cast<uint8_t*>(new_ptr);
8759 } 8772 }
8760 8773
8761 uint8_t* buffer_; 8774 uint8_t* buffer_;
8762 WriteStream stream_; 8775 WriteStream stream_;
8763 const GrowableObjectArray& token_objects_; 8776 const GrowableObjectArray& token_objects_;
8764 CompressedTokenMap* tokens_; 8777 CompressedTokenMap* tokens_;
8778 String& str_;
8765 Object& value_; 8779 Object& value_;
8766 Smi& fresh_index_smi_; 8780 Smi& fresh_index_smi_;
8767 intptr_t num_tokens_collected_; 8781 intptr_t num_tokens_collected_;
8782 Obfuscator* obfuscator_;
8768 8783
8769 DISALLOW_COPY_AND_ASSIGN(CompressedTokenStreamData); 8784 DISALLOW_COPY_AND_ASSIGN(CompressedTokenStreamData);
8770 }; 8785 };
8771 8786
8772 RawTokenStream* TokenStream::New(const String& source, 8787 RawTokenStream* TokenStream::New(const String& source,
8773 const String& private_key, 8788 const String& private_key,
8774 bool use_shared_tokens) { 8789 bool use_shared_tokens) {
8775 Thread* thread = Thread::Current(); 8790 Thread* thread = Thread::Current();
8776 Zone* zone = thread->zone(); 8791 Zone* zone = thread->zone();
8777 8792
8778 GrowableObjectArray& token_objects = GrowableObjectArray::Handle(zone); 8793 GrowableObjectArray& token_objects = GrowableObjectArray::Handle(zone);
8779 Array& token_objects_map = Array::Handle(zone); 8794 Array& token_objects_map = Array::Handle(zone);
8780 if (use_shared_tokens) { 8795 if (use_shared_tokens) {
8781 // Use the shared token objects array in the object store. Allocate 8796 // Use the shared token objects array in the object store. Allocate
8782 // a new array if necessary. 8797 // a new array if necessary.
8783 ObjectStore* store = thread->isolate()->object_store(); 8798 ObjectStore* store = thread->isolate()->object_store();
8784 if (store->token_objects() == GrowableObjectArray::null()) { 8799 if (store->token_objects() == GrowableObjectArray::null()) {
8785 OpenSharedTokenList(thread->isolate()); 8800 OpenSharedTokenList(thread->isolate());
8786 } 8801 }
8787 token_objects = store->token_objects(); 8802 token_objects = store->token_objects();
8788 token_objects_map = store->token_objects_map(); 8803 token_objects_map = store->token_objects_map();
8789 } else { 8804 } else {
8790 // Use new, non-shared token array. 8805 // Use new, non-shared token array.
8791 const int kInitialPrivateCapacity = 256; 8806 const int kInitialPrivateCapacity = 256;
8792 token_objects = 8807 token_objects =
8793 GrowableObjectArray::New(kInitialPrivateCapacity, Heap::kOld); 8808 GrowableObjectArray::New(kInitialPrivateCapacity, Heap::kOld);
8794 token_objects_map = HashTables::New<CompressedTokenMap>( 8809 token_objects_map = HashTables::New<CompressedTokenMap>(
8795 kInitialPrivateCapacity, Heap::kOld); 8810 kInitialPrivateCapacity, Heap::kOld);
8796 } 8811 }
8812 Obfuscator obfuscator(thread, private_key);
8797 CompressedTokenMap map(token_objects_map.raw()); 8813 CompressedTokenMap map(token_objects_map.raw());
8798 CompressedTokenStreamData data(token_objects, &map); 8814 CompressedTokenStreamData data(token_objects, &map, &obfuscator);
8799 Scanner scanner(source, private_key); 8815 Scanner scanner(source, private_key);
8800 scanner.ScanAll(&data); 8816 scanner.ScanAll(&data);
8801 INC_STAT(thread, num_tokens_scanned, data.NumTokens()); 8817 INC_STAT(thread, num_tokens_scanned, data.NumTokens());
8802 8818
8803 // Create and setup the token stream object. 8819 // Create and setup the token stream object.
8804 const ExternalTypedData& stream = ExternalTypedData::Handle( 8820 const ExternalTypedData& stream = ExternalTypedData::Handle(
8805 zone, 8821 zone,
8806 ExternalTypedData::New(kExternalTypedDataUint8ArrayCid, data.GetStream(), 8822 ExternalTypedData::New(kExternalTypedDataUint8ArrayCid, data.GetStream(),
8807 data.Length(), Heap::kOld)); 8823 data.Length(), Heap::kOld));
8808 intptr_t external_size = data.Length(); 8824 intptr_t external_size = data.Length();
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
9229 return; 9245 return;
9230 } 9246 }
9231 9247
9232 Thread* thread = Thread::Current(); 9248 Thread* thread = Thread::Current();
9233 Zone* zone = thread->zone(); 9249 Zone* zone = thread->zone();
9234 const TokenStream& tkns = TokenStream::Handle(zone, tokens()); 9250 const TokenStream& tkns = TokenStream::Handle(zone, tokens());
9235 if (!tkns.IsNull()) { 9251 if (!tkns.IsNull()) {
9236 // Already tokenized. 9252 // Already tokenized.
9237 return; 9253 return;
9238 } 9254 }
9255
9239 // Get the source, scan and allocate the token stream. 9256 // Get the source, scan and allocate the token stream.
9240 VMTagScope tagScope(thread, VMTag::kCompileScannerTagId); 9257 VMTagScope tagScope(thread, VMTag::kCompileScannerTagId);
9241 CSTAT_TIMER_SCOPE(thread, scanner_timer); 9258 CSTAT_TIMER_SCOPE(thread, scanner_timer);
9242 const String& src = String::Handle(zone, Source()); 9259 const String& src = String::Handle(zone, Source());
9243 const TokenStream& ts = TokenStream::Handle( 9260 const TokenStream& ts = TokenStream::Handle(
9244 zone, TokenStream::New(src, private_key, use_shared_tokens)); 9261 zone, TokenStream::New(src, private_key, use_shared_tokens));
9245 set_tokens(ts); 9262 set_tokens(ts);
9246 INC_STAT(thread, src_length, src.Length()); 9263 INC_STAT(thread, src_length, src.Length());
9247 } 9264 }
9248 9265
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after
9759 UNREACHABLE(); 9776 UNREACHABLE();
9760 } 9777 }
9761 9778
9762 void Library::set_num_imports(intptr_t value) const { 9779 void Library::set_num_imports(intptr_t value) const {
9763 if (!Utils::IsUint(16, value)) { 9780 if (!Utils::IsUint(16, value)) {
9764 ReportTooManyImports(*this); 9781 ReportTooManyImports(*this);
9765 } 9782 }
9766 StoreNonPointer(&raw_ptr()->num_imports_, value); 9783 StoreNonPointer(&raw_ptr()->num_imports_, value);
9767 } 9784 }
9768 9785
9786 void Library::set_name(const String& name) const {
9787 ASSERT(name.IsSymbol());
9788 StorePointer(&raw_ptr()->name_, name.raw());
9789 }
9790
9791 void Library::set_url(const String& name) const {
9792 StorePointer(&raw_ptr()->url_, name.raw());
9793 }
9794
9769 void Library::SetName(const String& name) const { 9795 void Library::SetName(const String& name) const {
9770 // Only set name once. 9796 // Only set name once.
9771 ASSERT(!Loaded()); 9797 ASSERT(!Loaded());
9772 ASSERT(name.IsSymbol()); 9798 set_name(name);
9773 StorePointer(&raw_ptr()->name_, name.raw());
9774 } 9799 }
9775 9800
9776 void Library::SetLoadInProgress() const { 9801 void Library::SetLoadInProgress() const {
9777 // Must not already be in the process of being loaded. 9802 // Must not already be in the process of being loaded.
9778 ASSERT(raw_ptr()->load_state_ <= RawLibrary::kLoadRequested); 9803 ASSERT(raw_ptr()->load_state_ <= RawLibrary::kLoadRequested);
9779 StoreNonPointer(&raw_ptr()->load_state_, RawLibrary::kLoadInProgress); 9804 StoreNonPointer(&raw_ptr()->load_state_, RawLibrary::kLoadInProgress);
9780 } 9805 }
9781 9806
9782 void Library::SetLoadRequested() const { 9807 void Library::SetLoadRequested() const {
9783 // Must not be already loaded. 9808 // Must not be already loaded.
(...skipping 12655 matching lines...) Expand 10 before | Expand all | Expand 10 after
22439 } 22464 }
22440 return UserTag::null(); 22465 return UserTag::null();
22441 } 22466 }
22442 22467
22443 const char* UserTag::ToCString() const { 22468 const char* UserTag::ToCString() const {
22444 const String& tag_label = String::Handle(label()); 22469 const String& tag_label = String::Handle(label());
22445 return tag_label.ToCString(); 22470 return tag_label.ToCString();
22446 } 22471 }
22447 22472
22448 } // namespace dart 22473 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_store.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698