Skip to content

issue/14745 code #14795

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions tests/webidl/output_DEFAULT.txt
Original file line number Diff line number Diff line change
Expand Up @@ -108,5 +108,6 @@ struct_ptr_array[0]->attr2 == 101
Parent:0
Parent:42
|abc|1|(null)|123|
123

done.
30 changes: 29 additions & 1 deletion tests/webidl/post.js
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,35 @@ if (isMemoryGrowthAllowed) {
}
}

//
// Part issue 14745

function createSmallObject() {
let smObject = new TheModule.JSSmallObject();
smObject.getID = ( number ) => number;
return smObject;
}

function createProviderObject() {

var provider = new TheModule.JSObjectProvider();
provider.getObject = function() {
let tempSmallObject = createSmallObject();
return tempSmallObject.ptr;
}
return provider;
}

var factory = new TheModule.ObjectFactory();
var objectProvider = factory.getProvider( createProviderObject() );
var smallObject = objectProvider.getObject();

// this will print 123 if you can instantiate an object, which means that integers
// are correctly typecast to ObjectProvider pointer and SmallObject pointer
console.log(smallObject.getID(123));

// end of issue 14745



console.log('\ndone.')
})();
56 changes: 56 additions & 0 deletions tests/webidl/test.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,3 +193,59 @@ typedef struct LongLongTypes {
unsigned long long* lluArray;
long long ll;
} LongLongTypes;

///

struct ISmallObject {
virtual int getID(int number) = 0;
};

struct IObjectProvider {
virtual ISmallObject* getObject() = 0;
};

class SmallObject : public ISmallObject {
public:
SmallObject( ISmallObject* smallObject)
: m_object(smallObject) {

}
int getID(int number) {
return number;
}
private:
ISmallObject* m_object;
};

class ObjectProvider : public IObjectProvider {
public:
ObjectProvider( IObjectProvider* provider)
: m_provider(provider) {

}

ISmallObject* getObject() {
auto * object = m_provider->getObject();
return new SmallObject(object);
}
private:
IObjectProvider* m_provider;
};

class ObjectFactory {
public:
ObjectFactory() {

}

IObjectProvider* getProvider( IObjectProvider* objectProvider ) {
return new ObjectProvider(objectProvider);
}

private:

<<<<<<< HEAD
};
=======
};
>>>>>>> 4f765dec0830dce21da8ed2db74ecabbd7a48186
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks like a merge error here.

27 changes: 27 additions & 0 deletions tests/webidl/test.idl
Original file line number Diff line number Diff line change
Expand Up @@ -169,3 +169,30 @@ interface LongLongTypes {
readonly attribute unsigned long long[] lluArray;
attribute long long ll;
};

[NoDelete]
interface ISmallObject {
long getID( long number );
};

[JSImplementation="ISmallObject"]
interface JSSmallObject {
void JSSmallObject();
long getID(long number);
};

[NoDelete]
interface IObjectProvider {
ISmallObject getObject();
};

[JSImplementation="IObjectProvider"]
interface JSObjectProvider {
void JSObjectProvider();
JSSmallObject getObject();
};

interface ObjectFactory {
void ObjectFactory();
IObjectProvider getProvider( IObjectProvider provider );
};
18 changes: 16 additions & 2 deletions tools/webidl_binder.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,11 +366,25 @@ def deref_if_nonpointer(m):
return ''


# def type_to_cdec(raw):
# ret = type_to_c(raw.type.name, non_pointing=True)
# if raw.getExtendedAttribute('Const'):
# ret = 'const ' + ret
# if raw.type.name not in interfaces:
# return ret
# if raw.getExtendedAttribute('Ref'):
# return ret + '&'
# if raw.getExtendedAttribute('Value'):
# return ret
# return ret + '*'

def type_to_cdec(raw):
ret = type_to_c(raw.type.name, non_pointing=True)
if raw.getExtendedAttribute('Const'):
ret = 'const ' + ret
if raw.type.name not in interfaces:
if raw.type.isArray():
return ret + '*'
return ret
if raw.getExtendedAttribute('Ref'):
return ret + '&'
Expand Down Expand Up @@ -589,13 +603,13 @@ def render_function(class_name, func_name, sigs, return_type, non_pointer,
js_call_args = ', '.join(['%s%s' % (('(int)' if sig[j] in interfaces else '') + take_addr_if_nonpointer(raw[j]), args[j]) for j in range(i)])

js_impl_methods.append(r''' %s %s(%s) %s {
%sEM_ASM_%s({
%s (%s) EM_ASM_%s({
var self = Module['getCache'](Module['%s'])[$0];
if (!self.hasOwnProperty('%s')) throw 'a JSImplementation must implement all functions, you forgot %s::%s.';
%sself['%s'](%s)%s;
}, (int)this%s);
}''' % (c_return_type, func_name, dec_args, maybe_const,
basic_return, 'INT' if c_return_type not in C_FLOATS else 'DOUBLE',
basic_return, c_return_type, 'INT' if c_return_type not in C_FLOATS else 'DOUBLE',
class_name,
func_name, class_name, func_name,
return_prefix,
Expand Down