Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Unified Diff: Source/bindings/scripts/deprecated_code_generator_v8.pm

Issue 17572008: WIP IDL compiler rewrite (Closed) Base URL: https://chromium.googlesource.com/chromium/blink@master
Patch Set: Branch: const + primitive type readonly attributes Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/bindings/scripts/code_generator_v8.py ('k') | Source/bindings/scripts/idl_compiler.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/scripts/deprecated_code_generator_v8.pm
diff --git a/Source/bindings/scripts/deprecated_code_generator_v8.pm b/Source/bindings/scripts/deprecated_code_generator_v8.pm
index c327e69218601d12d2b9af4af6bb0e4cd0dca716..e75bc23cd1979786bf3ba81416720b88f399143c 100644
--- a/Source/bindings/scripts/deprecated_code_generator_v8.pm
+++ b/Source/bindings/scripts/deprecated_code_generator_v8.pm
@@ -198,6 +198,7 @@ my %svgAttributesInHTMLHash = ("class" => 1, "id" => 1, "onabort" => 1, "onclick
"onmouseup" => 1, "onresize" => 1, "onscroll" => 1,
"onunload" => 1);
+### DONE
my %svgTypeNeedingTearOff = (
"SVGAngle" => "SVGPropertyTearOff<SVGAngle>",
"SVGLength" => "SVGPropertyTearOff<SVGLength>",
@@ -267,19 +268,26 @@ sub IDLFileForInterface
my $interfaceName = shift;
unless ($idlFiles) {
+# use Data::Dumper;
+# print "[direc]", Dumper($idlDirectories), "\n";
my @directories = map { $_ = "$sourceRoot/$_" if -d "$sourceRoot/$_"; $_ } @$idlDirectories;
push(@directories, ".");
+# print "[directories]", Dumper(@directories), "\n";
$idlFiles = { };
foreach my $idlFile (@$interfaceIdlFiles) {
$idlFiles->{fileparse(basename($idlFile), ".idl")} = $idlFile;
}
+# use Data::Dumper;
+# print "[idlFiles]", Dumper($idlFiles), "\n";
my $wanted = sub {
+# print "<find> ", $File::Find::name, "\n";
$idlFiles->{$1} = $File::Find::name if /^([A-Z].*)\.idl$/;
$File::Find::prune = 1 if /^\../;
};
find($wanted, @directories);
+# print "[idlFiles]", scalar(keys($idlFiles)), "\n";
}
return $idlFiles->{$interfaceName};
@@ -297,7 +305,10 @@ sub ParseInterface
my $filename = IDLFileForInterface($interfaceName)
or die("Could NOT find IDL file for interface \"$interfaceName\" $!\n");
- print " | |> Parsing parent IDL \"$filename\" for interface \"$interfaceName\"\n" if $verbose;
+# use Carp qw(cluck);
+# cluck "HEY";
+# print " | |> Parsing parent IDL \"$filename\" for interface \"$interfaceName\"\n" if $verbose;
+ print " | |> Parsing $interfaceName ( $filename )\n";
# Step #2: Parse the found IDL file (in quiet mode).
my $parser = deprecated_idl_parser->new(1);
@@ -318,6 +329,11 @@ sub GenerateInterface
my $object = shift;
my $interface = shift;
+ print "[GenerateInterface] ", $interface->name, "\n";
+# ForAllParents($interface, sub {
+# my $parent = shift;
+# print " - ", $parent->name, "\n"
+# });
%callbackFunctionTypeHash = map { $_->name => $_ } @{$idlDocument->callbackFunctions};
%enumTypeHash = map { $_->name => $_->values } @{$idlDocument->enumerations};
my $v8ClassName = GetV8ClassName($interface);
@@ -392,6 +408,10 @@ sub AddToImplIncludes
{
my $header = shift;
$implIncludes{$header} = 1;
+ if($header eq "core/svg/properties/SVGAnimatedPropertyTearOff.h") {
+# use Carp qw(cluck);
+# cluck "HEY";
+ }
}
sub AddToHeaderIncludes
@@ -403,6 +423,7 @@ sub AddToHeaderIncludes
}
}
+### DONE
sub SkipIncludeHeader
{
my $type = shift;
@@ -417,6 +438,7 @@ sub SkipIncludeHeader
sub AddIncludesForType
{
my $type = shift;
+# print "BEBE AddIncludesForType ", $type, "\n";
return if SkipIncludeHeader($type);
@@ -439,23 +461,31 @@ sub HeaderFilesForInterface
my $interfaceName = shift;
my $implClassName = shift;
+ use Data::Dumper;
my @includes = ();
if (IsTypedArrayType($interfaceName)) {
+ ### DONE
push(@includes, "wtf/${interfaceName}.h");
} elsif (!SkipIncludeHeader($interfaceName)) {
+ ### DONE
my $idlFilename = IDLFileForInterface($interfaceName) or die("Could NOT find IDL file for interface \"$interfaceName\" $!\n");
my $idlRelPath= "bindings/" . File::Spec->abs2rel($idlFilename, $sourceRoot);
+# print "GEHEHE ", $idlRelPath, "\n";
+# print "GEHEHE ", dirname($idlRelPath), "\n";
push(@includes, dirname($idlRelPath) . "/" . $implClassName . ".h");
}
+# print "[HeaderFilesForInterface]", Dumper(@includes);
return @includes;
}
+### DONE
sub NeedsOpaqueRootForGC
{
my $interface = shift;
return $interface->extendedAttributes->{"GenerateIsReachable"} || $interface->extendedAttributes->{"CustomIsReachable"};
}
+### DONE
sub GenerateOpaqueRootForGC
{
my $interface = shift;
@@ -489,6 +519,7 @@ END
$implementation{nameSpaceWebCore}->add($code);
}
+### DONE
sub GetSVGPropertyTypes
{
my $implType = shift;
@@ -596,7 +627,12 @@ sub GenerateHeader
LinkOverloadedFunctions($interface);
# Ensure the IsDOMNodeType function is in sync.
- die("IsDOMNodeType is out of date with respect to $interfaceName") if IsDOMNodeType($interfaceName) != InheritsInterface($interface, "Node");
+# my $_dom = IsDOMNodeType($interfaceName) ? "DOM" : "";
+# my $_inh = InheritsInterface($interface, "Node") ? "INH" : "";
+# print "[DOMDOM] $_dom $_inh ", $interface->name, "\n";
+ if(IsDOMNodeType($interfaceName) != InheritsInterface($interface, "Node")) {
+ die("IsDOMNodeType is out of date with respect to $interfaceName")
+ }
my ($svgPropertyType, $svgListPropertyType, $svgNativeType) = GetSVGPropertyTypes($interfaceName);
@@ -610,6 +646,7 @@ sub GenerateHeader
$header{includes}->add("#include \"${headerInclude}\"\n");
}
+ ### DONE
$header{nameSpaceWebCore}->addHeader("\ntemplate<typename PropertyType> class SVGPropertyTearOff;\n") if $svgPropertyType;
if ($svgNativeType) {
if ($svgNativeType =~ /SVGStaticListPropertyTearOff/) {
@@ -619,8 +656,10 @@ sub GenerateHeader
}
}
+ ### DONE
$header{nameSpaceWebCore}->addHeader("\nclass Dictionary;") if IsConstructorTemplate($interface, "Event");
+ ### impl_class_name and svg_type_needing_tear_off in python generator
my $nativeType = GetNativeTypeForConversions($interface);
if ($interface->extendedAttributes->{"NamedConstructor"}) {
$header{nameSpaceWebCore}->addHeader(<<END);
@@ -672,6 +711,7 @@ END
next if $name eq "";
my $attrExt = $function->extendedAttributes;
+# if (HasCustomMethod($attrExt) && !$attrExt->{"ImplementedBy"} && $function->{overloadIndex} == 1) {
if (HasCustomMethod($attrExt) && $function->{overloadIndex} == 1) {
my $conditionalString = GenerateConditionalString($function);
$header{classPublic}->add("#if ${conditionalString}\n") if $conditionalString;
@@ -698,14 +738,16 @@ END
my $name = $attribute->name;
my $attrExt = $attribute->extendedAttributes;
my $conditionalString = GenerateConditionalString($attribute);
- if (HasCustomGetter($attrExt) && !$attrExt->{"ImplementedBy"}) {
+# if (HasCustomGetter($attrExt) && !$attrExt->{"ImplementedBy"}) {
+ if (HasCustomGetter($attrExt)) {
$header{classPublic}->add("#if ${conditionalString}\n") if $conditionalString;
$header{classPublic}->add(<<END);
static void ${name}AttrGetterCustom(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>&);
END
$header{classPublic}->add("#endif // ${conditionalString}\n") if $conditionalString;
}
- if (HasCustomSetter($attrExt) && !$attrExt->{"ImplementedBy"}) {
+# if (HasCustomSetter($attrExt) && !$attrExt->{"ImplementedBy"}) {
+ if (HasCustomSetter($attrExt)) {
$header{classPublic}->add("#if ${conditionalString}\n") if $conditionalString;
$header{classPublic}->add(<<END);
static void ${name}AttrSetterCustom(v8::Local<v8::String> name, v8::Local<v8::Value>, const v8::PropertyCallbackInfo<void>&);
@@ -1192,6 +1234,7 @@ static void ${implClassName}ConstructorGetter(v8::Local<v8::String> name, const
END
}
+### macro get_feature_observation_parameter in template
sub GenerateFeatureObservation
{
my $measureAs = shift;
@@ -1204,6 +1247,7 @@ sub GenerateFeatureObservation
return "";
}
+### macro deprecation_notification_parameter in template
sub GenerateDeprecationNotification
{
my $deprecateAs = shift;
@@ -1215,6 +1259,7 @@ sub GenerateDeprecationNotification
return "";
}
+### DONE
sub GenerateActivityLogging
{
my $accessType = shift;
@@ -1268,25 +1313,32 @@ sub GenerateNormalAttrGetterCallback
my $attrExt = $attribute->extendedAttributes;
my $attrName = $attribute->name;
+ ### DONE
my $conditionalString = GenerateConditionalString($attribute);
my $code = "";
$code .= "#if ${conditionalString}\n\n" if $conditionalString;
$code .= "static void ${attrName}AttrGetterCallback${forMainWorldSuffix}(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info)\n";
$code .= "{\n";
+ ### DONE
$code .= " TRACE_EVENT_SET_SAMPLING_STATE(\"Blink\", \"DOMGetter\");\n";
$code .= GenerateFeatureObservation($attrExt->{"MeasureAs"});
+ ### DONE
$code .= GenerateDeprecationNotification($attrExt->{"DeprecateAs"});
+ ### DONE
if (HasActivityLogging($forMainWorldSuffix, $attrExt, "Getter")) {
$code .= GenerateActivityLogging("Getter", $interface, "${attrName}");
}
if (HasCustomGetter($attrExt)) {
+ ### DONE
$code .= " ${v8ClassName}::${attrName}AttrGetterCustom(name, info);\n";
} else {
+ ### TODO
$code .= " ${implClassName}V8Internal::${attrName}AttrGetter${forMainWorldSuffix}(name, info);\n";
}
$code .= " TRACE_EVENT_SET_SAMPLING_STATE(\"V8\", \"Execution\");\n";
$code .= "}\n\n";
+ ### DONE
$code .= "#endif // ${conditionalString}\n\n" if $conditionalString;
$implementation{nameSpaceInternal}->add($code);
@@ -1298,6 +1350,7 @@ sub GenerateNormalAttrGetter
my $interface = shift;
my $forMainWorldSuffix = shift;
+print " [GenerateNormalAttrGetter]", $attribute->type, " ", $attribute->name, "\n";
my $interfaceName = $interface->name;
my $implClassName = GetImplName($interface);
my $v8ClassName = GetV8ClassName($interface);
@@ -1320,7 +1373,9 @@ sub GenerateNormalAttrGetter
static void ${attrName}AttrGetter${forMainWorldSuffix}(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info)
{
END
+ ### First, get impl_class instance
if ($svgNativeType) {
+ ### TODO
my $svgWrappedNativeType = GetSVGWrappedTypeNeedingTearOff($interfaceName);
if ($svgWrappedNativeType =~ /List/) {
$code .= <<END;
@@ -1334,6 +1389,7 @@ END
END
}
} elsif ($attrExt->{"OnProto"} || $attrExt->{"Unforgeable"}) {
+ ### TODO
if ($interfaceName eq "Window") {
$code .= <<END;
v8::Handle<v8::Object> holder = info.Holder();
@@ -1350,6 +1406,7 @@ END
${implClassName}* imp = ${v8ClassName}::toNative(holder);
END
} else {
+ ### DONE
my $reflect = $attribute->extendedAttributes->{"Reflect"};
my $url = $attribute->extendedAttributes->{"URL"};
if ($reflect && !$url && InheritsInterface($interface, "Node") && $attrType eq "DOMString") {
@@ -1375,12 +1432,14 @@ END
END
}
if (!$attribute->isStatic) {
+ ### generally this is taken.
$code .= <<END;
${implClassName}* imp = ${v8ClassName}::toNative(info.Holder());
END
}
}
+ ### DONE
# Generate security checks if necessary
if ($attribute->extendedAttributes->{"CheckSecurityForNode"}) {
AddToImplIncludes("bindings/v8/BindingSecurity.h");
@@ -1429,13 +1488,17 @@ END
$code .= " return;\n";
}
+ ### TODO: always use intermediate variable v!
if ($useExceptions || $isNullable) {
if ($nativeType =~ /^V8StringResource/) {
+ ### is it necessary???
$code .= " " . ConvertToV8StringResource($attribute, $nativeType, "v", $getterString) . ";\n";
} else {
+ # Done
$code .= " $nativeType v = $getterString;\n";
}
+ ### DONE
if ($isNullable) {
$code .= " if (isNull) {\n";
$code .= " v8SetReturnValueNull(info);\n";
@@ -1444,12 +1507,14 @@ END
}
if ($useExceptions) {
+ ### DONE
if ($useExceptions) {
$code .= " if (UNLIKELY(es.throwIfNeeded()))\n";
$code .= " return;\n";
}
if (ExtendedAttributeContains($attribute->extendedAttributes->{"CallWith"}, "ScriptState")) {
+ ### TODO
$code .= " if (state.hadException()) {\n";
$code .= " throwError(state.exception());\n";
$code .= " return;\n";
@@ -1457,6 +1522,7 @@ END
}
}
+ ## getter_expression in python
$expression = "v";
$expression .= ".release()" if (IsRefPtrType($returnType));
} else {
@@ -1466,7 +1532,10 @@ END
$expression = "static_pointer_cast<SVGAnimatedEnumeration>($expression)" if $returnType eq "SVGAnimatedEnumeration";
}
+# print "[BAR] ", $expression, "\n" if $interface->name eq "WebKitSourceBuffer";
+ ### FIXME: remove this special case!
if (ShouldKeepAttributeAlive($interface, $attribute, $returnType)) {
+ ### DONE
my $arrayType = GetArrayType($returnType);
if ($arrayType) {
AddIncludeForType("V8$arrayType.h");
@@ -1482,6 +1551,7 @@ END
# Check for a wrapper in the wrapper cache. If there is one, we know that a hidden reference has already
# been created. If we don't find a wrapper, we create both a wrapper and a hidden reference.
my $nativeReturnType = GetNativeType($returnType);
+ # getterString is native_value_expression in python generator
my $v8ReturnType = "V8" . $returnType;
$code .= " $nativeReturnType result = ${getterString};\n";
if ($forMainWorldSuffix) {
@@ -1503,6 +1573,7 @@ END
}
if ((IsSVGAnimatedType($interfaceName) or $interfaceName eq "SVGViewSpec") and IsSVGTypeNeedingTearOff($attrType)) {
+ ### DONE
AddToImplIncludes("V8$attrType.h");
my $svgNativeType = GetSVGTypeNeedingTearOff($attrType);
# Convert from abstract SVGProperty to real type, so the right toJS() method can be invoked.
@@ -1513,6 +1584,7 @@ END
}
$code .= " return;\n";
} elsif (IsSVGTypeNeedingTearOff($attrType) and not $interfaceName =~ /List$/) {
+ ### DONE
AddToImplIncludes("V8$attrType.h");
AddToImplIncludes("core/svg/properties/SVGPropertyTearOff.h");
my $tearOffType = GetSVGTypeNeedingTearOff($attrType);
@@ -1550,6 +1622,7 @@ END
}
$code .= " return;\n";
} elsif ($attribute->type eq "SerializedScriptValue" && $attrExt->{"CachedAttribute"}) {
+ ### DONE
my $getterFunc = ToMethodName($attribute->name);
$code .= <<END;
RefPtr<SerializedScriptValue> serialized = imp->${getterFunc}();
@@ -1559,6 +1632,7 @@ END
return;
END
} elsif ($attribute->type eq "EventHandler") {
+ ### DONE
AddToImplIncludes("bindings/v8/V8AbstractEventListener.h");
my $getterFunc = ToMethodName($attribute->name);
# FIXME: Pass the main world ID for main-world-only getters.
@@ -1566,6 +1640,7 @@ END
$code .= " v8SetReturnValue(info, listener ? v8::Handle<v8::Value>(V8AbstractEventListener::cast(listener)->getListenerObject(imp->scriptExecutionContext())) : v8::Handle<v8::Value>(v8::Null(info.GetIsolate())));\n";
$code .= " return;\n";
} else {
+ ### main
my $nativeValue = NativeToJSValue($attribute->type, $attribute->extendedAttributes, $expression, " ", "", "info.Holder()", "info.GetIsolate()", "info", "imp", $forMainWorldSuffix, "return");
$code .= "${nativeValue}\n";
$code .= " return;\n";
@@ -1607,9 +1682,11 @@ sub ShouldKeepAttributeAlive
return 0 if $returnType =~ /SVG/;
return 0 if $returnType =~ /HTML/;
+# print "[FOO] ", $returnType, "\n";
return 1;
}
+### TODO
sub GenerateReplaceableAttrSetterCallback
{
my $interface = shift;
@@ -1659,6 +1736,7 @@ END
$implementation{nameSpaceInternal}->add($code);
}
+### DONE ... macro custom_element_invocation in python
sub GenerateCustomElementInvocationScopeIfNeeded
{
my $code = "";
@@ -1693,24 +1771,34 @@ sub GenerateNormalAttrSetterCallback
my $conditionalString = GenerateConditionalString($attribute);
my $code = "";
+ ### DONE
$code .= "#if ${conditionalString}\n\n" if $conditionalString;
$code .= "static void ${attrName}AttrSetterCallback${forMainWorldSuffix}(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<void>& info)\n";
$code .= "{\n";
+ ### DONE
$code .= " TRACE_EVENT_SET_SAMPLING_STATE(\"Blink\", \"DOMSetter\");\n";
+ ### DONE
$code .= GenerateFeatureObservation($attrExt->{"MeasureAs"});
+ ### DONE
$code .= GenerateDeprecationNotification($attrExt->{"DeprecateAs"});
+ ### DONE
if (HasActivityLogging($forMainWorldSuffix, $attrExt, "Setter")) {
$code .= GenerateActivityLogging("Setter", $interface, "${attrName}");
}
+ ### DONE
$code .= GenerateCustomElementInvocationScopeIfNeeded($attrExt);
if (HasCustomSetter($attrExt)) {
+ ### DONE
$code .= " ${v8ClassName}::${attrName}AttrSetterCustom(name, value, info);\n";
} else {
+ ### DONE
$code .= " ${implClassName}V8Internal::${attrName}AttrSetter${forMainWorldSuffix}(name, value, info);\n";
}
+ ### DONE
$code .= " TRACE_EVENT_SET_SAMPLING_STATE(\"V8\", \"Execution\");\n";
$code .= "}\n\n";
+ ### DONE
$code .= "#endif // ${conditionalString}\n\n" if $conditionalString;
$implementation{nameSpaceInternal}->add($code);
}
@@ -1743,6 +1831,7 @@ sub GenerateNormalAttrSetter
# thrown rather than silently passing NULL to the C++ code.
# Per the Web IDL and ECMAScript specifications, incoming values can always be converted to both
# strings and numbers, so do not throw TypeError if the attribute is of these types.
+ ### TODO
if ($attribute->extendedAttributes->{"StrictTypeChecking"}) {
my $argType = $attribute->type;
if (IsWrapperType($argType)) {
@@ -1755,6 +1844,7 @@ sub GenerateNormalAttrSetter
my $svgNativeType = GetSVGTypeNeedingTearOff($interfaceName);
if ($svgNativeType) {
+ ### TODO
my $svgWrappedNativeType = GetSVGWrappedTypeNeedingTearOff($interfaceName);
if ($svgWrappedNativeType =~ /List$/) {
$code .= <<END;
@@ -1771,10 +1861,12 @@ END
$code .= " $svgWrappedNativeType* imp = &impInstance;\n";
}
} elsif ($attrExt->{"OnProto"}) {
+ ### TODO
$code .= <<END;
${implClassName}* imp = ${v8ClassName}::toNative(info.Holder());
END
} else {
+ ### main path
my $reflect = $attribute->extendedAttributes->{"Reflect"};
if ($reflect && InheritsInterface($interface, "Node") && $attrType eq "DOMString") {
# Generate super-compact call for regular attribute setter:
@@ -1800,14 +1892,17 @@ END
my $nativeType = GetNativeType($attribute->type, $attribute->extendedAttributes, "parameter");
if ($attribute->type eq "EventHandler") {
+ ### DONE
if ($interface->name eq "Window") {
$code .= " if (!imp->document())\n";
$code .= " return;\n";
}
} else {
+ ### DONE
$code .= JSValueToNativeStatement($attribute->type, $attribute->extendedAttributes, "value", "v", " ", "info.GetIsolate()");
}
+ ### TODO
if (IsEnumType($attrType)) {
# setter ignores invalid enumeration values
my @enumValues = ValidEnumValues($attrType);
@@ -1954,6 +2049,7 @@ sub GenerateParametersCheckExpression
# As per Web IDL specification, the length of a function Object is
# its number of mandatory parameters.
+### get_function_mandatory_parameters in python generator
sub GetFunctionLength
{
my $function = shift;
@@ -1993,6 +2089,7 @@ sub GenerateFunctionParametersCheck
return ($numMandatoryParams, join(" || ", @orExpression));
}
+### TODO
sub GenerateOverloadedFunction
{
my $function = shift;
@@ -2063,8 +2160,11 @@ static void ${name}MethodCallback${forMainWorldSuffix}(const v8::FunctionCallbac
{
END
$code .= " TRACE_EVENT_SET_SAMPLING_STATE(\"Blink\", \"DOMMethod\");\n";
+ ### DONE
$code .= GenerateFeatureObservation($function->extendedAttributes->{"MeasureAs"});
+ ### DONE
$code .= GenerateDeprecationNotification($function->extendedAttributes->{"DeprecateAs"});
+ ### DONE
if (HasActivityLogging($forMainWorldSuffix, $function->extendedAttributes, "Access")) {
$code .= GenerateActivityLogging("Method", $interface, "${name}");
}
@@ -2079,8 +2179,10 @@ END
$implementation{nameSpaceInternal}->add($code);
}
+### __FUNC__
sub GenerateFunction
{
+ print " [GenerateFunction]\n";
my $function = shift;
my $interface = shift;
my $forMainWorldSuffix = shift;
@@ -2108,6 +2210,7 @@ sub GenerateFunction
$code .= "{\n";
if ($name eq "addEventListener" || $name eq "removeEventListener") {
+ ### TODO
my $lookupType = ($name eq "addEventListener") ? "OrCreate" : "Only";
my $passRefPtrHandling = ($name eq "addEventListener") ? "" : ".get()";
my $hiddenDependencyAction = ($name eq "addEventListener") ? "create" : "remove";
@@ -2140,9 +2243,11 @@ END
return;
}
+ ### DONE
$code .= GenerateArgumentsCountCheck($function, $interface);
if ($name eq "set" and IsConstructorTemplate($interface, "TypedArray")) {
+ ### TODO
AddToImplIncludes("bindings/v8/custom/V8ArrayBufferViewCustom.h");
$code .= <<END;
setWebGLArrayHelper<$implClassName, ${v8ClassName}>(args);
@@ -2153,8 +2258,10 @@ END
return;
}
+ ### TODO
my ($svgPropertyType, $svgListPropertyType, $svgNativeType) = GetSVGPropertyTypes($interfaceName);
+ ### TODO
if ($svgNativeType) {
my $nativeClassName = GetNativeType($interfaceName);
if ($interfaceName =~ /List$/) {
@@ -2172,14 +2279,17 @@ END
$code .= " $svgWrappedNativeType* imp = &impInstance;\n";
}
} elsif (!$function->isStatic) {
+ ### main
$code .= <<END;
${implClassName}* imp = ${v8ClassName}::toNative(args.Holder());
END
}
+ ### TODO
$code .= GenerateCustomElementInvocationScopeIfNeeded($funcExt);
# Check domain security if needed
+ ### TODO
if ($interface->extendedAttributes->{"CheckSecurity"} && !$function->extendedAttributes->{"DoNotCheckSecurity"}) {
# We have not find real use cases yet.
AddToImplIncludes("core/page/Frame.h");
@@ -2190,6 +2300,7 @@ END
END
}
+ ### DONE
my $raisesExceptions = $function->extendedAttributes->{"RaisesException"};
if (!$raisesExceptions) {
foreach my $parameter (@{$function->parameters}) {
@@ -2199,11 +2310,13 @@ END
}
}
+ ### DONE
if ($raisesExceptions) {
AddToImplIncludes("bindings/v8/ExceptionState.h");
$code .= " ExceptionState es(args.GetIsolate());\n";
}
+ ### TODO
if ($function->extendedAttributes->{"CheckSecurityForNode"}) {
AddToImplIncludes("bindings/v8/BindingSecurity.h");
$code .= " if (!BindingSecurity::shouldAllowAccessToNode(imp->" . GetImplName($function) . "(es))) {\n";
@@ -2213,16 +2326,25 @@ END
END
}
+ ### main DONE
+ print " [GenerateParametersCheck]\n";
my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersCheck($function, $interface, $forMainWorldSuffix);
$code .= $parameterCheckString;
# Build the function call string.
+ ### TODO
+ ### main
+ if($paramIndex != @{$function->parameters}) {
+ ## Never
+ }
$code .= GenerateFunctionCallString($function, $paramIndex, " ", $interface, $forMainWorldSuffix, %replacements);
$code .= "}\n\n";
$code .= "#endif // ${conditionalString}\n\n" if $conditionalString;
$implementation{nameSpaceInternal}->add($code);
}
+### get_call_with_parameter and call_with_statements macro in python
+### DONE
sub GenerateCallWith
{
my $callWith = shift;
@@ -2259,6 +2381,7 @@ sub GenerateCallWith
return ([@callWithArgs], $code);
}
+### no corresponds function in python generator. write in template.
sub GenerateArgumentsCountCheck
{
my $function = shift;
@@ -2285,6 +2408,7 @@ sub GenerateArgumentsCountCheck
return $argumentsCountCheckString;
}
+### see macro.template
sub GenerateParametersCheck
{
my $function = shift;
@@ -2302,10 +2426,11 @@ sub GenerateParametersCheck
# Optional arguments without [Default=...] should generate an early call with fewer arguments.
# Optional arguments with [Optional=...] should not generate the early call.
# Optional Dictionary arguments always considered to have default of empty dictionary.
+ ### DONE early_call in python
if ($parameter->isOptional && !$parameter->extendedAttributes->{"Default"} && $nativeType ne "Dictionary" && !IsCallbackInterface($parameter->type)) {
$parameterCheckString .= " if (args.Length() <= $paramIndex)";
my $functionCall = GenerateFunctionCallString($function, $paramIndex, " " x 2, $interface, $forMainWorldSuffix, %replacements);
- my $multiLine = ($functionCall =~ tr/\n//) > 1;
+ my $multiLine = ($functionCall =~ tr/\n//) > 1; # always true
$parameterCheckString .= $multiLine ? " {\n" : "\n";
$parameterCheckString .= $functionCall;
$parameterCheckString .= $multiLine ? " }\n" : "\n";
@@ -2317,6 +2442,7 @@ sub GenerateParametersCheck
my $v8ClassName = "V8" . $parameter->type;
AddToImplIncludes("$v8ClassName.h");
if ($parameter->isOptional) {
+ ### DONE
$parameterCheckString .= " RefPtr<" . $parameter->type . "> $parameterName;\n";
$parameterCheckString .= " if (args.Length() > $paramIndex && !args[$paramIndex]->IsNull() && !args[$paramIndex]->IsUndefined()) {\n";
$parameterCheckString .= " if (!args[$paramIndex]->IsFunction()) {\n";
@@ -2326,6 +2452,7 @@ sub GenerateParametersCheck
$parameterCheckString .= " $parameterName = ${v8ClassName}::create(args[$paramIndex], getScriptExecutionContext());\n";
$parameterCheckString .= " }\n";
} else {
+ ### was DONE ?
$parameterCheckString .= " if (args.Length() <= $paramIndex || ";
if ($parameter->isNullable) {
$parameterCheckString .= "!(args[$paramIndex]->IsFunction() || args[$paramIndex]->IsNull())";
@@ -2341,6 +2468,7 @@ sub GenerateParametersCheck
$parameterCheckString .= "${v8ClassName}::create(args[$paramIndex], getScriptExecutionContext());\n";
}
} elsif ($parameter->extendedAttributes->{"Clamp"}) {
+ ### DONE
my $nativeValue = "${parameterName}NativeValue";
my $paramType = $parameter->type;
$parameterCheckString .= " $paramType $parameterName = 0;\n";
@@ -2348,15 +2476,17 @@ sub GenerateParametersCheck
$parameterCheckString .= " if (!std::isnan($nativeValue))\n";
$parameterCheckString .= " $parameterName = clampTo<$paramType>($nativeValue);\n";
} elsif ($parameter->type eq "SerializedScriptValue") {
+ ### DONE
AddToImplIncludes("bindings/v8/SerializedScriptValue.h");
$parameterCheckString .= " bool ${parameterName}DidThrow = false;\n";
$parameterCheckString .= " $nativeType $parameterName = SerializedScriptValue::create(args[$paramIndex], 0, 0, ${parameterName}DidThrow, args.GetIsolate());\n";
$parameterCheckString .= " if (${parameterName}DidThrow)\n";
$parameterCheckString .= " return;\n";
} elsif ($parameter->isVariadic) {
+ ### DONE
my $nativeElementType = GetNativeType($parameter->type);
if ($nativeElementType =~ />$/) {
- $nativeElementType .= " ";
+ $nativeElementType .= " "; # TODO
}
my $argType = $parameter->type;
@@ -2373,6 +2503,7 @@ sub GenerateParametersCheck
$parameterCheckString .= " V8TRYCATCH_VOID(Vector<$nativeElementType>, $parameterName, toNativeArguments<$nativeElementType>(args, $paramIndex));\n";
}
} elsif ($nativeType =~ /^V8StringResource/) {
+ ### DONE
my $default = defined $parameter->extendedAttributes->{"Default"} ? $parameter->extendedAttributes->{"Default"} : "";
my $jsValue = $parameter->isOptional && $default eq "NullString" ? "argumentOrNull(args, $paramIndex)" : "args[$paramIndex]";
$parameterCheckString .= JSValueToNativeStatement($parameter->type, $parameter->extendedAttributes, $jsValue, $parameterName, " ", "args.GetIsolate()");
@@ -2417,6 +2548,7 @@ sub GenerateParametersCheck
}
}
+ ### DONE
if ($parameter->extendedAttributes->{"IsIndex"}) {
AddToImplIncludes("core/dom/ExceptionCode.h");
$parameterCheckString .= " if (UNLIKELY($parameterName < 0)) {\n";
@@ -2427,6 +2559,8 @@ sub GenerateParametersCheck
$paramIndex++;
}
+ print "PARAM STRING\n", $parameterCheckString, "\n" if $interface->name eq "CanvasGradient";
+ # $paramIndex == len(parameters)
return ($parameterCheckString, $paramIndex, %replacements);
}
@@ -2464,6 +2598,8 @@ END
$implementation{nameSpaceInternal}->add($code);
}
+### get_single_constructor_callback_parameter in python code generator
+### DONE
sub GenerateSingleConstructorCallback
{
my $interface = shift;
@@ -2476,14 +2612,15 @@ sub GenerateSingleConstructorCallback
$overloadedIndexString .= $function->overloadedIndex;
}
- my $raisesExceptions = $function->extendedAttributes->{"RaisesException"};
+ my $raisesExceptions = $function->extendedAttributes->{"RaisesException"}; ### never be true!
if ($interface->extendedAttributes->{"ConstructorRaisesException"}) {
- $raisesExceptions = 1;
+ $raisesExceptions = 1; ### exist
}
if (!$raisesExceptions) {
foreach my $parameter (@{$function->parameters}) {
if ($parameter->extendedAttributes->{"IsIndex"}) {
$raisesExceptions = 1;
+ # Never executed!
}
}
}
@@ -2581,6 +2718,7 @@ sub GetInterfaceLength
return $leastConstructorLength;
}
+### DONE
sub GenerateConstructorCallback
{
my $interface = shift;
@@ -2591,8 +2729,11 @@ sub GenerateConstructorCallback
$code .= "void ${v8ClassName}::constructorCallback(const v8::FunctionCallbackInfo<v8::Value>& args)\n";
$code .= "{\n";
$code .= " TRACE_EVENT_SCOPED_SAMPLING_STATE(\"Blink\", \"DOMConstructor\");\n";
+ ### DONE
$code .= GenerateFeatureObservation($interface->extendedAttributes->{"MeasureAs"});
+ ### DONE
$code .= GenerateDeprecationNotification($interface->extendedAttributes->{"DeprecateAs"});
+ ### DONE
$code .= GenerateConstructorHeader();
if (HasCustomConstructor($interface)) {
$code .= " ${v8ClassName}::constructorCustom(args);\n";
@@ -2608,8 +2749,10 @@ sub GenerateConstructor
my $interface = shift;
if (@{$interface->constructors} == 1) {
+ ### DONE
GenerateSingleConstructorCallback($interface, @{$interface->constructors}[0]);
} else {
+ ### TODO
foreach my $constructor (@{$interface->constructors}) {
GenerateSingleConstructorCallback($interface, $constructor);
}
@@ -2623,6 +2766,7 @@ sub GenerateEventConstructor
my $implClassName = GetImplName($interface);
my $v8ClassName = GetV8ClassName($interface);
+ ### TODO MERGE
my @anyAttributeNames;
my @serializableAnyAttributeNames;
foreach my $attribute (@{$interface->attributes}) {
@@ -2635,6 +2779,7 @@ sub GenerateEventConstructor
}
AddToImplIncludes("bindings/v8/Dictionary.h");
+ ### DONE
$implementation{nameSpaceInternal}->add(<<END);
static void constructor(const v8::FunctionCallbackInfo<v8::Value>& args)
{
@@ -2695,6 +2840,7 @@ END
}
END
+ ### DONE
my $code = "";
$code .= <<END;
bool fill${implClassName}Init(${implClassName}Init& eventInit, const Dictionary& options)
@@ -2710,6 +2856,7 @@ END
END
}
+ ### TODO
foreach my $attribute (@{$interface->attributes}) {
if ($attribute->extendedAttributes->{"InitializedByEventConstructor"}) {
if ($attribute->type ne "any") {
@@ -2735,6 +2882,7 @@ END
$implementation{nameSpaceWebCore}->add($code);
}
+### DONE
sub GenerateNamedConstructor
{
my $function = shift;
@@ -2742,13 +2890,17 @@ sub GenerateNamedConstructor
my $implClassName = GetImplName($interface);
my $v8ClassName = GetV8ClassName($interface);
+ # thif is always false here
my $raisesExceptions = $function->extendedAttributes->{"RaisesException"};
+# print "NEVER\n" if $raisesExceptions;
if ($interface->extendedAttributes->{"ConstructorRaisesException"}) {
$raisesExceptions = 1;
}
if (!$raisesExceptions) {
foreach my $parameter (@{$function->parameters}) {
if ($parameter->extendedAttributes->{"IsIndex"}) {
+ # NEVER!
+# print "NEVER\n";
$raisesExceptions = 1;
}
}
@@ -2769,6 +2921,7 @@ sub GenerateNamedConstructor
if (InheritsInterface($interface, "EventTarget")) {
$toEventTarget = "${v8ClassName}::toEventTarget";
}
+# print "GEHEHE", $interface->name, "\n";
AddToImplIncludes("core/page/Frame.h");
$implementation{nameSpaceWebCore}->add(<<END);
@@ -2781,10 +2934,14 @@ END
static void ${v8ClassName}ConstructorCallback(const v8::FunctionCallbackInfo<v8::Value>& args)
{
END
+ ### DONE
$code .= $maybeObserveFeature if $maybeObserveFeature;
+ ### DONE
$code .= $maybeDeprecateFeature if $maybeDeprecateFeature;
+ ### DONE
$code .= GenerateConstructorHeader();
AddToImplIncludes("V8Document.h");
+ ### DONE
$code .= <<END;
Document* document = currentDocument();
@@ -2794,22 +2951,28 @@ END
END
+ ### DONE
$code .= GenerateArgumentsCountCheck($function, $interface);
+ ### DONE
if ($raisesExceptions) {
AddToImplIncludes("bindings/v8/ExceptionState.h");
$code .= " ExceptionState es(args.GetIsolate());\n";
}
+ ### DONE
my ($parameterCheckString, $paramIndex, %replacements) = GenerateParametersCheck($function, $interface);
$code .= $parameterCheckString;
+ ### DONE
push(@beforeArgumentList, "document");
+ ### DONE
if ($interface->extendedAttributes->{"ConstructorRaisesException"}) {
push(@afterArgumentList, "es");
}
+ ### DONE
my @argumentList;
my $index = 0;
foreach my $parameter (@{$function->parameters}) {
@@ -2822,16 +2985,20 @@ END
$index++;
}
+ ### DONE
my $argumentString = join(", ", @beforeArgumentList, @argumentList, @afterArgumentList);
+ ### DONE
$code .= "\n";
$code .= " RefPtr<${implClassName}> impl = ${implClassName}::createForJSConstructor(${argumentString});\n";
$code .= " v8::Handle<v8::Object> wrapper = args.Holder();\n";
+ ### DONE
if ($interface->extendedAttributes->{"ConstructorRaisesException"}) {
$code .= " if (es.throwIfNeeded())\n";
$code .= " return;\n";
}
+ ### DONE
$code .= <<END;
V8DOMWrapper::associateObjectWithWrapper<${v8ClassName}>(impl.release(), &${v8ClassName}Constructor::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent);
@@ -2841,6 +3008,7 @@ END
END
$implementation{nameSpaceWebCore}->add($code);
+ ### DONE
$code = <<END;
v8::Handle<v8::FunctionTemplate> ${v8ClassName}Constructor::GetTemplate(v8::Isolate* isolate, WrapperWorldType currentWorldType)
{
@@ -2868,6 +3036,7 @@ END
$implementation{nameSpaceWebCore}->add($code);
}
+### DONE
sub GenerateConstructorHeader
{
AddToImplIncludes("bindings/v8/V8ObjectConstructor.h");
@@ -2903,6 +3072,7 @@ sub GenerateBatchedAttributeData
return $code;
}
+### get_single_batched_attribute in python
sub GenerateSingleBatchedAttribute
{
my $interface = shift;
@@ -3118,10 +3288,13 @@ END
return $code;
}
+### DONE
+# get_is_null_expression in python
sub GenerateIsNullExpression
{
my $type = shift;
my $variableName = shift;
+ ### DONE
if (IsUnionType($type)) {
my $types = $type->unionMemberTypes;
my @expression = ();
@@ -3133,6 +3306,7 @@ sub GenerateIsNullExpression
}
return join " && ", @expression;
}
+ ### DONE
if (IsRefPtrType($type)) {
return "!${variableName}";
} elsif ($type eq "DOMString") {
@@ -3178,11 +3352,14 @@ sub GenerateImplementationIndexedPropertyAccessors
if ($indexedGetterFunction) {
my $hasCustomIndexedGetter = $indexedGetterFunction->extendedAttributes->{"Custom"};
if (!$hasCustomIndexedGetter) {
+ ### working
GenerateImplementationIndexedPropertyGetter($interface, $indexedGetterFunction);
}
+ ### working
GenerateImplementationIndexedPropertyGetterCallback($interface, $hasCustomIndexedGetter);
}
+ ### TODO
my $indexedSetterFunction = GetIndexedSetterFunction($interface);
if ($indexedSetterFunction) {
my $hasCustomIndexedSetter = $indexedSetterFunction->extendedAttributes->{"Custom"};
@@ -3192,6 +3369,7 @@ sub GenerateImplementationIndexedPropertyAccessors
GenerateImplementationIndexedPropertySetterCallback($interface, $hasCustomIndexedSetter);
}
+ ### TODO
my $indexedDeleterFunction = GetIndexedDeleterFunction($interface);
if ($indexedDeleterFunction) {
my $hasCustomIndexedDeleter = $indexedDeleterFunction->extendedAttributes->{"Custom"};
@@ -3201,13 +3379,16 @@ sub GenerateImplementationIndexedPropertyAccessors
GenerateImplementationIndexedPropertyDeleterCallback($interface, $hasCustomIndexedDeleter);
}
+ ### DONE
my $indexedEnumeratorFunction = $indexedGetterFunction;
$indexedEnumeratorFunction = 0 if $indexedGetterFunction && $indexedGetterFunction->extendedAttributes->{"NotEnumerable"};
+ ### DONE
my $indexedQueryFunction = 0;
# If there is an enumerator, there MUST be a query method to properly communicate property attributes.
my $hasQuery = $indexedQueryFunction || $indexedEnumeratorFunction;
+ ### DONE
my $setOn = "Instance";
# V8 has access-check callback API (see ObjectTemplate::SetAccessCheckCallbacks) and it's used on Window
@@ -3218,6 +3399,7 @@ sub GenerateImplementationIndexedPropertyAccessors
$setOn = "Prototype";
}
+ ### DONE
my $code = "";
if ($indexedGetterFunction || $indexedSetterFunction || $indexedDeleterFunction || $indexedEnumeratorFunction || $hasQuery) {
$code .= " desc->${setOn}Template()->SetIndexedPropertyHandler(${implClassName}V8Internal::indexedPropertyGetterCallback";
@@ -3243,26 +3425,35 @@ sub GenerateImplementationIndexedPropertyGetter
my $nativeType = GetNativeType($returnType);
my $nativeValue = "element";
$nativeValue .= ".release()" if (IsRefPtrType($returnType));
+ ### DONE
my $isNull = GenerateIsNullExpression($returnType, "element");
+ ### DONE
my $returnJSValueCode = NativeToJSValue($indexedGetterFunction->type, $indexedGetterFunction->extendedAttributes, $nativeValue, " ", "", "info.Holder()", "info.GetIsolate()", "info", "collection", "", "return");
my $raisesExceptions = $indexedGetterFunction->extendedAttributes->{"RaisesException"};
+ ### DONE
my $methodCallCode = GenerateMethodCall($returnType, "element", "collection->${methodName}", "index", $raisesExceptions);
+ ### DONE
my $getterCode = "static void indexedPropertyGetter(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info)\n";
$getterCode .= "{\n";
$getterCode .= " ASSERT(V8DOMWrapper::maybeDOMWrapper(info.Holder()));\n";
$getterCode .= " ${implClassName}* collection = ${v8ClassName}::toNative(info.Holder());\n";
+ ### DONE
if ($raisesExceptions) {
$getterCode .= " ExceptionState es(info.GetIsolate());\n";
}
+ ### DONE but use function_call later
$getterCode .= $methodCallCode . "\n";
+ ### DONE
if ($raisesExceptions) {
$getterCode .= " if (es.throwIfNeeded())\n";
$getterCode .= " return;\n";
}
if (IsUnionType($returnType)) {
+ ### TDOO
$getterCode .= "${returnJSValueCode}\n";
$getterCode .= " return;\n";
} else {
+ ### DONE
$getterCode .= " if (${isNull})\n";
$getterCode .= " return;\n";
$getterCode .= $returnJSValueCode . "\n";
@@ -3365,6 +3556,7 @@ sub GenerateImplementationIndexedPropertySetter
}
push @conditions, "";
push @statements, "collection->${methodName}(index, propertyValue$extraArguments);";
+ # TODO
$code .= GenerateIfElseStatement("bool", "result", \@conditions, \@statements);
$code .= " if (!result)\n";
@@ -3548,6 +3740,8 @@ sub GenerateImplementationNamedPropertyQueryCallback
$implementation{nameSpaceInternal}->add($code);
}
+### TODO: use js_value_to_native
+### get_function_call_statements in python
sub GenerateMethodCall
{
my $returnType = shift; # string or UnionType
@@ -3794,6 +3988,7 @@ static void namedPropertyQuery(v8::Local<v8::String> name, const v8::PropertyCal
END
}
+### TODO 7/16
sub GenerateImplementationLegacyCall
{
my $interface = shift;
@@ -3819,6 +4014,7 @@ sub GenerateImplementationMasqueradesAsUndefined
return $code;
}
+# __IMPL__
sub GenerateImplementation
{
my $object = shift;
@@ -3852,6 +4048,7 @@ sub GenerateImplementation
}
my $parentClassInfo = $parentClass ? "&${parentClass}::info" : "0";
+ ### only DOMException isException==True
my $WrapperTypePrototype = $interface->isException ? "WrapperTypeErrorPrototype" : "WrapperTypeObjectPrototype";
if (!IsSVGTypeNeedingTearOff($interfaceName)) {
@@ -3919,41 +4116,56 @@ END
AddToImplIncludes("bindings/v8/SerializedScriptValue.h");
}
+ ### DONE
GenerateNormalAttrGetter($attribute, $interface, "");
+ ### DONE
GenerateNormalAttrGetterCallback($attribute, $interface, "");
if ($attrExt->{"PerWorldBindings"}) {
+ ### DONE
GenerateNormalAttrGetter($attribute, $interface, "ForMainWorld");
+ ### DONE
GenerateNormalAttrGetterCallback($attribute, $interface, "ForMainWorld");
}
if (!HasCustomSetter($attrExt) && $attrExt->{"Replaceable"}) {
+ ### TODO
$hasReplaceable = 1;
} elsif (!IsReadonly($attribute)) {
+ ### DONE(basic)
GenerateNormalAttrSetter($attribute, $interface, "");
+ ### DONE
GenerateNormalAttrSetterCallback($attribute, $interface, "");
if ($attrExt->{"PerWorldBindings"}) {
+ ### DONE(basic)
GenerateNormalAttrSetter($attribute, $interface, "ForMainWorld");
+ ### DONE
GenerateNormalAttrSetterCallback($attribute, $interface, "ForMainWorld");
}
}
}
if ($hasConstructors) {
+ ### TODO
GenerateConstructorGetter($interface);
}
if ($hasConstructors || $hasReplaceable) {
+ ### TODO
GenerateReplaceableAttrSetter($interface);
+ ### TODO
GenerateReplaceableAttrSetterCallback($interface);
}
if (NeedsOpaqueRootForGC($interface)) {
+ ### DONE
GenerateOpaqueRootForGC($interface);
}
if ($interface->extendedAttributes->{"CheckSecurity"} && $interface->name ne "Window") {
+ ### TODO
GenerateSecurityCheckFunctions($interface);
}
+ ### TODO
if (IsConstructorTemplate($interface, "TypedArray")) {
my ($nativeType, $arrayType) = GetNativeTypeOfTypedArray($interface);
$implementation{nameSpaceWebCore}->add(<<END);
@@ -3975,19 +4187,24 @@ END
# Generate methods for functions.
foreach my $function (@{$interface->functions}) {
next if $function->name eq "";
+ ### DONE (basic)
GenerateFunction($function, $interface, "");
if ($function->extendedAttributes->{"PerWorldBindings"}) {
+ ### TODO
GenerateFunction($function, $interface, "ForMainWorld");
}
if ($function->{overloadIndex} == @{$function->{overloads}}) {
+ ### TODO
if ($function->{overloadIndex} > 1) {
GenerateOverloadedFunction($function, $interface, "");
if ($function->extendedAttributes->{"PerWorldBindings"}) {
GenerateOverloadedFunction($function, $interface, "ForMainWorld");
}
}
+ ### DONE
GenerateFunctionCallback($function, $interface, "");
if ($function->extendedAttributes->{"PerWorldBindings"}) {
+ ### TODO
GenerateFunctionCallback($function, $interface, "ForMainWorld");
}
}
@@ -3995,6 +4212,7 @@ END
# If the function does not need domain security check, we need to
# generate an access getter that returns different function objects
# for different calling context.
+ ### TODO
if ($interface->extendedAttributes->{"CheckSecurity"} && $function->extendedAttributes->{"DoNotCheckSecurity"}) {
if (!HasCustomMethod($function->extendedAttributes) || $function->{overloadIndex} == 1) {
GenerateDomainSafeFunctionGetter($function, $interface);
@@ -4004,6 +4222,7 @@ END
}
}
+ ### TODO
# Separate out functions that are enabled per context so we can process them specially.
if ($function->extendedAttributes->{"EnabledPerContext"}) {
push(@enabledPerContextFunctions, $function);
@@ -4013,6 +4232,7 @@ END
}
if ($needsDomainSafeFunctionSetter) {
+ ### TODO
GenerateDomainSafeFunctionSetter($interface);
}
@@ -4028,6 +4248,7 @@ END
my @normalAttributes;
foreach my $attribute (@$attributes) {
+ ### TODO
if ($interfaceName eq "Window" && $attribute->extendedAttributes->{"Unforgeable"}) {
push(@disallowsShadowing, $attribute);
} elsif ($attribute->extendedAttributes->{"EnabledAtRuntime"} || $attribute->extendedAttributes->{"EnabledPerContext"}) {
@@ -4044,6 +4265,7 @@ END
AddToImplIncludes("bindings/v8/V8DOMConfiguration.h");
$attributes = \@normalAttributes;
# Put the attributes that disallow shadowing on the shadow object.
+ ### DONE
if (@disallowsShadowing) {
my $code = "";
$code .= "static const V8DOMConfiguration::BatchedAttribute shadowAttrs[] = {\n";
@@ -4052,6 +4274,8 @@ END
$implementation{nameSpaceWebCore}->add($code);
}
+# use Data::Dumper;
+# print "GEHEHE", Dumper($attributes), "\n" if $interface->name eq "File";
my $has_attributes = 0;
if (@$attributes) {
$has_attributes = 1;
@@ -4106,13 +4330,16 @@ END
my $value = $constant->value;
my $attrExt = $constant->extendedAttributes;
my $implementedBy = $attrExt->{"ImplementedBy"};
+ ### DONE
if ($implementedBy) {
my $implementedByImplName = GetImplNameFromImplementedBy($implementedBy);
AddToImplIncludes(HeaderFilesForInterface($implementedBy, $implementedByImplName));
}
if ($attrExt->{"EnabledAtRuntime"}) {
+ ### TODO
push(@constantsEnabledAtRuntime, $constant);
} else {
+ ### DONE
my $conditionalString = GenerateConditionalString($constant);
$code .= "#if ${conditionalString}\n" if $conditionalString;
# If the value we're dealing with is a hex number, preprocess it into a signed integer
@@ -4132,24 +4359,31 @@ END
$implementation{nameSpaceWebCore}->add($code);
}
+ ### working
if (!HasCustomConstructor($interface)) {
if ($interface->extendedAttributes->{"NamedConstructor"}) {
+ ### DONE
GenerateNamedConstructor(@{$interface->constructors}[0], $interface);
} elsif ($interface->extendedAttributes->{"Constructor"}) {
+ ### DONE
GenerateConstructor($interface);
} elsif (IsConstructorTemplate($interface, "Event")) {
+ ### TODO
GenerateEventConstructor($interface);
}
}
if (IsConstructable($interface)) {
+ ### DONE
GenerateConstructorCallback($interface);
}
+ ### DONE
my $access_check = "";
if ($interface->extendedAttributes->{"CheckSecurity"} && $interfaceName ne "Window") {
$access_check = "instance->SetAccessCheckCallbacks(${implClassName}V8Internal::namedSecurityCheck, ${implClassName}V8Internal::indexedSecurityCheck, v8::External::New(&${v8ClassName}::info));";
}
+ ### TODO
# For the Window interface, generate the shadow object template
# configuration method.
if ($interfaceName eq "Window") {
@@ -4214,12 +4448,14 @@ END
UNUSED_PARAM(defaultSignature); // In some cases, it will not be used.
END
+ ### TODO
if (IsConstructable($interface)) {
$code .= " desc->SetCallHandler(${v8ClassName}::constructorCallback);\n";
my $interfaceLength = GetInterfaceLength($interface);
$code .= " desc->SetLength(${interfaceLength});\n";
}
+ ### DONE
if ($access_check or @enabledAtRuntimeAttributes or @normalFunctions or $has_constants) {
$code .= <<END;
v8::Local<v8::ObjectTemplate> instance = desc->InstanceTemplate();
@@ -4229,10 +4465,12 @@ END
END
}
+ ### DONE
if ($access_check) {
$code .= " $access_check\n";
}
+ ### DONE
# Setup the enable-at-runtime attrs if we have them
foreach my $runtime_attr (@enabledAtRuntimeAttributes) {
next if grep { $_ eq $runtime_attr } @enabledPerContextAttributes;
@@ -4249,6 +4487,7 @@ END
$code .= "\n#endif // ${conditionalString}\n" if $conditionalString;
}
+ ### DONE
# Setup the enable-at-runtime constants if we have them
foreach my $runtime_const (@constantsEnabledAtRuntime) {
my $enable_function = GetRuntimeEnableFunctionName($runtime_const);
@@ -4265,9 +4504,13 @@ END
$code .= "\n#endif // ${conditionalString}\n" if $conditionalString;
}
+ ### TODO
$code .= GenerateImplementationIndexedPropertyAccessors($interface);
+ ### TODO
$code .= GenerateImplementationNamedPropertyAccessors($interface);
+ ### TODO
$code .= GenerateImplementationLegacyCall($interface);
+ ### TODO
$code .= GenerateImplementationMasqueradesAsUndefined($interface);
# Define our functions with Set() or SetAccessor()
@@ -4279,12 +4522,14 @@ END
$total_functions++;
next if IsStandardFunction($interface, $function);
+ ### DONE
$code .= GenerateNonStandardFunction($interface, $function);
$num_callbacks++;
}
die "Wrong number of callbacks generated for $interfaceName ($num_callbacks, should be $total_functions)" if $num_callbacks != $total_functions;
+ ### DONE
if ($has_constants) {
$code .= <<END;
V8DOMConfiguration::batchConfigureConstants(desc, proto, ${v8ClassName}Consts, WTF_ARRAY_LENGTH(${v8ClassName}Consts), isolate);
@@ -4292,6 +4537,7 @@ END
}
# Special cases
+ ### TODO
if ($interfaceName eq "Window") {
$code .= <<END;
@@ -4304,12 +4550,14 @@ END
instance->SetAccessCheckCallbacks(V8Window::namedSecurityCheckCustom, V8Window::indexedSecurityCheckCustom, v8::External::New(&V8Window::info), false);
END
}
+ ### TODO
if ($interfaceName eq "HTMLDocument" or $interfaceName eq "DedicatedWorkerGlobalScope" or $interfaceName eq "SharedWorkerGlobalScope") {
$code .= <<END;
desc->SetHiddenPrototype(true);
END
}
+ ### DONE
$code .= <<END;
// Custom toString template
@@ -4337,6 +4585,7 @@ v8::Handle<v8::FunctionTemplate> ${v8ClassName}::GetTemplate(v8::Isolate* isolat
}
END
+ ### DONE
$implementation{nameSpaceWebCore}->add(<<END);
bool ${v8ClassName}::HasInstance(v8::Handle<v8::Value> value, v8::Isolate* isolate, WrapperWorldType currentWorldType)
{
@@ -4344,6 +4593,7 @@ bool ${v8ClassName}::HasInstance(v8::Handle<v8::Value> value, v8::Isolate* isola
}
END
+ ### DONE
$implementation{nameSpaceWebCore}->add(<<END);
bool ${v8ClassName}::HasInstanceInAnyWorld(v8::Handle<v8::Value> value, v8::Isolate* isolate)
{
@@ -4354,6 +4604,7 @@ bool ${v8ClassName}::HasInstanceInAnyWorld(v8::Handle<v8::Value> value, v8::Isol
END
+ ### TODO
if (@enabledPerContextAttributes) {
my $code = "";
$code .= <<END;
@@ -4389,6 +4640,7 @@ END
$implementation{nameSpaceWebCore}->add($code);
}
+ ### TODO
if (@enabledPerContextFunctions) {
my $code = "";
$code .= <<END;
@@ -4424,6 +4676,7 @@ END
$implementation{nameSpaceWebCore}->add($code);
}
+ ### DONE
if (InheritsExtendedAttribute($interface, "ActiveDOMObject")) {
# MessagePort is handled like an active dom object even though it doesn't inherit
# from ActiveDOMObject, so don't try to cast it to ActiveDOMObject.
@@ -4437,6 +4690,7 @@ ActiveDOMObject* ${v8ClassName}::toActiveDOMObject(v8::Handle<v8::Object> object
END
}
+ ### DONE
if (InheritsInterface($interface, "EventTarget")) {
$implementation{nameSpaceWebCore}->add(<<END);
EventTarget* ${v8ClassName}::toEventTarget(v8::Handle<v8::Object> object)
@@ -4447,6 +4701,7 @@ EventTarget* ${v8ClassName}::toEventTarget(v8::Handle<v8::Object> object)
END
}
+ ### TODO
if ($interfaceName eq "Window") {
$implementation{nameSpaceWebCore}->add(<<END);
v8::Handle<v8::ObjectTemplate> V8Window::GetShadowObjectTemplate(v8::Isolate* isolate, WrapperWorldType currentWorldType)
@@ -4537,6 +4792,8 @@ sub GenerateCallbackHeader
END
+#print "[CallbackHeader]", $interface->name, "\n";
+
# Functions
my $numFunctions = @{$interface->functions};
if ($numFunctions > 0) {
@@ -4550,6 +4807,7 @@ END
}
my @params = @{$function->parameters};
foreach my $param (@params) {
+ print "[gch]", $param->name, "\n" if $interface->name eq "MIDISuccessCallback";
push(@args, GetNativeTypeForCallbacks($param->type) . " " . $param->name);
}
$code .= join(", ", @args);
@@ -4599,6 +4857,8 @@ ${v8ClassName}::~${v8ClassName}()
END
+#print "[CallbackImp]", $interface->name, "\n";
+
# Functions
my $numFunctions = @{$interface->functions};
if ($numFunctions > 0) {
@@ -4819,10 +5079,14 @@ sub GetNamespaceForInterface
return "WebCore";
}
+# get_function_call_parameter and macro function_call in python
sub GenerateFunctionCallString
{
my $function = shift;
my $numberOfParameters = shift;
+ if ($numberOfParameters != @{$function->parameters}) {
+# print "NEVER\n";
+ }
my $indent = shift;
my $interface = shift;
my $forMainWorldSuffix = shift;
@@ -4844,24 +5108,29 @@ sub GenerateFunctionCallString
my $functionName;
my $implementedBy = $function->extendedAttributes->{"ImplementedBy"};
if ($implementedBy) {
+ ### DONE
my $implementedByImplName = GetImplNameFromImplementedBy($implementedBy);
AddToImplIncludes(HeaderFilesForInterface($implementedBy, $implementedByImplName));
unshift(@arguments, "imp") if !$function->isStatic;
$functionName = "${implementedByImplName}::${name}";
} elsif ($function->isStatic) {
+ ### DONE
$functionName = "${implClassName}::${name}";
} else {
+ ### DONE
$functionName = "imp->${name}";
}
+ ### DONE
my $callWith = $function->extendedAttributes->{"CallWith"};
my ($callWithArgs, $subCode) = GenerateCallWith($callWith, $indent, 1, $function);
$code .= $subCode;
unshift(@arguments, @$callWithArgs);
- $index += @$callWithArgs;
- $numberOfParameters += @$callWithArgs;
+# $index += @$callWithArgs;
+# $numberOfParameters += @$callWithArgs;
foreach my $parameter (@{$function->parameters}) {
+ ### DONE
if ($index eq $numberOfParameters) {
last;
}
@@ -4869,10 +5138,13 @@ sub GenerateFunctionCallString
my $paramType = $parameter->type;
if ($replacements{$paramName}) {
+ ### DONE
push @arguments, $replacements{$paramName};
} elsif ($parameter->type eq "NodeFilter" || $parameter->type eq "XPathNSResolver") {
+ ### DONE
push @arguments, "$paramName.get()";
} elsif (IsSVGTypeNeedingTearOff($parameter->type) and not $interfaceName =~ /List$/) {
+ ### DONE
AddToImplIncludes("core/dom/ExceptionCode.h");
push @arguments, "$paramName->propertyReference()";
$code .= $indent . "if (!$paramName) {\n";
@@ -4880,41 +5152,55 @@ sub GenerateFunctionCallString
$code .= $indent . " return;\n";
$code .= $indent . "}\n";
} elsif ($parameter->type eq "SVGMatrix" and $interfaceName eq "SVGTransformList") {
+ ### DONE
push @arguments, "$paramName.get()";
} else {
+ ### main
push @arguments, $paramName;
}
$index++;
}
+ ### DONE
if ($function->extendedAttributes->{"RaisesException"}) {
push @arguments, "es";
}
+ ### DONE
+ ### function_call_expression in python
my $functionString = "$functionName(" . join(", ", @arguments) . ")";
+ ### DONE native_value_expression in python
my $return = "result";
my $returnIsRef = IsRefPtrType($returnType);
if ($returnType eq "void") {
+ ### DONE
+ ### function_call_statement in python generator
$code .= $indent . "$functionString;\n";
} elsif (ExtendedAttributeContains($callWith, "ScriptState") or $function->extendedAttributes->{"RaisesException"}) {
+ ### DONE
+ ### function_call_statement in python generator
$code .= $indent . $nativeReturnType . " result = $functionString;\n";
} else {
+ ### DONE
# Can inline the function call into the return statement to avoid overhead of using a Ref<> temporary
$return = $functionString;
$returnIsRef = 0;
+ ### TODO
if ($interfaceName eq "SVGTransformList" and IsRefPtrType($returnType)) {
$return = "WTF::getPtr(" . $return . ")";
}
}
+ ### DONE
if ($function->extendedAttributes->{"RaisesException"}) {
$code .= $indent . "if (es.throwIfNeeded())\n";
$code .= $indent . " return;\n";
}
+ ### DONE
if (ExtendedAttributeContains($callWith, "ScriptState")) {
$code .= $indent . "if (state.hadException()) {\n";
$code .= $indent . " v8::Local<v8::Value> exception = state.exception();\n";
@@ -4924,6 +5210,7 @@ sub GenerateFunctionCallString
$code .= $indent . "}\n";
}
+ ### TODO
if ($isSVGTearOffType) {
AddToImplIncludes("V8$returnType.h");
AddToImplIncludes("core/svg/properties/SVGPropertyTearOff.h");
@@ -4942,21 +5229,26 @@ sub GenerateFunctionCallString
return $code;
}
+ ### TODO
# If the implementing class is a POD type, commit changes
if (IsSVGTypeNeedingTearOff($interfaceName) and not $interfaceName =~ /List$/) {
$code .= $indent . "wrapper->commitChange();\n";
}
+ ### DONE
$return .= ".release()" if ($returnIsRef);
my $nativeValue;
# FIXME: Update for all ScriptWrappables.
if (IsDOMNodeType($interfaceName)) {
+ ### DONE
$nativeValue = NativeToJSValue($function->type, $function->extendedAttributes, $return, $indent, "", "args.Holder()", "args.GetIsolate()", "args", "imp", $forMainWorldSuffix, "return");
} else {
+ ### DONE
$nativeValue = NativeToJSValue($function->type, $function->extendedAttributes, $return, $indent, "", "args.Holder()", "args.GetIsolate()", "args", 0, $forMainWorldSuffix, "return");
}
+ ### DONE
$code .= $nativeValue . "\n";
$code .= $indent . "return;\n";
@@ -4968,6 +5260,8 @@ sub GetNativeType
my $type = shift;
my $extendedAttributes = shift;
my $isParameter = shift;
+ my $isw = IsWrapperType($type) ? "WT":"";
+print "[GetNativeType] $type, $isParameter $isw\n";
my $svgNativeType = GetSVGTypeNeedingTearOff($type);
if ($svgNativeType) {
@@ -5007,6 +5301,7 @@ sub GetNativeType
return "String" if $type eq "DOMString" or IsEnumType($type);
+ ### DONE
return "Range::CompareHow" if $type eq "CompareHow";
return "DOMTimeStamp" if $type eq "DOMTimeStamp";
return "double" if $type eq "Date";
@@ -5027,6 +5322,9 @@ sub GetNativeType
# We need to check [ImplementedAs] extended attribute for wrapper types.
if (IsWrapperType($type)) {
+# print "GEHEHE ", $type, "\n";
+# use Carp qw(cluck);
+# cluck "HEY";
my $interface = ParseInterface($type);
my $implClassName = GetImplName($interface);
return $isParameter ? "${implClassName}*" : "RefPtr<${implClassName}>";
@@ -5048,6 +5346,10 @@ sub GetNativeType
sub GetNativeTypeForCallbacks
{
my $type = shift;
+ print "#####\n[GetNativeTypeForCallbacks] $type\n" if $type eq "DOMException";
+# print "#####\n[Callback] DOMString\n" if $type eq "DOMString";
+# print "#####\n[Callback] SerializedScriptValue\n" if $type eq "SerializedScriptValue";
+
return "const String&" if $type eq "DOMString";
return "PassRefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue";
@@ -5175,6 +5477,7 @@ sub JSValueToNative
return "V8${type}::HasInstance($value, $getIsolate, worldType($getIsolate)) ? V8${type}::toNative(v8::Handle<v8::Object>::Cast($value)) : 0";
}
+### DONE
sub CreateCustomSignature
{
my $function = shift;
@@ -5344,6 +5647,9 @@ sub NativeToJSValue
my $returnValueArg = shift || 0;
my $isReturnValue = $returnValueArg eq "return";
+ print " [NativeToJSValue]", $type, " ", $nativeValue, "\n";
+# if $type eq "AudioBuffer";
+
if (IsUnionType($type)) {
my $types = $type->unionMemberTypes;
my @codes = ();
@@ -5465,6 +5771,7 @@ sub NativeToJSValue
AddIncludesForType($type);
+ ### DONE
if ($type eq "SerializedScriptValue") {
my $returnValue = "$nativeValue ? $nativeValue->deserialize() : v8::Handle<v8::Value>(v8::Null($getIsolate))";
return "${indent}v8SetReturnValue(${getCallbackInfo}, $returnValue);" if $isReturnValue;
@@ -5589,7 +5896,7 @@ sub ForAllParents
{
my $interface = shift;
my $beforeRecursion = shift;
- my $afterRecursion = shift;
+ my $afterRecursion = shift; # nbarth: ?
my $recurse;
$recurse = sub {
@@ -5601,7 +5908,7 @@ sub ForAllParents
&$beforeRecursion($parentInterface) eq 'prune' and return;
}
&$recurse($parentInterface);
- &$afterRecursion($parentInterface) if $afterRecursion;
+ &$afterRecursion($parentInterface) if $afterRecursion; # nbarth: ?
}
};
@@ -5612,7 +5919,7 @@ sub FindSuperMethod
{
my ($interface, $functionName) = @_;
my $indexer;
- ForAllParents($interface, undef, sub {
+ ForAllParents($interface, undef, sub { # nbarth: (undef) ?
my $currentInterface = shift;
foreach my $function (@{$currentInterface->functions}) {
if ($function->name eq $functionName) {
@@ -5663,6 +5970,8 @@ sub ValidEnumValues
return @{$enumTypeHash{$type}};
}
+
+# merged with GetSVGTypeNeedingTearOff
sub IsSVGTypeNeedingTearOff
{
my $type = shift;
@@ -5671,6 +5980,7 @@ sub IsSVGTypeNeedingTearOff
return 0;
}
+### DONE
sub IsSVGTypeWithWritablePropertiesNeedingTearOff
{
my $type = shift;
@@ -5702,6 +6012,7 @@ sub IsRefPtrType
return 1;
}
+### DONE
sub GetSVGTypeNeedingTearOff
{
my $type = shift;
@@ -5710,6 +6021,7 @@ sub GetSVGTypeNeedingTearOff
return undef;
}
+### DONE
sub GetSVGWrappedTypeNeedingTearOff
{
my $type = shift;
@@ -5779,6 +6091,7 @@ sub FirstLetterToUpperCase
return $ret;
}
+### DONE
# URL becomes url, but SetURL becomes setURL.
sub ToMethodName
{
@@ -5822,6 +6135,7 @@ sub LinkOverloadedFunctions
}
}
+### DONE
sub AttributeNameForGetterAndSetter
{
my $attribute = shift;
@@ -5850,6 +6164,8 @@ sub ContentAttributeName
return "WebCore::${namespace}::${contentAttributeName}Attr";
}
+### get_attribute_getter_info in python
+### DONE
sub GetterExpression
{
my ($interfaceName, $attribute) = @_;
@@ -5968,6 +6284,7 @@ sub GenerateCompileTimeCheckForEnumsIfNeeded
return @checks;
}
+### call_with_contains in python
sub ExtendedAttributeContains
{
my $callWith = shift;
« no previous file with comments | « Source/bindings/scripts/code_generator_v8.py ('k') | Source/bindings/scripts/idl_compiler.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698