Skip to content

Commit

Permalink
Merge pull request #299 from NativeScript/ambiguous-metadata
Browse files Browse the repository at this point in the history
Disambiguate native APIs with name collisions
  • Loading branch information
fealebenpae committed Sep 15, 2015
2 parents 0f2acf6 + 16c1470 commit 495004a
Show file tree
Hide file tree
Showing 10 changed files with 96 additions and 14 deletions.
15 changes: 11 additions & 4 deletions src/NativeScript/GlobalObject.mm
Original file line number Diff line number Diff line change
Expand Up @@ -355,13 +355,20 @@ static EncodedJSValue JSC_HOST_CALL collectGarbage(ExecState* execState) {
CString protocolName = protocol_getName(aProtocol);
const Meta* meta = MetaFile::instance()->globalTable()->findMeta(protocolName.data());
if (meta && meta->type() != MetaType::ProtocolType) {
protocolName = WTF::String::format("%sProtocol", protocolName.data()).utf8();
meta = MetaFile::instance()->globalTable()->findMeta(protocolName.data());
WTF::String newProtocolname = WTF::String::format("%sProtocol", protocolName.data());

size_t protocolIndex = 2;
while (objc_getProtocol(newProtocolname.utf8().data())) {
newProtocolname = WTF::String::format("%sProtocol%d", protocolName.data(), protocolIndex++);
}

meta = MetaFile::instance()->globalTable()->findMeta(newProtocolname.utf8().data());
}
ASSERT(meta && meta->type() == MetaType::ProtocolType);

ObjCProtocolWrapper* protocolWrapper = ObjCProtocolWrapper::create(this->vm(), ObjCProtocolWrapper::createStructure(this->vm(), this, this->objectPrototype()), static_cast<const ProtocolMeta*>(meta), aProtocol);
this->_objCProtocolWrappers.insert(std::pair<const Protocol*, Strong<ObjCProtocolWrapper>>(aProtocol, Strong<ObjCProtocolWrapper>(this->vm(), protocolWrapper)));
this->putDirectWithoutTransition(this->vm(), Identifier::fromString(this->globalExec(), protocolName.data()), protocolWrapper, DontDelete | ReadOnly);
this->_objCProtocolWrappers.insert({ aProtocol, Strong<ObjCProtocolWrapper>(this->vm(), protocolWrapper) });
this->putDirectWithoutTransition(this->vm(), Identifier::fromString(this->globalExec(), meta->jsName()), protocolWrapper, DontDelete | ReadOnly);

return protocolWrapper;
}
Expand Down
7 changes: 7 additions & 0 deletions src/NativeScript/ObjC/ObjCPrimitiveTypes.mm
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
#pragma mark objCInstancetype
static JSValue objCInstancetype_read(ExecState* execState, const void* buffer, JSCell* self) {
id value = *static_cast<const id*>(buffer);
if (value == nil) {
return jsNull();
}

Structure* structure;

Expand Down Expand Up @@ -61,6 +64,10 @@ static bool objCInstancetype_canConvert(ExecState* execState, const JSValue& val
#pragma mark objCProtocol
static JSValue objCProtocol_read(ExecState* execState, const void* buffer, JSCell* self) {
Protocol* aProtocol = *static_cast<Protocol* const*>(buffer);
if (aProtocol == nil) {
return jsNull();
}

GlobalObject* globalObject = jsCast<GlobalObject*>(execState->lexicalGlobalObject());
ObjCProtocolWrapper* protocolWrapper = globalObject->protocolWrapperFor(aProtocol);
return protocolWrapper;
Expand Down
2 changes: 1 addition & 1 deletion src/metadata-generator
24 changes: 24 additions & 0 deletions tests/TestFixtures/Api/TNSDeclarationConflicts.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// TNSDeclarationConflicts.h
// NativeScriptTests
//
// Created by Jason Zhekov on 11/09/15.
// Copyright (c) 2015 Jason Zhekov. All rights reserved.
//

@protocol TNSInterfaceProtocolConflict <NSObject>
@end
@protocol TNSInterfaceProtocolConflictProtocol <NSObject>
@end
@interface TNSInterfaceProtocolConflict : NSObject <TNSInterfaceProtocolConflict, TNSInterfaceProtocolConflictProtocol>
@end

struct TNSStructFunctionConflict {
int x;
};
void TNSStructFunctionConflict(struct TNSStructFunctionConflict);

struct TNSStructVarConflict {
int x;
};
extern const int TNSStructVarConflict;
18 changes: 18 additions & 0 deletions tests/TestFixtures/Api/TNSDeclarationConflicts.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//
// TNSDeclarationConflicts.m
// NativeScriptTests
//
// Created by Jason Zhekov on 11/09/15.
// Copyright (c) 2015 Jason Zhekov. All rights reserved.
//

#import "TNSDeclarationConflicts.h"

@implementation TNSInterfaceProtocolConflict
@end

void TNSStructFunctionConflict(struct TNSStructFunctionConflict str) {
TNSLog(@(str.x).stringValue);
}

const int TNSStructVarConflict = 42;
2 changes: 2 additions & 0 deletions tests/TestFixtures/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ set(HEADER_FILES
TestFixtures.h

Api/TNSApi.h
Api/TNSDeclarationConflicts.h
Api/TNSVersions.h
Functions/TNSFunctions.h
Interfaces/TNSClassWithPlaceholder.h
Expand All @@ -20,6 +21,7 @@ set(HEADER_FILES

set(SOURCE_FILES
Api/TNSApi.m
Api/TNSDeclarationConflicts.m
Api/TNSVersions.m
Functions/TNSFunctions.m
Interfaces/TNSClassWithPlaceholder.m
Expand Down
18 changes: 9 additions & 9 deletions tests/TestFixtures/TestFixtures.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,21 @@
#import <UIKit/UIKit.h>

#import "Api/TNSApi.h"
#import "Api/TNSDeclarationConflicts.h"
#import "Api/TNSVersions.h"

#import "Functions/TNSFunctions.h"

#import "Marshalling/TNSPrimitives.h"
#import "Marshalling/TNSObjCTypes.h"
#import "Marshalling/TNSRecords.h"
#import "Marshalling/TNSPrimitivePointers.h"
#import "Marshalling/TNSFunctionPointers.h"

#import "Interfaces/TNSMethodCalls.h"
#import "Interfaces/TNSClassWithPlaceholder.h"
#import "Interfaces/TNSConstructorResolution.h"
#import "Interfaces/TNSInheritance.h"
#import "Interfaces/TNSClassWithPlaceholder.h"
#import "Interfaces/TNSMethodCalls.h"

#import "TNSTestCommon.h"
#import "Marshalling/TNSFunctionPointers.h"
#import "Marshalling/TNSObjCTypes.h"
#import "Marshalling/TNSPrimitivePointers.h"
#import "Marshalling/TNSPrimitives.h"
#import "Marshalling/TNSRecords.h"

#import "TNSTestCommon.h"
#import "TNSTestNativeCallbacks.h"
2 changes: 2 additions & 0 deletions tests/TestFixtures/exported-symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,5 @@ TNSConstant10_2Plus
TNSConstant10_3Plus
TNSConstant10_4Plus
TNSConstant10_5Plus
TNSStructFunctionConflict
TNSStructVarConflict
21 changes: 21 additions & 0 deletions tests/TestRunner/app/DeclarationConflicts.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
describe(module.id, function() {
afterEach(function () {
TNSClearOutput();
});

it("Interface-Protocol", function() {
expect(TNSInterfaceProtocolConflict instanceof NSObject).toBe(true);
expect(NSProtocolFromString("TNSInterfaceProtocolConflict")).toBe(TNSInterfaceProtocolConflictProtocol2);
expect(NSProtocolFromString("TNSInterfaceProtocolConflictProtocol")).toBe(TNSInterfaceProtocolConflictProtocol);
});

it("Struct-Function", function() {
TNSStructFunctionConflict(new TNSStructFunctionConflictStruct({ x: 3 }));
expect(TNSGetOutput()).toBe("3");
});

it("Struct-Var", function() {
expect(new TNSStructVarConflictStruct({ x: 3 }).x).toBe(3);
expect(TNSStructVarConflict).toBe(42);
});
});
1 change: 1 addition & 0 deletions tests/TestRunner/app/bootstrap.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ require('./MetadataTests');
require('./shared');

require('./ApiTests');
require('./DeclarationConflicts');

execute();

Expand Down

0 comments on commit 495004a

Please sign in to comment.