diff -r 91c993c1c4d0 js/src/jsatom.tbl --- a/js/src/jsatom.tbl Wed Aug 08 23:12:58 2012 +0200 +++ b/js/src/jsatom.tbl Wed Aug 08 23:13:53 2012 +0200 @@ -39,16 +39,17 @@ DEFINE_ATOM(apply, "apply") DEFINE_ATOM(arguments, "arguments") DEFINE_ATOM(arity, "arity") DEFINE_ATOM(BYTES_PER_ELEMENT, "BYTES_PER_ELEMENT") DEFINE_ATOM(call, "call") DEFINE_ATOM(callee, "callee") DEFINE_ATOM(caller, "caller") DEFINE_ATOM(classPrototype, "prototype") DEFINE_ATOM(constructor, "constructor") +DEFINE_ATOM(deleteProperty, "deleteProperty") DEFINE_ATOM(each, "each") DEFINE_ATOM(eval, "eval") DEFINE_ATOM(fileName, "fileName") DEFINE_ATOM(get, "get") DEFINE_ATOM(global, "global") DEFINE_ATOM(ignoreCase, "ignoreCase") DEFINE_ATOM(index, "index") DEFINE_ATOM(input, "input") diff -r 91c993c1c4d0 js/src/jsproxy.cpp --- a/js/src/jsproxy.cpp Wed Aug 08 23:12:58 2012 +0200 +++ b/js/src/jsproxy.cpp Wed Aug 08 23:13:53 2012 +0200 @@ -1714,23 +1714,77 @@ ScriptedDirectProxyHandler::getOwnProper ReportInvalidTrapResult(cx, proxy, ATOM(getOwnPropertyNames)); return false; } /* Steps g to n are shared */ return ArrayToIdVector(cx, proxy, target, trapResult, props, ATOM(getOwnPropertyNames)); } +/* [[Delete]](P, Throw) */ bool ScriptedDirectProxyHandler::delete_(JSContext *cx, JSObject *proxy_, jsid id_, bool *bp) { - JS_NOT_REACHED("not yet implemented"); + RootedObject proxy(cx, proxy_); + RootedId id(cx, id_); + + /* step 1 */ + RootedObject handler(cx, GetDirectProxyHandlerObject(proxy)); + + /* step 2 */ + RootedObject target(cx, GetProxyTargetObject(proxy)); + + /* step 3 */ + RootedValue trap(cx); + if (!GetTrap(cx, handler, ATOM(deleteProperty), &trap)) + return false; + + /* step 4 */ + if (trap.isUndefined()) + return DirectProxyHandler::delete_(cx, proxy_, id_, bp); + + /* step 5 */ + JSString *name = ToString(cx, IdToValue(id)); + if (!name) return false; + Value argv[] = { + ObjectValue(*target), + StringValue(name) + }; + RootedValue trapResult(cx); + if (!Invoke(cx, ObjectValue(*handler), trap, 2, argv, trapResult.address())) + return false; + + /* step 6 */ + JSBool success; + if (!JS_ValueToBoolean(cx, trapResult, &success)) + return false; + + /* step 7 */ + if (success) { + bool sealed; + if (!IsSealed(cx, target, id, &sealed)) + return false; + if (sealed) { + js_ReportValueError(cx, JSMSG_CANT_DELETE, JSDVG_IGNORE_STACK, IdToValue(id), NULL); + return false; + } + + *bp = true; + return true; + } + + /* step 8 */ + + // FIXME: API doesn't allow us to throw errors + *bp = false; + return true; } + bool ScriptedDirectProxyHandler::enumerate(JSContext *cx, JSObject *proxy, AutoIdVector &props) { JS_NOT_REACHED("not yet implemented"); return false; } bool