Skip to content

Commit 67f0460

Browse files
Lord-McSweeneyLord-McSweeney
Lord-McSweeney
authored andcommitted
core/avm1/avm2: Add AvmString::new_ascii_static and use it
1 parent 884563b commit 67f0460

18 files changed

+37
-34
lines changed

core/src/avm1/activation.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1008,7 +1008,7 @@ impl<'a, 'gc> Activation<'a, 'gc> {
10081008
// SWF19: "If A is zero, the result NaN, Infinity, or -Infinity is pushed to the stack in SWF 5 and later.
10091009
// In SWF 4, the result is the string #ERROR#."
10101010
let result: Value<'gc> = if a == 0.0 && self.swf_version() < 5 {
1011-
AvmString::new_utf8(self.gc(), "#ERROR#").into()
1011+
AvmString::new_ascii_static(self.gc(), b"#ERROR#").into()
10121012
} else {
10131013
(b / a).into()
10141014
};

core/src/avm1/globals/object.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,9 @@ fn to_string<'gc>(
116116
_args: &[Value<'gc>],
117117
) -> Result<Value<'gc>, Error<'gc>> {
118118
if this.as_executable().is_some() {
119-
Ok(AvmString::new_utf8(activation.gc(), "[type Function]").into())
119+
Ok(AvmString::new_ascii_static(activation.gc(), b"[type Function]").into())
120120
} else {
121-
Ok(AvmString::new_utf8(activation.gc(), "[object Object]").into())
121+
Ok(AvmString::new_ascii_static(activation.gc(), b"[object Object]").into())
122122
}
123123
}
124124

core/src/avm1/globals/system_ime.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ fn get_conversion_mode<'gc>(
4444
_this: Object<'gc>,
4545
_args: &[Value<'gc>],
4646
) -> Result<Value<'gc>, Error<'gc>> {
47-
Ok(AvmString::new_utf8(activation.gc(), "KOREAN").into())
47+
Ok(AvmString::new_ascii_static(activation.gc(), b"KOREAN").into())
4848
}
4949

5050
fn get_enabled<'gc>(

core/src/avm1/value.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -423,9 +423,9 @@ impl<'gc> Value<'gc> {
423423
Value::String(s) => s,
424424
_ => {
425425
if object.as_executable().is_some() {
426-
AvmString::new_utf8(activation.gc(), "[type Function]")
426+
AvmString::new_ascii_static(activation.gc(), b"[type Function]")
427427
} else {
428-
AvmString::new_utf8(activation.gc(), "[type Object]")
428+
AvmString::new_ascii_static(activation.gc(), b"[type Object]")
429429
}
430430
}
431431
}

core/src/avm2/domain.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ impl<'gc> Domain<'gc> {
290290
activation.gc(),
291291
&name[(start + 2)..(name.len() - 1)],
292292
));
293-
name = AvmString::new_utf8(activation.gc(), "__AS3__.vec::Vector");
293+
name = AvmString::new_ascii_static(activation.gc(), b"__AS3__.vec::Vector");
294294
}
295295
// FIXME - is this the correct api version?
296296
let api_version = activation.avm2().root_api_version;

core/src/avm2/globals/Date.as

-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ package {
44
public dynamic class Date {
55
public static const length:int = 7;
66

7-
private static const invalidDateStr:String = "Invalid Date";
8-
97
prototype.valueOf = function():* {
108
var d:Date = this;
119
return d.AS3::valueOf();

core/src/avm2/globals/class.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ pub fn create_c_class<'gc>(
103103
let gc_context = activation.gc();
104104
let namespaces = activation.avm2().namespaces;
105105

106-
let class_name = AvmString::new_utf8(gc_context, "Class$");
106+
let class_name = AvmString::new_ascii_static(gc_context, b"Class$");
107107
let class_c_class = Class::custom_new(
108108
QName::new(namespaces.public_all(), class_name),
109109
Some(class_i_class),

core/src/avm2/globals/date.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,7 @@ pub fn to_string<'gc>(
934934
)
935935
.into())
936936
} else {
937-
Ok(AvmString::new_utf8(activation.gc(), "Invalid Date").into())
937+
Ok(AvmString::new_ascii_static(activation.gc(), b"Invalid Date").into())
938938
}
939939
}
940940

@@ -955,7 +955,7 @@ pub fn to_utc_string<'gc>(
955955
)
956956
.into())
957957
} else {
958-
Ok(AvmString::new_utf8(activation.gc(), "Invalid Date").into())
958+
Ok(AvmString::new_ascii_static(activation.gc(), b"Invalid Date").into())
959959
}
960960
}
961961

@@ -979,7 +979,7 @@ pub fn to_locale_string<'gc>(
979979
)
980980
.into())
981981
} else {
982-
Ok(AvmString::new_utf8(activation.gc(), "Invalid Date").into())
982+
Ok(AvmString::new_ascii_static(activation.gc(), b"Invalid Date").into())
983983
}
984984
}
985985

@@ -999,7 +999,7 @@ pub fn to_time_string<'gc>(
999999
{
10001000
Ok(AvmString::new_utf8(activation.gc(), date.format("%T GMT%z").to_string()).into())
10011001
} else {
1002-
Ok(AvmString::new_utf8(activation.gc(), "Invalid Date").into())
1002+
Ok(AvmString::new_ascii_static(activation.gc(), b"Invalid Date").into())
10031003
}
10041004
}
10051005

@@ -1019,7 +1019,7 @@ pub fn to_locale_time_string<'gc>(
10191019
{
10201020
Ok(AvmString::new_utf8(activation.gc(), date.format("%T %p").to_string()).into())
10211021
} else {
1022-
Ok(AvmString::new_utf8(activation.gc(), "Invalid Date").into())
1022+
Ok(AvmString::new_ascii_static(activation.gc(), b"Invalid Date").into())
10231023
}
10241024
}
10251025

@@ -1039,7 +1039,7 @@ pub fn to_date_string<'gc>(
10391039
{
10401040
Ok(AvmString::new_utf8(activation.gc(), date.format("%a %b %-d %-Y").to_string()).into())
10411041
} else {
1042-
Ok(AvmString::new_utf8(activation.gc(), "Invalid Date").into())
1042+
Ok(AvmString::new_ascii_static(activation.gc(), b"Invalid Date").into())
10431043
}
10441044
}
10451045

core/src/avm2/globals/flash/ui/keyboard.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub fn get_physical_keyboard_type<'gc>(
3939
_args: &[Value<'gc>],
4040
) -> Result<Value<'gc>, Error<'gc>> {
4141
avm2_stub_getter!(activation, "flash.ui.Keyboard", "physicalKeyboardType");
42-
Ok(AvmString::new_utf8(activation.gc(), "alphanumeric").into())
42+
Ok(AvmString::new_ascii_static(activation.gc(), b"alphanumeric").into())
4343
}
4444

4545
pub fn is_accessible<'gc>(

core/src/avm2/globals/number.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ pub fn print_with_radix<'gc>(
136136

137137
if number.is_infinite() {
138138
if number < 0.0 {
139-
return Ok(AvmString::new_utf8(activation.gc(), "-Infinity"));
139+
return Ok(AvmString::new_ascii_static(activation.gc(), b"-Infinity"));
140140
} else if number > 0.0 {
141141
return Ok(istr!("Infinity"));
142142
}

core/src/avm2/globals/object.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ pub fn create_c_class<'gc>(
355355
let gc_context = activation.gc();
356356
let namespaces = activation.avm2().namespaces;
357357

358-
let class_name = AvmString::new_utf8(gc_context, "Object$");
358+
let class_name = AvmString::new_ascii_static(gc_context, b"Object$");
359359
let object_c_class = Class::custom_new(
360360
QName::new(namespaces.public_all(), class_name),
361361
Some(class_i_class),

core/src/avm2/globals/xml.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -866,17 +866,17 @@ pub fn node_kind<'gc>(
866866
let this = this.as_object().unwrap();
867867

868868
let xml = this.as_xml_object().unwrap();
869-
let name = match &*xml.node().kind() {
870-
E4XNodeKind::Text(_) => "text",
871-
E4XNodeKind::CData(_) => "text", // cdata pretends to be text here
872-
E4XNodeKind::Comment(_) => "comment",
873-
E4XNodeKind::ProcessingInstruction(_) => "processing-instruction",
874-
E4XNodeKind::Attribute(_) => "attribute",
875-
E4XNodeKind::Element { .. } => "element",
869+
let name: &'static [u8] = match &*xml.node().kind() {
870+
E4XNodeKind::Text(_) => b"text",
871+
E4XNodeKind::CData(_) => b"text", // cdata pretends to be text here
872+
E4XNodeKind::Comment(_) => b"comment",
873+
E4XNodeKind::ProcessingInstruction(_) => b"processing-instruction",
874+
E4XNodeKind::Attribute(_) => b"attribute",
875+
E4XNodeKind::Element { .. } => b"element",
876876
};
877877

878878
// FIXME should we intern these?
879-
Ok(AvmString::new_utf8(activation.gc(), name).into())
879+
Ok(AvmString::new_ascii_static(activation.gc(), name).into())
880880
}
881881

882882
pub fn append_child<'gc>(

core/src/avm2/namespace.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -349,8 +349,8 @@ impl<'gc> CommonNamespaces<'gc> {
349349
let empty_string = context.empty();
350350

351351
let as3_namespace_string =
352-
AvmString::new_utf8(context.gc(), "http://adobe.com/AS3/2006/builtin");
353-
let vector_namespace_string = AvmString::new_utf8(context.gc(), "__AS3__.vec");
352+
AvmString::new_ascii_static(context.gc(), b"http://adobe.com/AS3/2006/builtin");
353+
let vector_namespace_string = AvmString::new_ascii_static(context.gc(), b"__AS3__.vec");
354354

355355
Self {
356356
public_namespaces: std::array::from_fn(|val| {

core/src/backend/audio.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ impl<'gc> AudioManager<'gc> {
412412

413413
// Fire soundComplete event.
414414
if let Some(root) = context.stage.root_clip() {
415-
let method_name = AvmString::new_utf8(mc, "onSoundComplete");
415+
let method_name = AvmString::new_ascii_static(mc, b"onSoundComplete");
416416

417417
context.action_queue.queue_action(
418418
root,

core/src/context.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ impl<'gc> UpdateContext<'gc> {
422422
.get_version_string(activation.context.avm1);
423423
object.define_value(
424424
activation.gc(),
425-
AvmString::new_utf8(activation.gc(), "$version"),
425+
AvmString::new_ascii_static(activation.gc(), b"$version"),
426426
AvmString::new_utf8(activation.gc(), version_string).into(),
427427
Attribute::empty(),
428428
);

core/src/display_object/interactive.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -610,9 +610,9 @@ pub trait TInteractiveObject<'gc>:
610610
.unwrap_or(Avm1Value::Null);
611611

612612
let method_name = if focused {
613-
AvmString::new_utf8(context.gc(), "onSetFocus")
613+
AvmString::new_ascii_static(context.gc(), b"onSetFocus")
614614
} else {
615-
AvmString::new_utf8(context.gc(), "onKillFocus")
615+
AvmString::new_ascii_static(context.gc(), b"onKillFocus")
616616
};
617617

618618
Avm1::run_stack_frame_for_method(self_do, object, method_name, &[other], context);

core/src/loader.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2531,7 +2531,7 @@ impl<'gc> Loader<'gc> {
25312531
match vm_data {
25322532
MovieLoaderVMData::Avm1 { broadcaster } => {
25332533
if let Some(broadcaster) = broadcaster {
2534-
let error_message = AvmString::new_utf8(uc.gc(), "LoadNeverCompleted");
2534+
let error_message = AvmString::new_ascii_static(uc.gc(), b"LoadNeverCompleted");
25352535

25362536
Avm1::run_stack_frame_for_method(
25372537
clip,

core/src/string/avm_string.rs

+5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ impl<'gc> AvmString<'gc> {
2121
}
2222
}
2323

24+
pub fn new_ascii_static(gc_context: &Mutation<'gc>, bytes: &'static [u8]) -> Self {
25+
let repr = AvmStringRepr::from_raw_static(WStr::from_units(bytes), false);
26+
Self(Gc::new(gc_context, repr))
27+
}
28+
2429
pub fn new_utf8<'s, S: Into<Cow<'s, str>>>(gc_context: &Mutation<'gc>, string: S) -> Self {
2530
let buf = match string.into() {
2631
Cow::Owned(utf8) => WString::from_utf8_owned(utf8),

0 commit comments

Comments
 (0)