764e1a0fcf
The new instance type 'Symbol' represents ES6 symbols (a.k.a. private/unique names). Currently, symbols are simple data objects that only carry a hash code, random-generated upon allocation. The new type 'Name' now serves as the common super class for strings and symbols, and is supposed to represent property names. We will eventually migrate APIs from String to Name for the standard key type. Strings and symbols share the same hash field representation, via the Name class. This way, we should be able to use the same code paths for symbols and internalized strings in most cases. Also, Symbol's instance type code is allocated adjacent to internalized string codes in the enum, allowing a simple range check for the common case. Baseline CL: https://codereview.chromium.org/12210083/ R=mstarzinger@chromium.org BUG= Review URL: https://codereview.chromium.org/12223071 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13783 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
64 lines
1.6 KiB
C++
64 lines
1.6 KiB
C++
// Copyright 2013 the V8 project authors. All rights reserved.
|
|
|
|
// Check that we can traverse very deep stacks of ConsStrings using
|
|
// StringCharacterStram. Check that Get(int) works on very deep stacks
|
|
// of ConsStrings. These operations may not be very fast, but they
|
|
// should be possible without getting errors due to too deep recursion.
|
|
|
|
#include "v8.h"
|
|
|
|
#include "cctest.h"
|
|
#include "objects.h"
|
|
|
|
using namespace v8::internal;
|
|
|
|
static v8::Persistent<v8::Context> env;
|
|
|
|
static void InitializeVM() {
|
|
if (env.IsEmpty()) {
|
|
v8::HandleScope scope;
|
|
const char* extensions[] = { "v8/print" };
|
|
v8::ExtensionConfiguration config(1, extensions);
|
|
env = v8::Context::New(&config);
|
|
}
|
|
v8::HandleScope scope;
|
|
env->Enter();
|
|
}
|
|
|
|
|
|
TEST(Create) {
|
|
InitializeVM();
|
|
Isolate* isolate = Isolate::Current();
|
|
HandleScope scope(isolate);
|
|
|
|
const int kNumSymbols = 30;
|
|
Handle<Symbol> symbols[kNumSymbols];
|
|
|
|
for (int i = 0; i < kNumSymbols; ++i) {
|
|
symbols[i] = isolate->factory()->NewSymbol();
|
|
CHECK(symbols[i]->IsName());
|
|
CHECK(symbols[i]->IsSymbol());
|
|
CHECK(symbols[i]->HasHashCode());
|
|
CHECK_GT(symbols[i]->Hash(), 0);
|
|
symbols[i]->ShortPrint();
|
|
PrintF("\n");
|
|
#if OBJECT_PRINT
|
|
symbols[i]->Print();
|
|
#endif
|
|
#if VERIFY_HEAP
|
|
symbols[i]->Verify();
|
|
#endif
|
|
}
|
|
|
|
HEAP->PerformScavenge();
|
|
HEAP->CollectAllGarbage(Heap::kNoGCFlags);
|
|
|
|
// All symbols should be distinct.
|
|
for (int i = 0; i < kNumSymbols; ++i) {
|
|
CHECK(symbols[i]->SameValue(*symbols[i]));
|
|
for (int j = i + 1; j < kNumSymbols; ++j) {
|
|
CHECK(!symbols[i]->SameValue(*symbols[j]));
|
|
}
|
|
}
|
|
}
|