fix debug checks for api callbacks returning symbols
authordcarney <dcarney@chromium.org>
Tue, 20 Jan 2015 13:27:46 +0000 (05:27 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 20 Jan 2015 13:28:01 +0000 (13:28 +0000)
BUG=

Review URL: https://codereview.chromium.org/854363003

Cr-Commit-Position: refs/heads/master@{#26156}

src/ia32/macro-assembler-ia32.cc
src/x64/macro-assembler-x64.cc
test/cctest/test-api.cc

index 3c4349e..53be8c7 100644 (file)
@@ -2189,8 +2189,8 @@ void MacroAssembler::CallApiFunctionAndReturn(
   JumpIfSmi(return_value, &ok, Label::kNear);
   mov(map, FieldOperand(return_value, HeapObject::kMapOffset));
 
-  CmpInstanceType(map, FIRST_NONSTRING_TYPE);
-  j(below, &ok, Label::kNear);
+  CmpInstanceType(map, LAST_NAME_TYPE);
+  j(below_equal, &ok, Label::kNear);
 
   CmpInstanceType(map, FIRST_SPEC_OBJECT_TYPE);
   j(above_equal, &ok, Label::kNear);
index 2932ec8..97e5690 100644 (file)
@@ -805,8 +805,8 @@ void MacroAssembler::CallApiFunctionAndReturn(
   JumpIfSmi(return_value, &ok, Label::kNear);
   movp(map, FieldOperand(return_value, HeapObject::kMapOffset));
 
-  CmpInstanceType(map, FIRST_NONSTRING_TYPE);
-  j(below, &ok, Label::kNear);
+  CmpInstanceType(map, LAST_NAME_TYPE);
+  j(below_equal, &ok, Label::kNear);
 
   CmpInstanceType(map, FIRST_SPEC_OBJECT_TYPE);
   j(above_equal, &ok, Label::kNear);
index 9611ddb..9b3bd3d 100644 (file)
@@ -23648,6 +23648,32 @@ TEST(FunctionCallOptimizationMultipleArgs) {
 }
 
 
+static void ReturnsSymbolCallback(
+    const v8::FunctionCallbackInfo<v8::Value>& info) {
+  info.GetReturnValue().Set(v8::Symbol::New(info.GetIsolate()));
+}
+
+
+TEST(ApiCallbackCanReturnSymbols) {
+  i::FLAG_allow_natives_syntax = true;
+  LocalContext context;
+  v8::Isolate* isolate = context->GetIsolate();
+  v8::HandleScope scope(isolate);
+  Handle<Object> global = context->Global();
+  Local<v8::Function> function = Function::New(isolate, ReturnsSymbolCallback);
+  global->Set(v8_str("x"), function);
+  CompileRun(
+      "function x_wrap() {\n"
+      "  for (var i = 0; i < 5; i++) {\n"
+      "    x();\n"
+      "  }\n"
+      "}\n"
+      "x_wrap();\n"
+      "%OptimizeFunctionOnNextCall(x_wrap);"
+      "x_wrap();\n");
+}
+
+
 static const char* last_event_message;
 static int last_event_status;
 void StoringEventLoggerCallback(const char* message, int status) {