static ejsval _ejs_RegExp_prototype_toString (ejsval env, ejsval _this, uint32_t argc, ejsval *args) { EJSRegExp* re = (EJSRegExp*)EJSVAL_TO_OBJECT(_this); return _ejs_string_concatv (_ejs_atom_slash, re->pattern, _ejs_atom_slash, re->flags, _ejs_null); }
static EJS_NATIVE_FUNC(_ejs_Error_prototype_toString) { ejsval O = *_this; if (!EJSVAL_IS_OBJECT(O)) { _ejs_throw_nativeerror_utf8 (EJS_TYPE_ERROR, "Error.prototype.toString called on non-object"); } EJSObject *_thisobj = EJSVAL_TO_OBJECT(O); ejsval name = OP(_thisobj,Get)(O, _ejs_atom_name, O); if (EJSVAL_IS_NULL_OR_UNDEFINED(name)) name = _ejs_atom_Error; ejsval message = OP(_thisobj,Get)(O, _ejs_atom_message, O); if (EJSVAL_IS_NULL_OR_UNDEFINED(message)) return name; ejsval sep = _ejs_string_new_utf8(": "); return _ejs_string_concatv (name, sep, message, _ejs_null); }
static ejsval _ejs_Error_prototype_toString (ejsval env, ejsval _this, uint32_t argc, ejsval *args) { if (!EJSVAL_IS_OBJECT(_this)) { _ejs_throw_nativeerror_utf8 (EJS_TYPE_ERROR, "Error.prototype.toString called on non-object"); } EJSObject *_thisobj = EJSVAL_TO_OBJECT(_this); ejsval name = OP(_thisobj,Get)(_this, _ejs_atom_name, _this); if (EJSVAL_IS_NULL_OR_UNDEFINED(name)) name = _ejs_atom_Error; ejsval message = OP(_thisobj,Get)(_this, _ejs_atom_message, _this); if (EJSVAL_IS_NULL_OR_UNDEFINED(message)) return name; ejsval sep = _ejs_string_new_utf8(": "); return _ejs_string_concatv (name, sep, message, _ejs_null); }
// ECMA262: 19.4.3.2 Symbol.prototype.toString () static EJS_NATIVE_FUNC(_ejs_Symbol_prototype_toString) { // 1. Let s be the this value. ejsval s = *_this; EJSPrimSymbol* sym; // 2. If Type(s) is Symbol, then let sym be s. if (EJSVAL_IS_SYMBOL(s)) { sym = EJSVAL_TO_SYMBOL(s); } // 3. Else, else { // a. If s does not have a [[SymbolData]] internal slot, then throw a TypeError exception. if (!EJSVAL_IS_SYMBOL_OBJECT(s)) { _ejs_throw_nativeerror_utf8 (EJS_TYPE_ERROR, "Symbol.prototype.toString called with non-symbol this"); } // b. Let sym be the value of s’s [[SymbolData]] internal slot. sym = EJSVAL_TO_SYMBOL(EJSVAL_TO_SYMBOL_OBJECT(s)->primSymbol); } // 4. Let desc be the value of sym’s [[Description]] attribute. ejsval desc = sym->description; // 5. If desc is undefined, then let desc be the empty string. if (EJSVAL_IS_UNDEFINED(desc)) desc = _ejs_atom_empty; // 6. Assert: Type(desc) is String. // 7. Let result be the result of concatenating the strings "Symbol(", desc, and ")". ejsval result = _ejs_string_concatv (_ejs_atom_Symbol, _ejs_string_new_utf8("("), desc, _ejs_string_new_utf8(")"), _ejs_null); // 8. Return result. return result; }
ejsval _ejs_regexp_replace(ejsval str, ejsval search_re, ejsval replace) { EJSRegExp* re = (EJSRegExp*)EJSVAL_TO_OBJECT(search_re); pcre16_extra extra; memset (&extra, 0, sizeof(extra)); pcre16* code = (pcre16*)re->compiled_pattern; int capture_count; pcre16_fullinfo (code, NULL, PCRE_INFO_CAPTURECOUNT, &capture_count); int ovec_count = 3 * (1 + capture_count); int* ovec = malloc(sizeof(int) * ovec_count); int cur_off = 0; do { EJSPrimString *flat_str = _ejs_string_flatten (str); jschar *chars_str = flat_str->data.flat; int rv = pcre16_exec(code, &extra, chars_str, flat_str->length, cur_off, PCRE_NO_UTF16_CHECK, ovec, ovec_count); if (rv < 0) break; ejsval replaceval; if (EJSVAL_IS_FUNCTION(replace)) { ejsval substr_match = _ejs_string_new_substring (str, ovec[0], ovec[1] - ovec[0]); ejsval capture = _ejs_string_new_substring (str, ovec[2], ovec[3] - ovec[2]); _ejs_log ("substring match is %s\n", ucs2_to_utf8(_ejs_string_flatten(substr_match)->data.flat)); _ejs_log ("capture is %s\n", ucs2_to_utf8(_ejs_string_flatten(capture)->data.flat)); int argc = 3; ejsval args[3]; args[0] = substr_match; args[1] = capture; args[2] = _ejs_undefined; replaceval = ToString(_ejs_invoke_closure (replace, _ejs_undefined, argc, args)); } else { replaceval = ToString(replace); } if (ovec[0] == 0) { // we matched from the beginning of the string, so nothing from there to prepend str = _ejs_string_concat (replaceval, _ejs_string_new_substring (str, ovec[1], flat_str->length - ovec[1])); } else { str = _ejs_string_concatv (_ejs_string_new_substring (str, 0, ovec[0]), replaceval, _ejs_string_new_substring (str, ovec[1], flat_str->length - ovec[1]), _ejs_null); } cur_off = ovec[1]; // if the RegExp object was created without a 'g' flag, only replace the first match if (!re->global) break; } while (EJS_TRUE); free (ovec); return str; }