Skip to content

Commit c51ad7e

Browse files
committed
use os_log, and fix core foundation bridging
1 parent ecd393a commit c51ad7e

File tree

4 files changed

+53
-25
lines changed

4 files changed

+53
-25
lines changed

NativeScript/runtime/modules/console/Console.cpp

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,21 @@
1313
#endif
1414

1515
#ifdef __APPLE__
16+
1617
#include <CoreFoundation/CFString.h>
1718
extern "C" void NSLog(CFStringRef format, ...);
19+
20+
#if defined(__has_include)
21+
#if __has_include(<os/log.h>)
22+
#include <os/log.h>
23+
#define TNS_HAVE_OS_LOG 1
24+
#else
25+
#define TNS_HAVE_OS_LOG 0
26+
#endif
27+
#else
28+
#define TNS_HAVE_OS_LOG 0
29+
#endif
30+
1831
#else
1932
#include <iostream>
2033
#endif
@@ -76,7 +89,7 @@ std::string transformJSObject(napi_env env, napi_value object) {
7689
return JsonStringifyObject(env, object, false);
7790
}
7891

79-
std::string buildStringFromArg(napi_env env, napi_value val) {
92+
std::string buildStringFromArg(napi_env env, napi_value val, napi_value inspectSymbol) {
8093
napi_valuetype type;
8194
napi_typeof(env, val, &type);
8295

@@ -105,7 +118,7 @@ std::string buildStringFromArg(napi_env env, napi_value val) {
105118
if (isStrictEqual) {
106119
arrayStr << "[Circular]";
107120
} else {
108-
std::string elementString = buildStringFromArg(env, propertyValue);
121+
std::string elementString = buildStringFromArg(env, propertyValue, inspectSymbol);
109122
arrayStr << elementString;
110123
}
111124

@@ -117,6 +130,13 @@ std::string buildStringFromArg(napi_env env, napi_value val) {
117130
arrayStr << "]";
118131
return arrayStr.str();
119132
} else if (type == napi_object) {
133+
napi_value inspectFunc = nullptr;
134+
napi_status getInspectStatus = napi_get_property(env, val, inspectSymbol, &inspectFunc);
135+
if (getInspectStatus == napi_ok && napi_util::is_of_type(env, inspectFunc, napi_function)) {
136+
napi_value inspectedValue;
137+
napi_call_function(env, val, inspectFunc, 0, nullptr, &inspectedValue);
138+
return buildStringFromArg(env, inspectedValue, inspectSymbol);
139+
}
120140
return transformJSObject(env, val);
121141
} else if (type == napi_symbol) {
122142
napi_value symString;
@@ -133,6 +153,14 @@ std::string buildLogString(napi_env env, napi_callback_info info,
133153
int startingIndex = 0) {
134154
NAPI_CALLBACK_BEGIN_VARGS()
135155

156+
napi_value global, Symbol, SymbolFor, symbolDescription, inspectSymbol;
157+
napi_get_global(env, &global);
158+
napi_get_named_property(env, global, "Symbol", &Symbol);
159+
napi_get_named_property(env, Symbol, "for", &SymbolFor);
160+
napi_create_string_utf8(env, "nodejs.util.inspect.custom", NAPI_AUTO_LENGTH,
161+
&symbolDescription);
162+
napi_call_function(env, global, SymbolFor, 1, &symbolDescription, &inspectSymbol);
163+
136164
std::stringstream ss;
137165

138166
if (argc) {
@@ -142,7 +170,7 @@ std::string buildLogString(napi_env env, napi_callback_info info,
142170
ss << " ";
143171
}
144172

145-
std::string argString = buildStringFromArg(env, argv[i]);
173+
std::string argString = buildStringFromArg(env, argv[i], inspectSymbol);
146174
ss << argString;
147175
}
148176
} else {
@@ -188,14 +216,6 @@ JS_METHOD(Console::Log) {
188216
napi_value argv[argc];
189217
napi_get_cb_info(env, cbinfo, &argc, argv, nullptr, nullptr);
190218

191-
napi_value global, Symbol, SymbolFor, symbolDescription, symbol;
192-
napi_get_global(env, &global);
193-
napi_get_named_property(env, global, "Symbol", &Symbol);
194-
napi_get_named_property(env, Symbol, "for", &SymbolFor);
195-
napi_create_string_utf8(env, "nodejs.util.inspect.custom", NAPI_AUTO_LENGTH,
196-
&symbolDescription);
197-
napi_call_function(env, global, SymbolFor, 1, &symbolDescription, &symbol);
198-
199219
std::stringstream log;
200220

201221
// TODO(dj): what if we made this pretty?
@@ -227,7 +247,11 @@ JS_METHOD(Console::Log) {
227247
std::string logString = log.str();
228248

229249
#ifdef __APPLE__
250+
#if TNS_HAVE_OS_LOG
251+
os_log(OS_LOG_DEFAULT, "%{public}s", logString.c_str());
252+
#else
230253
NSLog(CFSTR("%s"), logString.c_str());
254+
#endif
231255
#else
232256
switch (stream) {
233257
case kConsoleLogTypeLog:
-1.47 KB
Binary file not shown.
-1.47 KB
Binary file not shown.

metadata-generator/src/IR/TypeSpec.cpp

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
#include <assert.h>
22

3-
#include <iostream>
4-
53
#include "IR.h"
4+
#include "Util.h"
65
#include "clang-c/Index.h"
76

87
static const std::vector<std::string> KNOWN_BRIDGED_TYPES = {
@@ -22,26 +21,28 @@ TypeSpec::TypeSpec(CXType type, std::vector<std::string>* classTypeParameters) {
2221
std::string name = clang_getCString(nameStr);
2322
clang_disposeString(nameStr);
2423

25-
if (std::find(KNOWN_BRIDGED_TYPES.begin(), KNOWN_BRIDGED_TYPES.end(),
26-
name) != KNOWN_BRIDGED_TYPES.end()) {
24+
if (name.find(" _Nullable *") != std::string::npos) {
25+
std::string strippedName = name.substr(0, name.find(" _Nullable *"));
26+
strippedName = rtrim(strippedName);
27+
if (std::find(KNOWN_BRIDGED_TYPES.begin(), KNOWN_BRIDGED_TYPES.end(),
28+
strippedName) != KNOWN_BRIDGED_TYPES.end()) {
29+
kind = kTypePointer;
30+
auto pointeeType = clang_getPointeeType(type);
31+
pointee = std::make_shared<TypeSpec>(pointeeType, classTypeParameters);
32+
return;
33+
}
34+
}
35+
36+
if (std::find(KNOWN_BRIDGED_TYPES.begin(), KNOWN_BRIDGED_TYPES.end(), name) !=
37+
KNOWN_BRIDGED_TYPES.end()) {
2738
kind = kTypeAnyObject;
28-
std::cout << "Bridged type found: " << name << std::endl;
29-
// typeParameterName = name;
3039
return;
3140
}
3241

3342
CXString canonicalNameStr = clang_getTypeSpelling(canonicalType);
3443
std::string canonicalName = stripCInfo(clang_getCString(canonicalNameStr));
3544
clang_disposeString(canonicalNameStr);
3645

37-
if (std::find(KNOWN_BRIDGED_TYPES.begin(), KNOWN_BRIDGED_TYPES.end(),
38-
canonicalName) != KNOWN_BRIDGED_TYPES.end()) {
39-
kind = kTypeAnyObject;
40-
std::cout << "Canonical bridged type found: " << canonicalName << std::endl;
41-
// typeParameterName = name;
42-
return;
43-
}
44-
4546
if (classTypeParameters != nullptr &&
4647
std::find(classTypeParameters->begin(), classTypeParameters->end(),
4748
name) != classTypeParameters->end()) {
@@ -116,7 +117,10 @@ TypeSpec::TypeSpec(CXType type, std::vector<std::string>* classTypeParameters) {
116117
break;
117118

118119
case CXType_Pointer: {
120+
unknownInfo = name;
121+
119122
auto pointeeType = clang_getPointeeType(canonicalType);
123+
120124
if (pointeeType.kind == CXType_Char_S) {
121125
kind = kTypeString;
122126
} else if (pointeeType.kind == CXType_ObjCSel) {

0 commit comments

Comments
 (0)