Chromium Code Reviews| Index: tools/dom/scripts/systemnative.py |
| =================================================================== |
| --- tools/dom/scripts/systemnative.py (revision 34719) |
| +++ tools/dom/scripts/systemnative.py (working copy) |
| @@ -239,6 +239,12 @@ |
| if IsPureInterface(self._interface.id) or IsCustomType(self._interface.id): |
| return |
| + interface = self._interface |
| + if interface.parents: |
| + supertype = '%sClassId' % interface.parents[0].type.id |
| + else: |
| + supertype = '-1' |
| + |
| cpp_impl_includes = set(['"' + partial + '.h"' |
| for partial in _GetCPPPartialNames(self._interface)]) |
| cpp_header_handlers_emitter = emitter.Emitter() |
| @@ -332,7 +338,10 @@ |
| self._template_loader.Load('cpp_callback_implementation.template'), |
| INCLUDES=self._GenerateCPPIncludes(cpp_impl_includes), |
| INTERFACE=self._interface.id, |
| - HANDLERS=cpp_impl_handlers_emitter.Fragments()) |
| + SUPER_INTERFACE=supertype, |
| + HANDLERS=cpp_impl_handlers_emitter.Fragments(), |
| + DART_IMPLEMENTATION_CLASS=self._interface_type_info.implementation_name(), |
| + DART_IMPLEMENTATION_LIBRARY_ID='Dart%sLibraryId' % self._renamer.GetLibraryId(self._interface)) |
| def ImplementationTemplate(self): |
| template = None |
| @@ -481,11 +490,18 @@ |
| return 'true' |
| def FinishInterface(self): |
| + interface = self._interface |
| + if interface.parents: |
| + supertype = '%sClassId' % interface.parents[0].type.id |
| + else: |
| + supertype = '-1' |
| + |
| self._GenerateCPPHeader() |
| self._cpp_impl_emitter.Emit( |
| self._template_loader.Load('cpp_implementation.template'), |
| INTERFACE=self._interface.id, |
| + SUPER_INTERFACE=supertype, |
| INCLUDES=self._GenerateCPPIncludes(self._cpp_impl_includes), |
| CALLBACKS=self._cpp_definitions_emitter.Fragments(), |
| RESOLVER=self._cpp_resolver_emitter.Fragments(), |
| @@ -599,9 +615,29 @@ |
| is_node_test = lambda interface: interface.id == 'Node' |
| is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs |
| is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs |
| + |
| def TypeCheckHelper(test): |
| return 'true' if any(map(test, self._database.Hierarchy(self._interface))) else 'false' |
| + to_active_emitter = emitter.Emitter() |
| + to_node_emitter = emitter.Emitter() |
| + to_event_target_emitter = emitter.Emitter() |
| + |
| + if (any(map(is_active_test, self._database.Hierarchy(self._interface)))): |
| + to_active_emitter.Emit('return toNative(value);') |
| + else: |
|
vsm
2014/04/08 20:29:27
Should these generate code to assert unreachable i
siva
2014/04/08 23:09:03
When iterating over the weak handles we would use
|
| + to_active_emitter.Emit('return 0;') |
| + |
| + if (any(map(is_node_test, self._database.Hierarchy(self._interface)))): |
| + to_node_emitter.Emit('return toNative(value);') |
| + else: |
| + to_node_emitter.Emit('return 0;') |
| + |
| + if (any(map(is_event_target_test, self._database.Hierarchy(self._interface)))): |
| + to_event_target_emitter.Emit('return toNative(value);') |
| + else: |
| + to_event_target_emitter.Emit('return 0;') |
| + |
| v8_interface_include = '' |
| # V8AbstractWorker.h does not exist so we have to hard code this case. |
| if self._interface.id != 'AbstractWorker': |
| @@ -620,6 +656,9 @@ |
| IS_NODE=TypeCheckHelper(is_node_test), |
| IS_ACTIVE=TypeCheckHelper(is_active_test), |
| IS_EVENT_TARGET=TypeCheckHelper(is_event_target_test), |
| + TO_NODE=to_node_emitter.Fragments(), |
| + TO_ACTIVE=to_active_emitter.Fragments(), |
| + TO_EVENT_TARGET=to_event_target_emitter.Fragments(), |
| TO_NATIVE=to_native_emitter.Fragments(), |
| TO_DART=to_dart_emitter.Fragments()) |
| @@ -1404,6 +1443,16 @@ |
| CLASS_NAME=os.path.splitext(os.path.basename(path))[0]) |
| def EmitClassIdTable(self, database, output_dir, type_registry, renamer): |
| + def HasConverters(interface): |
| + is_node_test = lambda interface: interface.id == 'Node' |
| + is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs |
| + is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs |
|
vsm
2014/04/08 20:29:27
This may need to be lambda interface: interface.id
siva
2014/04/08 23:09:03
I will fix this and another use of is_event_target
|
| + |
| + return (any(map(is_node_test, database.Hierarchy(interface))) or |
| + any(map(is_active_test, database.Hierarchy(interface))) or |
| + any(map(is_event_target_test, database.Hierarchy(interface)))) |
| + |
| + |
| path = os.path.join(output_dir, 'DartWebkitClassIds.h') |
| e = self._emitters.FileEmitter(path) |
| e.Emit('// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file\n'); |
| @@ -1429,26 +1478,30 @@ |
| e.Emit(' // New types that are not auto-generated should be added here.\n'); |
| e.Emit('\n'); |
| for interface in database.GetInterfaces(): |
| - interface_name = interface.id |
| - e.Emit(' %sClassId,\n' % interface_name) |
| + e.Emit(' %sClassId,\n' % interface.id) |
| e.Emit(' NumWebkitClassIds\n'); |
| e.Emit('};\n'); |
| + e.Emit('class ActiveDOMObject;\n' |
| + 'class EventTarget;\n' |
| + 'class Node;\n' |
| + 'typedef ActiveDOMObject* (*ToActiveDOMObject)(void* value);\n' |
| + 'typedef EventTarget* (*ToEventTarget)(void* value);\n' |
| + 'typedef Node* (*ToNode)(void* value);\n' |
| + 'typedef struct {\n' |
| + ' const char* class_name;\n' |
| + ' int library_id;\n' |
| + ' int base_class_id;\n' |
| + ' ToActiveDOMObject toActiveDOMObject;\n' |
| + ' ToEventTarget toEventTarget;\n' |
| + ' ToNode toNode;\n' |
| + '} DartWrapperTypeInfo;\n' |
| + 'typedef DartWrapperTypeInfo _DartWebkitClassInfo[NumWebkitClassIds];\n' |
| + '\n' |
| + 'extern _DartWebkitClassInfo DartWebkitClassInfo;\n' |
| + '\n' |
| + '} // namespace WebCore\n' |
| + '#endif // DartWebkitClassIds_h\n'); |
| - e.Emit('typedef struct {\n'); |
| - e.Emit(' const char* class_name;\n'); |
| - e.Emit(' int library_id;\n'); |
| - e.Emit(' int base_class_id;\n'); |
| - e.Emit(' bool is_node;\n'); |
| - e.Emit(' bool is_active;\n'); |
| - e.Emit(' bool is_event;\n'); |
| - e.Emit('} _Classinfo;\n'); |
| - e.Emit('typedef _Classinfo _DartWebkitClassInfo[NumWebkitClassIds];\n'); |
| - e.Emit('\n'); |
| - e.Emit('extern _DartWebkitClassInfo DartWebkitClassInfo;\n'); |
| - e.Emit('\n'); |
| - e.Emit('} // namespace WebCore\n'); |
| - e.Emit('#endif // DartWebkitClassIds_h\n'); |
| - |
| path = os.path.join(output_dir, 'DartWebkitClassIds.cpp') |
| e = self._emitters.FileEmitter(path) |
| e.Emit('// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file\n'); |
| @@ -1457,43 +1510,77 @@ |
| e.Emit('// WARNING: Do not edit - generated code.\n'); |
| e.Emit('// See dart/tools/dom/scripts/systemnative.py\n'); |
| e.Emit('\n'); |
| + e.Emit('#include "config.h"\n'); |
| e.Emit('#include "DartWebkitClassIds.h"\n'); |
| e.Emit('\n'); |
| e.Emit('#include "bindings/dart/DartLibraryIds.h"\n'); |
| + for interface in database.GetInterfaces(): |
| + if HasConverters(interface): |
| + e.Emit('#include "Dart%s.h"\n' % interface.id); |
| e.Emit('\n'); |
| + |
| e.Emit('namespace WebCore {\n'); |
| + |
| e.Emit('\n'); |
| - e.Emit("_DartWebkitClassInfo DartWebkitClassInfo = {\n"); |
| - e.Emit(' { "_InvalidClassId", -1, -1, false, false, false },\n'); |
| - e.Emit(' { "_HistoryCrossFrame", DartHtmlLibraryId, -1, false, false, false },\n'); |
| - e.Emit(' { "_LocationCrossFrame", DartHtmlLibraryId, -1, false, false, false },\n'); |
| - e.Emit(' { "_DOMWindowCrossFrame", DartHtmlLibraryId, -1, false, false, true },\n'); |
| - e.Emit(' { "DateTime", DartCoreLibraryId, -1, false, false, false },\n'); |
| - e.Emit(' { "JsObject", DartJsLibraryId, -1, false, false, false },\n'); |
| - e.Emit(' { "JsFunction", DartJsLibraryId, _JsObjectClassId, false, false, false },\n'); |
| - e.Emit(' { "JsArray", DartJsLibraryId, _JsObjectClassId, false, false, false },\n'); |
| + |
| + e.Emit('ActiveDOMObject* toNullActiveDOMObject(void* value) { return 0; }\n'); |
|
vsm
2014/04/08 20:29:27
Ditto on ASSERTs here - will these ever be called?
siva
2014/04/08 23:09:03
Yes they would be used to trigger processing in th
|
| + e.Emit('EventTarget* toNullEventTarget(void* value) { return 0; }\n'); |
| + e.Emit('Node* toNullNode(void* value) { return 0; }\n'); |
| + |
| + e.Emit("_DartWebkitClassInfo DartWebkitClassInfo = {\n") |
| + |
| + e.Emit(' {\n' |
| + ' "_InvalidClassId", -1, -1,\n' |
| + ' toNullActiveDOMObject, toNullEventTarget, toNullNode\n' |
| + ' },\n'); |
| + e.Emit(' {\n' |
| + ' "_HistoryCrossFrame", DartHtmlLibraryId, -1,\n' |
| + ' toNullActiveDOMObject, toNullEventTarget, toNullNode\n' |
| + ' },\n'); |
| + e.Emit(' {\n' |
| + ' "_LocationCrossFrame", DartHtmlLibraryId, -1,\n' |
| + ' toNullActiveDOMObject, toNullEventTarget, toNullNode\n' |
| + ' },\n'); |
| + e.Emit(' {\n' |
| + ' "_DOMWindowCrossFrame", DartHtmlLibraryId, -1,\n' |
| + ' toNullActiveDOMObject, toNullEventTarget, toNullNode\n' |
| + ' },\n'); |
| + e.Emit(' {\n' |
| + ' "DateTime", DartCoreLibraryId, -1,\n' |
| + ' toNullActiveDOMObject, toNullEventTarget, toNullNode\n' |
| + ' },\n'); |
| + e.Emit(' {\n' |
| + ' "JsObject", DartJsLibraryId, -1,\n' |
| + ' toNullActiveDOMObject, toNullEventTarget, toNullNode\n' |
| + ' },\n'); |
| + e.Emit(' {\n' |
| + ' "JsFunction", DartJsLibraryId, _JsObjectClassId,\n' |
| + ' toNullActiveDOMObject, toNullEventTarget, toNullNode\n' |
| + ' },\n'); |
| + e.Emit(' {\n' |
| + ' "JsArray", DartJsLibraryId, _JsObjectClassId,\n' |
| + ' toNullActiveDOMObject, toNullEventTarget, toNullNode\n' |
| + ' },\n'); |
| e.Emit(' // New types that are not auto-generated should be added here.\n'); |
| - e.Emit('\n'); |
| - is_node_test = lambda interface: interface.id == 'Node' |
| - is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs |
| - is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs |
| - def TypeCheckHelper(test): |
| - return 'true' if any(map(test, database.Hierarchy(interface))) else 'false' |
| for interface in database.GetInterfaces(): |
| - e.Emit(" {") |
| - type_info = type_registry.TypeInfo(interface.id) |
| - type_info.native_type().replace('<', '_').replace('>', '_'), |
| - e.Emit(' "%s",' % type_info.implementation_name()) |
| - e.Emit(' Dart%sLibraryId,' % renamer.GetLibraryId(interface)) |
| + name = interface.id |
| + type_info = type_registry.TypeInfo(name) |
| + type_info.native_type().replace('<', '_').replace('>', '_') |
| + e.Emit(' {\n') |
| + e.Emit(' "%s", ' % type_info.implementation_name()) |
| + e.Emit('Dart%sLibraryId, ' % renamer.GetLibraryId(interface)) |
| if interface.parents: |
| supertype = interface.parents[0].type.id |
| - e.Emit(' %sClassId,\n' % supertype) |
| + e.Emit('%sClassId,\n' % supertype) |
| else: |
| - e.Emit(' -1,') |
| - e.Emit(" %s," % TypeCheckHelper(is_node_test)) |
| - e.Emit(" %s," % TypeCheckHelper(is_active_test)) |
| - e.Emit(" %s," % TypeCheckHelper(is_event_target_test)) |
| - e.Emit(" },\n") |
| + e.Emit(' -1,\n') |
| + if HasConverters(interface): |
| + e.Emit(' Dart%s::toActiveDOMObject, Dart%s::toEventTarget,' |
| + ' Dart%s::toNode\n' % (name, name, name)) |
| + else: |
| + e.Emit(' toNullActiveDOMObject, toNullEventTarget, toNullNode\n') |
| + e.Emit(' },\n') |
| + |
| e.Emit("};\n"); |
| e.Emit('\n'); |
| e.Emit('} // namespace WebCore\n'); |