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.

Reply via email to