Reviewers: rossberg, wingo, Yang,
Message:
PTAL, this is a step towards making all private symbols own symbols.
There is a lot to bikeshed in this CL :)
Description:
Make all global private symbols own symbols.
[email protected],[email protected],[email protected]
Please review this at https://codereview.chromium.org/486763002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+30, -28 lines):
M src/array-iterator.js
M src/macros.py
M src/promise.js
M src/runtime.h
M src/runtime.cc
M src/string-iterator.js
A + test/mjsunit/runtime-gen/createglobalprivateownsymbol.js
D test/mjsunit/runtime-gen/createglobalprivatesymbol.js
Index: test/mjsunit/runtime-gen/createglobalprivatesymbol.js
diff --git a/test/mjsunit/runtime-gen/createglobalprivatesymbol.js
b/test/mjsunit/runtime-gen/createglobalprivatesymbol.js
deleted file mode 100644
index
e4968c14f3de6feb2bced83429a2657cf7d34118..0000000000000000000000000000000000000000
--- a/test/mjsunit/runtime-gen/createglobalprivatesymbol.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// Copyright 2014 the V8 project authors. All rights reserved.
-// AUTO-GENERATED BY tools/generate-runtime-tests.py, DO NOT MODIFY
-// Flags: --allow-natives-syntax --harmony --harmony-proxies
-var _name = "foo";
-%CreateGlobalPrivateSymbol(_name);
Index: src/array-iterator.js
diff --git a/src/array-iterator.js b/src/array-iterator.js
index
f04d6c974a4d41ea27347afde466ec1166e38d31..95310ea07cfac9f1b64962ed9a6287f87723adbb
100644
--- a/src/array-iterator.js
+++ b/src/array-iterator.js
@@ -10,9 +10,11 @@
// var $Array = global.Array;
-var arrayIteratorObjectSymbol = GLOBAL_PRIVATE("ArrayIterator#object");
-var arrayIteratorNextIndexSymbol = GLOBAL_PRIVATE("ArrayIterator#next");
-var arrayIterationKindSymbol = GLOBAL_PRIVATE("ArrayIterator#kind");
+var arrayIteratorObjectSymbol = GLOBAL_PRIVATE_OWN("ArrayIterator#object");
+var arrayIteratorNextIndexSymbol =
GLOBAL_PRIVATE_OWN("ArrayIterator#next");
+var arrayIterationKindSymbol = GLOBAL_PRIVATE_OWN("ArrayIterator#kind");
+
+var arrayEndOfIterationMarker = new $Object();
function ArrayIterator() {}
@@ -50,13 +52,13 @@ function ArrayIteratorIterator() {
function ArrayIteratorNext() {
var iterator = ToObject(this);
- if (!HAS_PRIVATE(iterator, arrayIteratorObjectSymbol)) {
+ if (IS_PRIVATE_OWN_UNDEFINED(iterator, arrayIteratorObjectSymbol)) {
throw MakeTypeError('incompatible_method_receiver',
['Array Iterator.prototype.next']);
}
var array = GET_PRIVATE(iterator, arrayIteratorObjectSymbol);
- if (IS_UNDEFINED(array)) {
+ if (array === arrayEndOfIterationMarker) {
return CreateIteratorResultObject(UNDEFINED, true);
}
@@ -67,7 +69,7 @@ function ArrayIteratorNext() {
// "sparse" is never used.
if (index >= length) {
- SET_PRIVATE(iterator, arrayIteratorObjectSymbol, UNDEFINED);
+ SET_PRIVATE(iterator, arrayIteratorObjectSymbol,
arrayEndOfIterationMarker);
return CreateIteratorResultObject(UNDEFINED, true);
}
Index: src/macros.py
diff --git a/src/macros.py b/src/macros.py
index
131df878b5d8716db6dca81ad3710610f37cfc56..817430f17f6dccf4fabca7e73f2c2d769abe6f92
100644
--- a/src/macros.py
+++ b/src/macros.py
@@ -170,10 +170,11 @@ macro JSON_NUMBER_TO_STRING(arg) =
((%_IsSmi(%IS_VAR(arg)) || arg - arg == 0) ?
# Private names.
# GET_PRIVATE should only be used if the property is known to exists on obj
# itself (it should really use %GetOwnProperty, but that would be way
slower).
-macro GLOBAL_PRIVATE(name) = (%CreateGlobalPrivateSymbol(name));
+macro GLOBAL_PRIVATE_OWN(name) = (%CreateGlobalPrivateOwnSymbol(name));
macro NEW_PRIVATE(name) = (%CreatePrivateSymbol(name));
macro IS_PRIVATE(sym) = (%SymbolIsPrivate(sym));
macro HAS_PRIVATE(obj, sym) = (%HasOwnProperty(obj, sym));
+macro IS_PRIVATE_OWN_UNDEFINED(obj, sym) = (IS_UNDEFINED(obj[sym]));
macro GET_PRIVATE(obj, sym) = (obj[sym]);
macro SET_PRIVATE(obj, sym, val) = (obj[sym] = val);
macro DELETE_PRIVATE(obj, sym) = (delete obj[sym]);
Index: src/promise.js
diff --git a/src/promise.js b/src/promise.js
index
9e88aa56ce042a5e90c49adf65d7e832fe30b10b..b6e03d77f6d0f91c38b71f78cb6cfbf6f7c8c01d
100644
--- a/src/promise.js
+++ b/src/promise.js
@@ -25,12 +25,12 @@ var PromiseHasRejectHandler;
// TODO(jkummerow/rossberg/yangguo): Find a better solution.
// Status values: 0 = pending, +1 = resolved, -1 = rejected
-var promiseStatus = GLOBAL_PRIVATE("Promise#status");
-var promiseValue = GLOBAL_PRIVATE("Promise#value");
-var promiseOnResolve = GLOBAL_PRIVATE("Promise#onResolve");
-var promiseOnReject = GLOBAL_PRIVATE("Promise#onReject");
-var promiseRaw = GLOBAL_PRIVATE("Promise#raw");
-var promiseDebug = GLOBAL_PRIVATE("Promise#debug");
+var promiseStatus = GLOBAL_PRIVATE_OWN("Promise#status");
+var promiseValue = GLOBAL_PRIVATE_OWN("Promise#value");
+var promiseOnResolve = GLOBAL_PRIVATE_OWN("Promise#onResolve");
+var promiseOnReject = GLOBAL_PRIVATE_OWN("Promise#onReject");
+var promiseRaw = GLOBAL_PRIVATE_OWN("Promise#raw");
+var promiseDebug = GLOBAL_PRIVATE_OWN("Promise#debug");
var lastMicrotaskId = 0;
(function() {
@@ -146,7 +146,7 @@ var lastMicrotaskId = 0;
// For bootstrapper.
IsPromise = function IsPromise(x) {
- return IS_SPEC_OBJECT(x) && HAS_PRIVATE(x, promiseStatus);
+ return IS_SPEC_OBJECT(x) && !IS_PRIVATE_OWN_UNDEFINED(x,
promiseStatus);
}
PromiseCreate = function PromiseCreate() {
@@ -162,7 +162,7 @@ var lastMicrotaskId = 0;
// Check promiseDebug property to avoid duplicate event.
if (DEBUG_IS_ACTIVE &&
GET_PRIVATE(promise, promiseStatus) == 0 &&
- !HAS_PRIVATE(promise, promiseDebug)) {
+ IS_PRIVATE_OWN_UNDEFINED(promise, promiseDebug)) {
%DebugPromiseRejectEvent(promise, r);
}
PromiseDone(promise, -1, r, promiseOnReject)
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index
7be53a74f2663d0b8ea2d35d17ece1909019c0ac..c898d5b84b5aa536b575a25180acbd2a1db86b1e
100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -619,7 +619,7 @@ RUNTIME_FUNCTION(Runtime_CreatePrivateOwnSymbol) {
}
-RUNTIME_FUNCTION(Runtime_CreateGlobalPrivateSymbol) {
+RUNTIME_FUNCTION(Runtime_CreateGlobalPrivateOwnSymbol) {
HandleScope scope(isolate);
DCHECK(args.length() == 1);
CONVERT_ARG_HANDLE_CHECKED(String, name, 0);
@@ -635,6 +635,7 @@ RUNTIME_FUNCTION(Runtime_CreateGlobalPrivateSymbol) {
DCHECK(symbol->IsUndefined());
symbol = isolate->factory()->NewPrivateSymbol();
Handle<Symbol>::cast(symbol)->set_name(*name);
+ Handle<Symbol>::cast(symbol)->set_is_own(true);
JSObject::SetProperty(Handle<JSObject>::cast(privates), name, symbol,
STRICT).Assert();
}
Index: src/runtime.h
diff --git a/src/runtime.h b/src/runtime.h
index
2ef6d8009fd2b0f85e97c393b1a0bab1fe0e44bf..c851dafd2601f2450d2227d03c3a63435bd1ba1d
100644
--- a/src/runtime.h
+++ b/src/runtime.h
@@ -258,7 +258,7 @@ namespace internal {
/* Harmony symbols */ \
F(CreateSymbol, 1, 1) \
F(CreatePrivateSymbol, 1, 1) \
- F(CreateGlobalPrivateSymbol, 1, 1) \
+ F(CreateGlobalPrivateOwnSymbol, 1, 1) \
F(CreatePrivateOwnSymbol, 1, 1) \
F(NewSymbolWrapper, 1, 1) \
F(SymbolDescription, 1, 1) \
Index: src/string-iterator.js
diff --git a/src/string-iterator.js b/src/string-iterator.js
index
7222885a56f465931980d646a277ea9c69cc1abf..dc2aeee2c7c38c9a56dd099ef33b511420ef5333
100644
--- a/src/string-iterator.js
+++ b/src/string-iterator.js
@@ -11,8 +11,10 @@
var stringIteratorIteratedStringSymbol =
- GLOBAL_PRIVATE("StringIterator#iteratedString");
-var stringIteratorNextIndexSymbol = GLOBAL_PRIVATE("StringIterator#next");
+ GLOBAL_PRIVATE_OWN("StringIterator#iteratedString");
+var stringIteratorNextIndexSymbol =
GLOBAL_PRIVATE_OWN("StringIterator#next");
+
+var stringEndOfIterationMarker = new $Object();
function StringIterator() {}
@@ -38,13 +40,13 @@ function StringIteratorIterator() {
function StringIteratorNext() {
var iterator = ToObject(this);
- if (!HAS_PRIVATE(iterator, stringIteratorIteratedStringSymbol)) {
+ if (IS_PRIVATE_OWN_UNDEFINED(iterator,
stringIteratorIteratedStringSymbol)) {
throw MakeTypeError('incompatible_method_receiver',
['String Iterator.prototype.next']);
}
var s = GET_PRIVATE(iterator, stringIteratorIteratedStringSymbol);
- if (IS_UNDEFINED(s)) {
+ if (s === stringEndOfIterationMarker) {
return CreateIteratorResultObject(UNDEFINED, true);
}
@@ -52,7 +54,8 @@ function StringIteratorNext() {
var length = TO_UINT32(s.length);
if (position >= length) {
- SET_PRIVATE(iterator, stringIteratorIteratedStringSymbol, UNDEFINED);
+ SET_PRIVATE(iterator, stringIteratorIteratedStringSymbol,
+ stringEndOfIterationMarker);
return CreateIteratorResultObject(UNDEFINED, true);
}
Index: test/mjsunit/runtime-gen/createglobalprivateownsymbol.js
diff --git a/test/mjsunit/runtime-gen/createglobalprivatesymbol.js
b/test/mjsunit/runtime-gen/createglobalprivateownsymbol.js
similarity index 84%
rename from test/mjsunit/runtime-gen/createglobalprivatesymbol.js
rename to test/mjsunit/runtime-gen/createglobalprivateownsymbol.js
index
e4968c14f3de6feb2bced83429a2657cf7d34118..bfc6e715af92f2d1b2e1e318e01e3c7588b5ec51
100644
--- a/test/mjsunit/runtime-gen/createglobalprivatesymbol.js
+++ b/test/mjsunit/runtime-gen/createglobalprivateownsymbol.js
@@ -2,4 +2,4 @@
// AUTO-GENERATED BY tools/generate-runtime-tests.py, DO NOT MODIFY
// Flags: --allow-natives-syntax --harmony --harmony-proxies
var _name = "foo";
-%CreateGlobalPrivateSymbol(_name);
+%CreateGlobalPrivateOwnSymbol(_name);
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.