|
@@ -44,42 +44,48 @@ StringPrototype::StringPrototype()
|
|
|
return Value((i32) static_cast<const StringObject*>(this_object)->primitive_string()->string().length());
|
|
|
},
|
|
|
nullptr);
|
|
|
- put_native_function("charAt", [](Interpreter& interpreter) -> Value {
|
|
|
- auto* this_object = interpreter.this_value().to_object(interpreter.heap());
|
|
|
- if (!this_object)
|
|
|
- return {};
|
|
|
- i32 index = 0;
|
|
|
- if (!interpreter.call_frame().arguments.is_empty())
|
|
|
- index = interpreter.call_frame().arguments[0].to_i32();
|
|
|
- ASSERT(this_object->is_string_object());
|
|
|
- auto underlying_string = static_cast<const StringObject*>(this_object)->primitive_string()->string();
|
|
|
- if (index < 0 || index >= static_cast<i32>(underlying_string.length()))
|
|
|
- return js_string(this_object->heap(), String::empty());
|
|
|
- return js_string(this_object->heap(), underlying_string.substring(index, 1));
|
|
|
- });
|
|
|
- put_native_function("repeat", [](Interpreter& interpreter) -> Value {
|
|
|
- auto* this_object = interpreter.this_value().to_object(interpreter.heap());
|
|
|
- if (!this_object)
|
|
|
- return {};
|
|
|
- ASSERT(this_object->is_string_object());
|
|
|
- if (interpreter.call_frame().arguments.is_empty())
|
|
|
- return js_string(this_object->heap(), String::empty());
|
|
|
- i32 count = 0;
|
|
|
- count = interpreter.call_frame().arguments[0].to_i32();
|
|
|
- if (count < 0) {
|
|
|
- // FIXME: throw RangeError
|
|
|
- return js_undefined();
|
|
|
- }
|
|
|
- auto* string_object = static_cast<StringObject*>(this_object);
|
|
|
- StringBuilder builder;
|
|
|
- for (i32 i = 0; i < count; ++i)
|
|
|
- builder.append(string_object->primitive_string()->string());
|
|
|
- return js_string(this_object->heap(), builder.to_string());
|
|
|
- });
|
|
|
+ put_native_function("charAt", char_at);
|
|
|
+ put_native_function("repeat", repeat);
|
|
|
}
|
|
|
|
|
|
StringPrototype::~StringPrototype()
|
|
|
{
|
|
|
}
|
|
|
|
|
|
+Value StringPrototype::char_at(Interpreter& interpreter)
|
|
|
+{
|
|
|
+ auto* this_object = interpreter.this_value().to_object(interpreter.heap());
|
|
|
+ if (!this_object)
|
|
|
+ return {};
|
|
|
+ i32 index = 0;
|
|
|
+ if (!interpreter.call_frame().arguments.is_empty())
|
|
|
+ index = interpreter.call_frame().arguments[0].to_i32();
|
|
|
+ ASSERT(this_object->is_string_object());
|
|
|
+ auto underlying_string = static_cast<const StringObject*>(this_object)->primitive_string()->string();
|
|
|
+ if (index < 0 || index >= static_cast<i32>(underlying_string.length()))
|
|
|
+ return js_string(interpreter.heap(), String::empty());
|
|
|
+ return js_string(interpreter.heap(), underlying_string.substring(index, 1));
|
|
|
+}
|
|
|
+
|
|
|
+Value StringPrototype::repeat(Interpreter& interpreter)
|
|
|
+{
|
|
|
+ auto* this_object = interpreter.this_value().to_object(interpreter.heap());
|
|
|
+ if (!this_object)
|
|
|
+ return {};
|
|
|
+ ASSERT(this_object->is_string_object());
|
|
|
+ if (interpreter.call_frame().arguments.is_empty())
|
|
|
+ return js_string(interpreter.heap(), String::empty());
|
|
|
+ i32 count = 0;
|
|
|
+ count = interpreter.call_frame().arguments[0].to_i32();
|
|
|
+ if (count < 0) {
|
|
|
+ // FIXME: throw RangeError
|
|
|
+ return js_undefined();
|
|
|
+ }
|
|
|
+ auto* string_object = static_cast<StringObject*>(this_object);
|
|
|
+ StringBuilder builder;
|
|
|
+ for (i32 i = 0; i < count; ++i)
|
|
|
+ builder.append(string_object->primitive_string()->string());
|
|
|
+ return js_string(interpreter.heap(), builder.to_string());
|
|
|
+}
|
|
|
+
|
|
|
}
|